00001 
00002 #include <basix/int.hpp>
00003 #include <basix/vector.hpp>
00004 #include <basix/port.hpp>
00005 #include <basix/literal.hpp>
00006 #include <numerix/integer.hpp>
00007 #include <numerix/modular.hpp>
00008 #include <numerix/modular_integer.hpp>
00009 #include <numerix/rational.hpp>
00010 #include <numerix/floating.hpp>
00011 #include <basix/double.hpp>
00012 #include <numerix/complex.hpp>
00013 #include <numerix/complex_double.hpp>
00014 #include <numerix/ball.hpp>
00015 #include <numerix/ball_complex.hpp>
00016 #include <algebramix/vector_unrolled.hpp>
00017 #include <algebramix/vector_simd.hpp>
00018 #include <algebramix/vector_modular.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 <algebramix/algebraic.hpp>
00033 #include <algebramix/algebraic_number.hpp>
00034 #include <basix/glue.hpp>
00035 
00036 #define int_literal(x) as_int (as_string (x))
00037 #define is_generic_literal is<literal>
00038 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00039 #define gen_literal_access(f,v) access (as<generic> (f), v)
00040 #define double_literal(x) as_double (as_string (x))
00041 #define is_generic_compound is<compound>
00042 #define compound_arguments(x) cdr (as_vector (x))
00043 #define gen_compound_apply(f,v) gen (as<generic> (f), v)
00044 namespace mmx {
00045     template<typename C> polynomial<C>
00046     polynomial_reverse (const vector<C>& v) {
00047       return polynomial<C> (reverse (v)); }
00048 
00049     template<typename C> polynomial<modular<modulus<C>, modular_local> >
00050     as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) {
00051       modular<modulus<C>, modular_local>::set_modulus (p);
00052       return as<polynomial<modular<modulus<C>, modular_local> > > (f); }
00053 
00054     template<typename C> vector<generic>
00055     wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) {
00056       return as<vector<generic> > (subresultants (f, g)); }
00057 
00058   }
00059 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE }
00060 
00061 namespace mmx {
00062   static algebraic_real
00063   GLUE_1 (const rational &arg_1) {
00064     return algebraic_real (arg_1);
00065   }
00066   
00067   static mmx_floating
00068   GLUE_2 (const algebraic_real &arg_1) {
00069     return as_floating (arg_1);
00070   }
00071   
00072   static algebraic_real
00073   GLUE_3 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00074     return lcommon (arg_1, arg_2);
00075   }
00076   
00077   static algebraic_real
00078   GLUE_4 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00079     return rcommon (arg_1, arg_2);
00080   }
00081   
00082   static polynomial<rational>
00083   GLUE_5 (const algebraic_real &arg_1) {
00084     return annihilator (arg_1);
00085   }
00086   
00087   static algebraic_real
00088   GLUE_6 (const algebraic_real &arg_1) {
00089     return normalize (arg_1);
00090   }
00091   
00092   static algebraic_real
00093   GLUE_7 (const algebraic_real &arg_1) {
00094     return -arg_1;
00095   }
00096   
00097   static algebraic_real
00098   GLUE_8 (const algebraic_real &arg_1) {
00099     return square (arg_1);
00100   }
00101   
00102   static algebraic_real
00103   GLUE_9 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00104     return arg_1 + arg_2;
00105   }
00106   
00107   static algebraic_real
00108   GLUE_10 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00109     return arg_1 - arg_2;
00110   }
00111   
00112   static algebraic_real
00113   GLUE_11 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00114     return arg_1 * arg_2;
00115   }
00116   
00117   static algebraic_real
00118   GLUE_12 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00119     return arg_1 / arg_2;
00120   }
00121   
00122   static algebraic_real
00123   GLUE_13 (const rational &arg_1, const algebraic_real &arg_2) {
00124     return arg_1 + arg_2;
00125   }
00126   
00127   static algebraic_real
00128   GLUE_14 (const algebraic_real &arg_1, const rational &arg_2) {
00129     return arg_1 + arg_2;
00130   }
00131   
00132   static algebraic_real
00133   GLUE_15 (const rational &arg_1, const algebraic_real &arg_2) {
00134     return arg_1 - arg_2;
00135   }
00136   
00137   static algebraic_real
00138   GLUE_16 (const algebraic_real &arg_1, const rational &arg_2) {
00139     return arg_1 - arg_2;
00140   }
00141   
00142   static algebraic_real
00143   GLUE_17 (const rational &arg_1, const algebraic_real &arg_2) {
00144     return arg_1 * arg_2;
00145   }
00146   
00147   static algebraic_real
00148   GLUE_18 (const algebraic_real &arg_1, const rational &arg_2) {
00149     return arg_1 * arg_2;
00150   }
00151   
00152   static algebraic_real
00153   GLUE_19 (const rational &arg_1, const algebraic_real &arg_2) {
00154     return arg_1 / arg_2;
00155   }
00156   
00157   static algebraic_real
00158   GLUE_20 (const algebraic_real &arg_1, const rational &arg_2) {
00159     return arg_1 / arg_2;
00160   }
00161   
00162   static algebraic_real
00163   GLUE_21 (const algebraic_real &arg_1) {
00164     return sqrt (arg_1);
00165   }
00166   
00167   static algebraic_real
00168   GLUE_22 (const algebraic_real &arg_1, const int &arg_2) {
00169     return root (arg_1, arg_2);
00170   }
00171   
00172   static int
00173   GLUE_23 (const algebraic_real &arg_1) {
00174     return sign (arg_1);
00175   }
00176   
00177   static bool
00178   GLUE_24 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00179     return arg_1 == arg_2;
00180   }
00181   
00182   static bool
00183   GLUE_25 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00184     return arg_1 != arg_2;
00185   }
00186   
00187   static bool
00188   GLUE_26 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00189     return arg_1 < arg_2;
00190   }
00191   
00192   static bool
00193   GLUE_27 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00194     return arg_1 <= arg_2;
00195   }
00196   
00197   static bool
00198   GLUE_28 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00199     return arg_1 > arg_2;
00200   }
00201   
00202   static bool
00203   GLUE_29 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00204     return arg_1 >= arg_2;
00205   }
00206   
00207   static bool
00208   GLUE_30 (const algebraic_real &arg_1, const rational &arg_2) {
00209     return arg_1 == arg_2;
00210   }
00211   
00212   static bool
00213   GLUE_31 (const algebraic_real &arg_1, const rational &arg_2) {
00214     return arg_1 != arg_2;
00215   }
00216   
00217   static bool
00218   GLUE_32 (const algebraic_real &arg_1, const rational &arg_2) {
00219     return arg_1 < arg_2;
00220   }
00221   
00222   static bool
00223   GLUE_33 (const algebraic_real &arg_1, const rational &arg_2) {
00224     return arg_1 <= arg_2;
00225   }
00226   
00227   static bool
00228   GLUE_34 (const algebraic_real &arg_1, const rational &arg_2) {
00229     return arg_1 > arg_2;
00230   }
00231   
00232   static bool
00233   GLUE_35 (const algebraic_real &arg_1, const rational &arg_2) {
00234     return arg_1 >= arg_2;
00235   }
00236   
00237   static bool
00238   GLUE_36 (const rational &arg_1, const algebraic_real &arg_2) {
00239     return arg_1 == arg_2;
00240   }
00241   
00242   static bool
00243   GLUE_37 (const rational &arg_1, const algebraic_real &arg_2) {
00244     return arg_1 != arg_2;
00245   }
00246   
00247   static bool
00248   GLUE_38 (const rational &arg_1, const algebraic_real &arg_2) {
00249     return arg_1 < arg_2;
00250   }
00251   
00252   static bool
00253   GLUE_39 (const rational &arg_1, const algebraic_real &arg_2) {
00254     return arg_1 <= arg_2;
00255   }
00256   
00257   static bool
00258   GLUE_40 (const rational &arg_1, const algebraic_real &arg_2) {
00259     return arg_1 > arg_2;
00260   }
00261   
00262   static bool
00263   GLUE_41 (const rational &arg_1, const algebraic_real &arg_2) {
00264     return arg_1 >= arg_2;
00265   }
00266   
00267   static algebraic_number
00268   GLUE_42 (const rational &arg_1) {
00269     return algebraic_number (arg_1);
00270   }
00271   
00272   static algebraic_number
00273   GLUE_43 (const algebraic_real &arg_1) {
00274     return algebraic_number (arg_1);
00275   }
00276   
00277   static complex<mmx_floating>
00278   GLUE_44 (const algebraic_number &arg_1) {
00279     return as_floating (arg_1);
00280   }
00281   
00282   static algebraic_number
00283   GLUE_45 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00284     return lcommon (arg_1, arg_2);
00285   }
00286   
00287   static algebraic_number
00288   GLUE_46 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00289     return rcommon (arg_1, arg_2);
00290   }
00291   
00292   static polynomial<rational>
00293   GLUE_47 (const algebraic_number &arg_1) {
00294     return annihilator (arg_1);
00295   }
00296   
00297   static algebraic_number
00298   GLUE_48 (const algebraic_number &arg_1) {
00299     return normalize (arg_1);
00300   }
00301   
00302   static algebraic_number
00303   GLUE_49 (const algebraic_number &arg_1) {
00304     return -arg_1;
00305   }
00306   
00307   static algebraic_number
00308   GLUE_50 (const algebraic_number &arg_1) {
00309     return square (arg_1);
00310   }
00311   
00312   static algebraic_number
00313   GLUE_51 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00314     return arg_1 + arg_2;
00315   }
00316   
00317   static algebraic_number
00318   GLUE_52 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00319     return arg_1 - arg_2;
00320   }
00321   
00322   static algebraic_number
00323   GLUE_53 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00324     return arg_1 * arg_2;
00325   }
00326   
00327   static algebraic_number
00328   GLUE_54 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00329     return arg_1 / arg_2;
00330   }
00331   
00332   static algebraic_number
00333   GLUE_55 (const rational &arg_1, const algebraic_number &arg_2) {
00334     return arg_1 + arg_2;
00335   }
00336   
00337   static algebraic_number
00338   GLUE_56 (const algebraic_number &arg_1, const rational &arg_2) {
00339     return arg_1 + arg_2;
00340   }
00341   
00342   static algebraic_number
00343   GLUE_57 (const rational &arg_1, const algebraic_number &arg_2) {
00344     return arg_1 - arg_2;
00345   }
00346   
00347   static algebraic_number
00348   GLUE_58 (const algebraic_number &arg_1, const rational &arg_2) {
00349     return arg_1 - arg_2;
00350   }
00351   
00352   static algebraic_number
00353   GLUE_59 (const rational &arg_1, const algebraic_number &arg_2) {
00354     return arg_1 * arg_2;
00355   }
00356   
00357   static algebraic_number
00358   GLUE_60 (const algebraic_number &arg_1, const rational &arg_2) {
00359     return arg_1 * arg_2;
00360   }
00361   
00362   static algebraic_number
00363   GLUE_61 (const rational &arg_1, const algebraic_number &arg_2) {
00364     return arg_1 / arg_2;
00365   }
00366   
00367   static algebraic_number
00368   GLUE_62 (const algebraic_number &arg_1, const rational &arg_2) {
00369     return arg_1 / arg_2;
00370   }
00371   
00372   static algebraic_number
00373   GLUE_63 (const algebraic_number &arg_1) {
00374     return sqrt (arg_1);
00375   }
00376   
00377   static algebraic_number
00378   GLUE_64 (const algebraic_number &arg_1, const int &arg_2) {
00379     return root (arg_1, arg_2);
00380   }
00381   
00382   static bool
00383   GLUE_65 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00384     return arg_1 == arg_2;
00385   }
00386   
00387   static bool
00388   GLUE_66 (const algebraic_number &arg_1, const algebraic_number &arg_2) {
00389     return arg_1 != arg_2;
00390   }
00391   
00392   static bool
00393   GLUE_67 (const algebraic_number &arg_1, const rational &arg_2) {
00394     return arg_1 == arg_2;
00395   }
00396   
00397   static bool
00398   GLUE_68 (const algebraic_number &arg_1, const rational &arg_2) {
00399     return arg_1 != arg_2;
00400   }
00401   
00402   static bool
00403   GLUE_69 (const rational &arg_1, const algebraic_number &arg_2) {
00404     return arg_1 == arg_2;
00405   }
00406   
00407   static bool
00408   GLUE_70 (const rational &arg_1, const algebraic_number &arg_2) {
00409     return arg_1 != arg_2;
00410   }
00411   
00412   static algebraic_number
00413   GLUE_71 (const algebraic_real &arg_1, const algebraic_real &arg_2) {
00414     return gaussian (arg_1, arg_2);
00415   }
00416   
00417   static algebraic_real
00418   GLUE_72 (const algebraic_number &arg_1) {
00419     return abs (arg_1);
00420   }
00421   
00422   static algebraic_real
00423   GLUE_73 (const algebraic_number &arg_1) {
00424     return Re (arg_1);
00425   }
00426   
00427   static algebraic_real
00428   GLUE_74 (const algebraic_number &arg_1) {
00429     return Im (arg_1);
00430   }
00431   
00432   static algebraic_number
00433   GLUE_75 (const algebraic_number &arg_1) {
00434     return conj (arg_1);
00435   }
00436   
00437   static algebraic_number
00438   GLUE_76 (const algebraic_number &arg_1) {
00439     return times_i (arg_1);
00440   }
00441   
00442   static algebraic_number
00443   GLUE_77 (const algebraic_number &arg_1) {
00444     return over_i (arg_1);
00445   }
00446   
00447   static algebraic_real
00448   GLUE_78 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, mmx_floating) &arg_2) {
00449     return algebraic_real (arg_1, arg_2);
00450   }
00451   
00452   static algebraic_real
00453   GLUE_79 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, mmx_floating) &arg_3) {
00454     return algebraic_real (arg_1, arg_2, arg_3);
00455   }
00456   
00457   static mmx_ball(mmx_floating, mmx_floating)
00458   GLUE_80 (const algebraic_real &arg_1) {
00459     return as_ball (arg_1);
00460   }
00461   
00462   static algebraic_number
00463   GLUE_81 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_2) {
00464     return algebraic_number (arg_1, arg_2);
00465   }
00466   
00467   static algebraic_number
00468   GLUE_82 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_3) {
00469     return algebraic_number (arg_1, arg_2, arg_3);
00470   }
00471   
00472   static mmx_ball(mmx_floating, complex<mmx_floating> )
00473   GLUE_83 (const algebraic_number &arg_1) {
00474     return as_ball (arg_1);
00475   }
00476   
00477   void
00478   glue_algebraic_number () {
00479     static bool done = false;
00480     if (done) return;
00481     done = true;
00482     call_glue (string ("glue_ball_floating"));
00483     call_glue (string ("glue_polynomial_rational"));
00484     call_glue (string ("glue_algebraic_generic"));
00485     define_type<algebraic_real > (lit ("Algebraic_real"));
00486     define_converter ("upgrade", GLUE_1, PENALTY_INCLUSION);
00487     define_converter ("upgrade", GLUE_2, PENALTY_INCLUSION);
00488     define ("lcommon", GLUE_3);
00489     define ("rcommon", GLUE_4);
00490     define ("annihilator", GLUE_5);
00491     define ("normalize", GLUE_6);
00492     define ("-", GLUE_7);
00493     define ("square", GLUE_8);
00494     define ("+", GLUE_9);
00495     define ("-", GLUE_10);
00496     define ("*", GLUE_11);
00497     define ("/", GLUE_12);
00498     define ("+", GLUE_13);
00499     define ("+", GLUE_14);
00500     define ("-", GLUE_15);
00501     define ("-", GLUE_16);
00502     define ("*", GLUE_17);
00503     define ("*", GLUE_18);
00504     define ("/", GLUE_19);
00505     define ("/", GLUE_20);
00506     define ("sqrt", GLUE_21);
00507     define ("root", GLUE_22);
00508     define ("sign", GLUE_23);
00509     define ("=", GLUE_24);
00510     define ("!=", GLUE_25);
00511     define ("<", GLUE_26);
00512     define ("<=", GLUE_27);
00513     define (">", GLUE_28);
00514     define (">=", GLUE_29);
00515     define ("=", GLUE_30);
00516     define ("!=", GLUE_31);
00517     define ("<", GLUE_32);
00518     define ("<=", GLUE_33);
00519     define (">", GLUE_34);
00520     define (">=", GLUE_35);
00521     define ("=", GLUE_36);
00522     define ("!=", GLUE_37);
00523     define ("<", GLUE_38);
00524     define ("<=", GLUE_39);
00525     define (">", GLUE_40);
00526     define (">=", GLUE_41);
00527     define_type<algebraic_number > (lit ("Algebraic_number"));
00528     define_converter ("upgrade", GLUE_42, PENALTY_INCLUSION);
00529     define_converter ("upgrade", GLUE_43, PENALTY_INCLUSION);
00530     define_converter ("upgrade", GLUE_44, PENALTY_INCLUSION);
00531     define ("lcommon", GLUE_45);
00532     define ("rcommon", GLUE_46);
00533     define ("annihilator", GLUE_47);
00534     define ("normalize", GLUE_48);
00535     define ("-", GLUE_49);
00536     define ("square", GLUE_50);
00537     define ("+", GLUE_51);
00538     define ("-", GLUE_52);
00539     define ("*", GLUE_53);
00540     define ("/", GLUE_54);
00541     define ("+", GLUE_55);
00542     define ("+", GLUE_56);
00543     define ("-", GLUE_57);
00544     define ("-", GLUE_58);
00545     define ("*", GLUE_59);
00546     define ("*", GLUE_60);
00547     define ("/", GLUE_61);
00548     define ("/", GLUE_62);
00549     define ("sqrt", GLUE_63);
00550     define ("root", GLUE_64);
00551     define ("=", GLUE_65);
00552     define ("!=", GLUE_66);
00553     define ("=", GLUE_67);
00554     define ("!=", GLUE_68);
00555     define ("=", GLUE_69);
00556     define ("!=", GLUE_70);
00557     define ("complex", GLUE_71);
00558     define ("abs", GLUE_72);
00559     define ("Re", GLUE_73);
00560     define ("Im", GLUE_74);
00561     define ("conj", GLUE_75);
00562     define ("times_i", GLUE_76);
00563     define ("over_i", GLUE_77);
00564     define ("algebraic", GLUE_78);
00565     define ("algebraic", GLUE_79);
00566     define_converter ("upgrade", GLUE_80, PENALTY_INCLUSION);
00567     define ("algebraic", GLUE_81);
00568     define ("algebraic", GLUE_82);
00569     define_converter ("upgrade", GLUE_83, PENALTY_INCLUSION);
00570   }
00571 }