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 <algebramix/algebraic.hpp>
00017 #include <basix/glue.hpp>
00018 
00019 #define int_literal(x) as_int (as_string (x))
00020 #define is_generic_literal is<literal>
00021 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00022 #define gen_literal_access(f,v) access (as<generic> (f), v)
00023 #define is_generic_compound is<compound>
00024 #define compound_arguments(x) cdr (as_vector (x))
00025 #define gen_compound_apply(f,v) gen (as<generic> (f), v)
00026 namespace mmx {
00027     template<typename C> polynomial<C>
00028     polynomial_reverse (const vector<C>& v) {
00029       return polynomial<C> (reverse (v)); }
00030 
00031     template<typename C> polynomial<modular<modulus<C>, modular_local> >
00032     as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) {
00033       modular<modulus<C>, modular_local>::set_modulus (p);
00034       return as<polynomial<modular<modulus<C>, modular_local> > > (f); }
00035 
00036     template<typename C> vector<generic>
00037     wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) {
00038       return as<vector<generic> > (subresultants (f, g)); }
00039 
00040   }
00041 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE }
00042 
00043 namespace mmx {
00044   static algebraic<generic>
00045   GLUE_1 (const polynomial<generic> &arg_1) {
00046     return algebraic<generic > (arg_1);
00047   }
00048   
00049   static algebraic<generic>
00050   GLUE_2 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) {
00051     return algebraic<generic > (arg_1, arg_2);
00052   }
00053   
00054   static algebraic<generic>
00055   GLUE_3 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00056     return lcommon (arg_1, arg_2);
00057   }
00058   
00059   static algebraic<generic>
00060   GLUE_4 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00061     return rcommon (arg_1, arg_2);
00062   }
00063   
00064   static polynomial<generic>
00065   GLUE_5 (const algebraic<generic> &arg_1) {
00066     return annihilator (arg_1);
00067   }
00068   
00069   static algebraic<generic>
00070   GLUE_6 (const algebraic<generic> &arg_1) {
00071     return normalize (arg_1);
00072   }
00073   
00074   static algebraic<generic>
00075   GLUE_7 (const algebraic<generic> &arg_1) {
00076     return -arg_1;
00077   }
00078   
00079   static algebraic<generic>
00080   GLUE_8 (const algebraic<generic> &arg_1) {
00081     return square (arg_1);
00082   }
00083   
00084   static algebraic<generic>
00085   GLUE_9 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00086     return arg_1 + arg_2;
00087   }
00088   
00089   static algebraic<generic>
00090   GLUE_10 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00091     return arg_1 - arg_2;
00092   }
00093   
00094   static algebraic<generic>
00095   GLUE_11 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00096     return arg_1 * arg_2;
00097   }
00098   
00099   static algebraic<generic>
00100   GLUE_12 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00101     return arg_1 / arg_2;
00102   }
00103   
00104   static bool
00105   GLUE_13 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00106     return arg_1 == arg_2;
00107   }
00108   
00109   static bool
00110   GLUE_14 (const algebraic<generic> &arg_1, const algebraic<generic> &arg_2) {
00111     return arg_1 != arg_2;
00112   }
00113   
00114   void
00115   glue_algebraic_generic () {
00116     static bool done = false;
00117     if (done) return;
00118     done = true;
00119     call_glue (string ("glue_polynomial_generic"));
00120     define_type<algebraic<generic> > (gen (lit ("Algebraic"), lit ("Generic")));
00121     define ("algebraic", GLUE_1);
00122     define ("algebraic", GLUE_2);
00123     define ("lcommon", GLUE_3);
00124     define ("rcommon", GLUE_4);
00125     define ("annihilator", GLUE_5);
00126     define ("normalize", GLUE_6);
00127     define ("-", GLUE_7);
00128     define ("square", GLUE_8);
00129     define ("+", GLUE_9);
00130     define ("-", GLUE_10);
00131     define ("*", GLUE_11);
00132     define ("/", GLUE_12);
00133     define ("=", GLUE_13);
00134     define ("!=", GLUE_14);
00135   }
00136 }