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 }