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/complex.hpp>
00011 #include <algebramix/vector_unrolled.hpp>
00012 #include <algebramix/vector_simd.hpp>
00013 #include <algebramix/vector_modular.hpp>
00014 #include <basix/compound.hpp>
00015 #include <basix/mmx_syntax.hpp>
00016 #include <basix/lisp_syntax.hpp>
00017 #include <basix/cpp_syntax.hpp>
00018 #include <basix/syntactic.hpp>
00019 #include <algebramix/polynomial.hpp>
00020 #include <algebramix/polynomial_polynomial.hpp>
00021 #include <algebramix/polynomial_integer.hpp>
00022 #include <algebramix/polynomial_rational.hpp>
00023 #include <algebramix/polynomial_modular.hpp>
00024 #include <algebramix/polynomial_modular_integer.hpp>
00025 #include <algebramix/polynomial_complex.hpp>
00026 #include <algebramix/polynomial_schonhage.hpp>
00027 #include <algebramix/quotient.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 #define simple_quotient(C) quotient<C,C >
00054 
00055 namespace mmx {
00056   static simple_quotient(polynomial<rational> )
00057   GLUE_1 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2) {
00058     return (simple_quotient(polynomial<rational> ) (arg_1, arg_2));
00059   }
00060   
00061   static simple_quotient(polynomial<rational> )
00062   GLUE_2 (const polynomial<rational> &arg_1) {
00063     return (simple_quotient(polynomial<rational> ) (arg_1));
00064   }
00065   
00066   static simple_quotient(polynomial<rational> )
00067   GLUE_3 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2) {
00068     return (simple_quotient(polynomial<rational> ) (arg_1, arg_2));
00069   }
00070   
00071   static simple_quotient(polynomial<rational> )
00072   GLUE_4 (const polynomial<rational> &arg_1) {
00073     return (simple_quotient(polynomial<rational> ) (arg_1));
00074   }
00075   
00076   static polynomial<rational>
00077   GLUE_5 (const simple_quotient(polynomial<rational> ) &arg_1) {
00078     return numerator (arg_1);
00079   }
00080   
00081   static polynomial<rational>
00082   GLUE_6 (const simple_quotient(polynomial<rational> ) &arg_1) {
00083     return denominator (arg_1);
00084   }
00085   
00086   static simple_quotient(polynomial<rational> )
00087   GLUE_7 (const simple_quotient(polynomial<rational> ) &arg_1) {
00088     return -arg_1;
00089   }
00090   
00091   static simple_quotient(polynomial<rational> )
00092   GLUE_8 (const simple_quotient(polynomial<rational> ) &arg_1) {
00093     return square (arg_1);
00094   }
00095   
00096   static simple_quotient(polynomial<rational> )
00097   GLUE_9 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00098     return arg_1 + arg_2;
00099   }
00100   
00101   static simple_quotient(polynomial<rational> )
00102   GLUE_10 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00103     return arg_1 - arg_2;
00104   }
00105   
00106   static simple_quotient(polynomial<rational> )
00107   GLUE_11 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00108     return arg_1 * arg_2;
00109   }
00110   
00111   static simple_quotient(polynomial<rational> )
00112   GLUE_12 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00113     return arg_1 / arg_2;
00114   }
00115   
00116   static simple_quotient(polynomial<rational> )
00117   GLUE_13 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00118     return arg_1 + arg_2;
00119   }
00120   
00121   static simple_quotient(polynomial<rational> )
00122   GLUE_14 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00123     return arg_1 + arg_2;
00124   }
00125   
00126   static simple_quotient(polynomial<rational> )
00127   GLUE_15 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00128     return arg_1 - arg_2;
00129   }
00130   
00131   static simple_quotient(polynomial<rational> )
00132   GLUE_16 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00133     return arg_1 - arg_2;
00134   }
00135   
00136   static simple_quotient(polynomial<rational> )
00137   GLUE_17 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00138     return arg_1 * arg_2;
00139   }
00140   
00141   static simple_quotient(polynomial<rational> )
00142   GLUE_18 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00143     return arg_1 * arg_2;
00144   }
00145   
00146   static simple_quotient(polynomial<rational> )
00147   GLUE_19 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00148     return arg_1 / arg_2;
00149   }
00150   
00151   static simple_quotient(polynomial<rational> )
00152   GLUE_20 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00153     return arg_1 / arg_2;
00154   }
00155   
00156   static simple_quotient(polynomial<rational> )
00157   GLUE_21 (const simple_quotient(polynomial<rational> ) &arg_1, const int &arg_2) {
00158     return powint (arg_1, arg_2);
00159   }
00160   
00161   static bool
00162   GLUE_22 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00163     return arg_1 == arg_2;
00164   }
00165   
00166   static bool
00167   GLUE_23 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00168     return arg_1 != arg_2;
00169   }
00170   
00171   static bool
00172   GLUE_24 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00173     return arg_1 == arg_2;
00174   }
00175   
00176   static bool
00177   GLUE_25 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) {
00178     return arg_1 != arg_2;
00179   }
00180   
00181   static bool
00182   GLUE_26 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00183     return arg_1 == arg_2;
00184   }
00185   
00186   static bool
00187   GLUE_27 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) {
00188     return arg_1 != arg_2;
00189   }
00190   
00191   void
00192   glue_quotient_polynomial_rational () {
00193     static bool done = false;
00194     if (done) return;
00195     done = true;
00196     call_glue (string ("glue_polynomial_rational"));
00197     define_type<simple_quotient(polynomial<rational> ) > (gen (lit ("Quotient"), gen (lit ("Polynomial"), lit ("Rational"))));
00198     define ("quotient", GLUE_1);
00199     define ("quotient", GLUE_2);
00200     define ("/", GLUE_3);
00201     define_converter ("upgrade", GLUE_4, PENALTY_INCLUSION);
00202     define ("numerator", GLUE_5);
00203     define ("denominator", GLUE_6);
00204     define ("-", GLUE_7);
00205     define ("square", GLUE_8);
00206     define ("+", GLUE_9);
00207     define ("-", GLUE_10);
00208     define ("*", GLUE_11);
00209     define ("/", GLUE_12);
00210     define ("+", GLUE_13);
00211     define ("+", GLUE_14);
00212     define ("-", GLUE_15);
00213     define ("-", GLUE_16);
00214     define ("*", GLUE_17);
00215     define ("*", GLUE_18);
00216     define ("/", GLUE_19);
00217     define ("/", GLUE_20);
00218     define ("^", GLUE_21);
00219     define ("=", GLUE_22);
00220     define ("!=", GLUE_23);
00221     define ("=", GLUE_24);
00222     define ("!=", GLUE_25);
00223     define ("=", GLUE_26);
00224     define ("!=", GLUE_27);
00225   }
00226 }