00001
00002 #include <basix/double.hpp>
00003 #include <basix/int.hpp>
00004 #include <basix/vector.hpp>
00005 #include <basix/port.hpp>
00006 #include <basix/literal.hpp>
00007 #include <numerix/integer.hpp>
00008 #include <numerix/modular.hpp>
00009 #include <numerix/modular_integer.hpp>
00010 #include <numerix/rational.hpp>
00011 #include <numerix/floating.hpp>
00012 #include <numerix/complex.hpp>
00013 #include <numerix/complex_double.hpp>
00014 #include <algebramix/vector_unrolled.hpp>
00015 #include <algebramix/vector_simd.hpp>
00016 #include <algebramix/vector_modular.hpp>
00017 #include <analyziz/vector_double.hpp>
00018 #include <analyziz/vector_floating.hpp>
00019 #include <basix/compound.hpp>
00020 #include <basix/mmx_syntax.hpp>
00021 #include <basix/lisp_syntax.hpp>
00022 #include <basix/cpp_syntax.hpp>
00023 #include <basix/syntactic.hpp>
00024 #include <algebramix/polynomial.hpp>
00025 #include <algebramix/polynomial_polynomial.hpp>
00026 #include <algebramix/polynomial_integer.hpp>
00027 #include <algebramix/polynomial_rational.hpp>
00028 #include <algebramix/polynomial_modular.hpp>
00029 #include <algebramix/polynomial_modular_integer.hpp>
00030 #include <algebramix/polynomial_complex.hpp>
00031 #include <algebramix/polynomial_schonhage.hpp>
00032 #include <analyziz/polynomial_numeric.hpp>
00033 #include <analyziz/polynomial_double.hpp>
00034 #include <analyziz/polynomial_floating.hpp>
00035 #include <analyziz/solver.hpp>
00036 #include <analyziz/solver_aberth.hpp>
00037 #include <analyziz/solver_floating.hpp>
00038 #include <algebramix/series.hpp>
00039 #include <algebramix/series_elementary.hpp>
00040 #include <algebramix/series_integer.hpp>
00041 #include <algebramix/series_rational.hpp>
00042 #include <algebramix/series_modular_integer.hpp>
00043 #include <algebramix/series_complex.hpp>
00044 #include <analyziz/series_double.hpp>
00045 #include <analyziz/series_floating.hpp>
00046 #include <continewz/analytic_vector.hpp>
00047 #include <continewz/analytic_heuristic.hpp>
00048 #include <continewz/analytic_sugar.hpp>
00049 #include <basix/alias.hpp>
00050 #include <basix/tuple.hpp>
00051 #include <basix/routine.hpp>
00052 #include <basix/glue.hpp>
00053
00054 #define int_literal(x) as_int (as_string (x))
00055 #define is_generic_literal is<literal>
00056 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00057 #define gen_literal_access(f,v) access (as<generic> (f), v)
00058 #define double_literal(x) as_double (as_string (x))
00059 #define is_generic_compound is<compound>
00060 #define compound_arguments(x) cdr (as_vector (x))
00061 #define gen_compound_apply(f,v) gen (as<generic> (f), v)
00062 namespace mmx {
00063 template<typename C> polynomial<C>
00064 polynomial_reverse (const vector<C>& v) {
00065 return polynomial<C> (reverse (v)); }
00066
00067 template<typename C> polynomial<modular<modulus<C>, modular_local> >
00068 as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) {
00069 modular<modulus<C>, modular_local>::set_modulus (p);
00070 return as<polynomial<modular<modulus<C>, modular_local> > > (f); }
00071
00072 template<typename C> vector<generic>
00073 wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) {
00074 return as<vector<generic> > (subresultants (f, g)); }
00075
00076 }
00077 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE }
00078
00079 namespace mmx {
00080 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00081 GLUE_1 (const tuple<mmx_floating> &arg_1) {
00082 return analytic_complex (as_vector (arg_1));
00083 }
00084
00085 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00086 GLUE_2 (const tuple<complex<mmx_floating> > &arg_1) {
00087 return make_mmx_analytic (as_vector (arg_1));
00088 }
00089
00090 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00091 GLUE_3 (const complex<mmx_floating> &arg_1) {
00092 return make_mmx_analytic (arg_1);
00093 }
00094
00095 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00096 GLUE_4 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00097 return fast_eval (arg_1);
00098 }
00099
00100 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00101 GLUE_5 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00102 return cache_last (arg_1);
00103 }
00104
00105 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00106 GLUE_6 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00107 return rough (arg_1);
00108 }
00109
00110 static complex<mmx_floating>
00111 GLUE_7 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const int &arg_2) {
00112 return arg_1[arg_2];
00113 }
00114
00115 static mmx_floating
00116 GLUE_8 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00117 return radius_bound (arg_1);
00118 }
00119
00120 static mmx_floating
00121 GLUE_9 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_floating &arg_2) {
00122 return upper_bound (arg_1, arg_2);
00123 }
00124
00125 static mmx_floating
00126 GLUE_10 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_floating &arg_2) {
00127 return lower_bound (arg_1, arg_2);
00128 }
00129
00130 static mmx_floating
00131 GLUE_11 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_floating &arg_2, const int &arg_3) {
00132 return head_bound (arg_1, arg_2, arg_3);
00133 }
00134
00135 static mmx_floating
00136 GLUE_12 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_floating &arg_2, const int &arg_3) {
00137 return tail_bound (arg_1, arg_2, arg_3);
00138 }
00139
00140 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00141 GLUE_13 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00142 return radial_move (arg_1, arg_2);
00143 }
00144
00145 static complex<mmx_floating>
00146 GLUE_14 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00147 return radial_eval (arg_1, arg_2);
00148 }
00149
00150 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00151 GLUE_15 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00152 return move (arg_1, arg_2);
00153 }
00154
00155 static complex<mmx_floating>
00156 GLUE_16 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00157 return eval (arg_1, arg_2);
00158 }
00159
00160 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00161 GLUE_17 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00162 return -arg_1;
00163 }
00164
00165 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00166 GLUE_18 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00167 return square (arg_1);
00168 }
00169
00170 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00171 GLUE_19 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00172 return arg_1 + arg_2;
00173 }
00174
00175 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00176 GLUE_20 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00177 return arg_1 - arg_2;
00178 }
00179
00180 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00181 GLUE_21 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00182 return arg_1 * arg_2;
00183 }
00184
00185 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00186 GLUE_22 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00187 return arg_1 / arg_2;
00188 }
00189
00190 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00191 GLUE_23 (const complex<mmx_floating> &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00192 return arg_1 + arg_2;
00193 }
00194
00195 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00196 GLUE_24 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00197 return arg_1 + arg_2;
00198 }
00199
00200 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00201 GLUE_25 (const complex<mmx_floating> &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00202 return arg_1 - arg_2;
00203 }
00204
00205 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00206 GLUE_26 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00207 return arg_1 - arg_2;
00208 }
00209
00210 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00211 GLUE_27 (const complex<mmx_floating> &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00212 return arg_1 * arg_2;
00213 }
00214
00215 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00216 GLUE_28 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00217 return arg_1 * arg_2;
00218 }
00219
00220 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00221 GLUE_29 (const complex<mmx_floating> &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00222 return arg_1 / arg_2;
00223 }
00224
00225 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00226 GLUE_30 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const complex<mmx_floating> &arg_2) {
00227 return arg_1 / arg_2;
00228 }
00229
00230 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00231 GLUE_31 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00232 return derive (arg_1);
00233 }
00234
00235 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00236 GLUE_32 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00237 return xderive (arg_1);
00238 }
00239
00240 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00241 GLUE_33 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00242 return integrate (arg_1);
00243 }
00244
00245 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00246 GLUE_34 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00247 return compose (arg_1, arg_2);
00248 }
00249
00250 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00251 GLUE_35 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00252 return reverse (arg_1);
00253 }
00254
00255 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00256 GLUE_36 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00257 return sqrt (arg_1);
00258 }
00259
00260 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00261 GLUE_37 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00262 return exp (arg_1);
00263 }
00264
00265 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00266 GLUE_38 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00267 return log (arg_1);
00268 }
00269
00270 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00271 GLUE_39 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_2) {
00272 return pow (arg_1, arg_2);
00273 }
00274
00275 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00276 GLUE_40 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00277 return cos (arg_1);
00278 }
00279
00280 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00281 GLUE_41 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00282 return sin (arg_1);
00283 }
00284
00285 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00286 GLUE_42 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00287 return tan (arg_1);
00288 }
00289
00290 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00291 GLUE_43 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00292 return acos (arg_1);
00293 }
00294
00295 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00296 GLUE_44 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00297 return asin (arg_1);
00298 }
00299
00300 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00301 GLUE_45 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1) {
00302 return atan (arg_1);
00303 }
00304
00305 static vector<generic>
00306 GLUE_46 (const routine &arg_1, const vector<generic> &arg_2) {
00307 return gen_fixed_point_vector_analytic (arg_1, arg_2);
00308 }
00309
00310 static vector<generic>
00311 GLUE_47 (const routine &arg_1, const vector<generic> &arg_2) {
00312 return gen_integrate_vector_analytic (arg_1, arg_2);
00313 }
00314
00315 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00316 GLUE_48 (const routine &arg_1, const complex<mmx_floating> &arg_2) {
00317 return fixed_point_analytic (arg_1, arg_2);
00318 }
00319
00320 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00321 GLUE_49 (const routine &arg_1, const complex<mmx_floating> &arg_2) {
00322 return integrate_analytic (arg_1, arg_2);
00323 }
00324
00325 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00326 GLUE_50 (const polynomial<complex<mmx_floating> > &arg_1) {
00327 return make_mmx_analytic (arg_1);
00328 }
00329
00330 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00331 GLUE_51 (const polynomial<complex<mmx_floating> > &arg_1) {
00332 return std_heuristic (arg_1);
00333 }
00334
00335 static polynomial<complex<mmx_floating> >
00336 GLUE_52 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const int &arg_2, const int &arg_3) {
00337 return range (arg_1, arg_2, arg_3);
00338 }
00339
00340 static mmx_analytic(mmx_floating, complex<mmx_floating> )
00341 GLUE_53 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const vector<complex<mmx_floating> > &arg_2) {
00342 return move (arg_1, arg_2);
00343 }
00344
00345 static complex<mmx_floating>
00346 GLUE_54 (const mmx_analytic(mmx_floating, complex<mmx_floating> ) &arg_1, const vector<complex<mmx_floating> > &arg_2) {
00347 return eval (arg_1, arg_2);
00348 }
00349
00350 static vector<generic>
00351 GLUE_55 (const routine &arg_1, const vector<complex<mmx_floating> > &arg_2) {
00352 return gen_fixed_point_vector_analytic (arg_1, arg_2);
00353 }
00354
00355 static vector<generic>
00356 GLUE_56 (const routine &arg_1, const vector<complex<mmx_floating> > &arg_2) {
00357 return gen_integrate_vector_analytic (arg_1, arg_2);
00358 }
00359
00360 void
00361 glue_analytic_floating () {
00362 static bool done = false;
00363 if (done) return;
00364 done = true;
00365 call_glue (string ("glue_polynomial_floating"));
00366 static alias<double> mmx_radius_ratio_alias = global_alias (((double&) mmx_radius_ratio));
00367 define_constant<alias<double> > ("radius_ratio", mmx_radius_ratio_alias);
00368 static alias<double> mmx_order_ratio_alias = global_alias (((double&) mmx_order_ratio));
00369 define_constant<alias<double> > ("order_ratio", mmx_order_ratio_alias);
00370 define_type<mmx_analytic(mmx_floating, complex<mmx_floating> ) > (gen (lit ("Analytic"), lit ("Floating"), gen (lit ("Complex"), lit ("Floating"))));
00371 define ("analytic", GLUE_1);
00372 define ("analytic", GLUE_2);
00373 define_converter ("upgrade", GLUE_3, PENALTY_INCLUSION);
00374 define ("fast_eval", GLUE_4);
00375 define ("cache_last", GLUE_5);
00376 define ("rough", GLUE_6);
00377 define (".[]", GLUE_7);
00378 define ("radius_bound", GLUE_8);
00379 define ("upper_bound", GLUE_9);
00380 define ("lower_bound", GLUE_10);
00381 define ("head_bound", GLUE_11);
00382 define ("tail_bound", GLUE_12);
00383 define ("#", GLUE_13);
00384 define (".()", GLUE_14);
00385 define ("move", GLUE_15);
00386 define ("eval", GLUE_16);
00387 define ("-", GLUE_17);
00388 define ("square", GLUE_18);
00389 define ("+", GLUE_19);
00390 define ("-", GLUE_20);
00391 define ("*", GLUE_21);
00392 define ("/", GLUE_22);
00393 define ("+", GLUE_23);
00394 define ("+", GLUE_24);
00395 define ("-", GLUE_25);
00396 define ("-", GLUE_26);
00397 define ("*", GLUE_27);
00398 define ("*", GLUE_28);
00399 define ("/", GLUE_29);
00400 define ("/", GLUE_30);
00401 define ("derive", GLUE_31);
00402 define ("xderive", GLUE_32);
00403 define ("integrate", GLUE_33);
00404 define ("@", GLUE_34);
00405 define ("reverse", GLUE_35);
00406 define ("sqrt", GLUE_36);
00407 define ("exp", GLUE_37);
00408 define ("log", GLUE_38);
00409 define ("^", GLUE_39);
00410 define ("cos", GLUE_40);
00411 define ("sin", GLUE_41);
00412 define ("tan", GLUE_42);
00413 define ("arccos", GLUE_43);
00414 define ("arcsin", GLUE_44);
00415 define ("arctan", GLUE_45);
00416 define ("fixed_point_analytic", GLUE_46);
00417 define ("integrate_analytic", GLUE_47);
00418 define ("fixed_point_analytic", GLUE_48);
00419 define ("integrate_analytic", GLUE_49);
00420 define_converter ("upgrade", GLUE_50, PENALTY_INCLUSION);
00421 define ("heuristic", GLUE_51);
00422 define (".[]", GLUE_52);
00423 define ("#", GLUE_53);
00424 define (".()", GLUE_54);
00425 define ("fixed_point_analytic", GLUE_55);
00426 define ("integrate_analytic", GLUE_56);
00427 }
00428 }