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