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 <algebramix/vector_unrolled.hpp> 00008 #include <algebramix/vector_simd.hpp> 00009 #include <multimix/multivariate_coordinates.hpp> 00010 #include <multimix/multivariate_monomial.hpp> 00011 #include <multimix/multivariate_polynomial.hpp> 00012 #include <multimix/sparse_polynomial_integer.hpp> 00013 #include <basix/compound.hpp> 00014 #include <basix/mmx_syntax.hpp> 00015 #include <basix/lisp_syntax.hpp> 00016 #include <basix/cpp_syntax.hpp> 00017 #include <basix/syntactic.hpp> 00018 #include <lacunaryx/lpolynomial.hpp> 00019 #include <lacunaryx/integer_roots.hpp> 00020 #include <basix/glue.hpp> 00021 00022 #define int_literal(x) as_int (as_string (x)) 00023 #define is_generic_literal is<literal> 00024 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00025 #define gen_literal_access(f,v) access (as<generic> (f), v) 00026 #define mmx_coordinate multivariate_coordinate<> 00027 #define mmx_coordinates multivariate_coordinates<> 00028 #define mv_monomial multivariate<monomial<> > 00029 00030 #define mv_polynomial(C) multivariate<sparse_polynomial<C> > 00031 00032 #define lmv_monomial multivariate<monomial<vector<integer> > > 00033 00034 #define lmv_polynomial(C) multivariate<sparse_polynomial<C,monomial<vector<integer> >,sparse_polynomial_naive> > 00035 00036 #define is_generic_compound is<compound> 00037 #define compound_arguments(x) cdr (as_vector (x)) 00038 #define gen_compound_apply(f,v) gen (as<generic> (f), v) 00039 00040 namespace mmx { 00041 static vector<generic> 00042 GLUE_1 (const mv_polynomial(integer) &arg_1) { 00043 return integer_roots (arg_1); 00044 } 00045 00046 static vector<generic> 00047 GLUE_2 (const lmv_polynomial(integer) &arg_1) { 00048 return integer_roots (arg_1); 00049 } 00050 00051 static vector<generic> 00052 GLUE_3 (const lpolynomial<integer> &arg_1) { 00053 return integer_roots (arg_1); 00054 } 00055 00056 static vector<lpolynomial<integer> > 00057 GLUE_4 (const vector<integer> &arg_1) { 00058 return as<vector<lpolynomial<integer> > > (arg_1); 00059 } 00060 00061 static vector<integer> 00062 GLUE_5 (const lpolynomial<generic> &arg_1) { 00063 return supp (arg_1); 00064 } 00065 00066 static vector<integer> 00067 GLUE_6 (const lpolynomial<integer> &arg_1) { 00068 return supp (arg_1); 00069 } 00070 00071 void 00072 glue_integer_roots () { 00073 static bool done = false; 00074 if (done) return; 00075 done = true; 00076 call_glue (string ("glue_mvpolynomial_integer")); 00077 call_glue (string ("glue_lmvpolynomial_integer")); 00078 call_glue (string ("glue_lpolynomial_integer")); 00079 call_glue (string ("glue_vector_generic")); 00080 define ("roots", GLUE_1); 00081 define ("roots", GLUE_2); 00082 define ("roots", GLUE_3); 00083 define_converter (":>", GLUE_4, PENALTY_INCLUSION); 00084 define ("supp", GLUE_5); 00085 define ("supp", GLUE_6); 00086 } 00087 }