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 }