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/floating.hpp> 00011 #include <numerix/kernel.hpp> 00012 #include <realroot/polynomial.hpp> 00013 #include <realroot/polynomial_glue.hpp> 00014 #include <realroot/ring_sparse_glue.hpp> 00015 #include <basix/tuple.hpp> 00016 #include <basix/glue.hpp> 00017 00018 #define int_literal(x) as_int (as_string (x)) 00019 #define is_generic_literal is<literal> 00020 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00021 #define gen_literal_access(f,v) access (as<generic> (f), v) 00022 #define set_of_generic set_of(generic) 00023 #define set_of_double set_of(double) 00024 #define set_of_integer set_of(integer) 00025 #define set_of_rational set_of(rational) 00026 #define set_of_bigfloat set_of(bigfloat) 00027 #define set_of_complex_bigfloat set_of(complex_bigfloat) 00028 00029 namespace mmx { 00030 static mmx_floating 00031 GLUE_1 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1) { 00032 return sample (arg_1); 00033 } 00034 00035 static ring<mmx_floating, Sparse, DegRevLex> 00036 GLUE_2 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const tuple<generic> &arg_2) { 00037 return ring_sparse_extend_generic (arg_1, as_vector (arg_2)); 00038 } 00039 00040 static ring<mmx_floating, Sparse, DegRevLex> 00041 GLUE_3 (const scalar_set<floating<> > &arg_1, const tuple<generic> &arg_2) { 00042 return ring_sparse_generic (arg_1, as_vector (arg_2)); 00043 } 00044 00045 static ring<mmx_floating, Sparse, DegRevLex> 00046 GLUE_4 (const scalar_set<floating<> > &arg_1, const tuple<generic> &arg_2) { 00047 return ring_sparse_generic (arg_1, as_vector (arg_2)); 00048 } 00049 00050 static int 00051 GLUE_5 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00052 return size (arg_1); 00053 } 00054 00055 static int 00056 GLUE_6 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00057 return degree (arg_1); 00058 } 00059 00060 static int 00061 GLUE_7 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00062 return nbvar (arg_1); 00063 } 00064 00065 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00066 GLUE_8 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00067 return -arg_1; 00068 } 00069 00070 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00071 GLUE_9 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00072 return arg_1 + arg_2; 00073 } 00074 00075 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00076 GLUE_10 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00077 return arg_1 - arg_2; 00078 } 00079 00080 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00081 GLUE_11 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00082 return arg_1 * arg_2; 00083 } 00084 00085 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00086 GLUE_12 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00087 return square (arg_1); 00088 } 00089 00090 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00091 GLUE_13 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const int &arg_2) { 00092 return pow (arg_1, arg_2); 00093 } 00094 00095 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00096 GLUE_14 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const int &arg_2) { 00097 return diff (arg_1, arg_2); 00098 } 00099 00100 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00101 GLUE_15 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const generic &arg_2) { 00102 return diff (arg_1, arg_2); 00103 } 00104 00105 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00106 GLUE_16 (const mmx_floating &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00107 return arg_1 + arg_2; 00108 } 00109 00110 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00111 GLUE_17 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const mmx_floating &arg_2) { 00112 return arg_1 + arg_2; 00113 } 00114 00115 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00116 GLUE_18 (const mmx_floating &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00117 return arg_1 - arg_2; 00118 } 00119 00120 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00121 GLUE_19 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const mmx_floating &arg_2) { 00122 return arg_1 - arg_2; 00123 } 00124 00125 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00126 GLUE_20 (const mmx_floating &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00127 return arg_1 * arg_2; 00128 } 00129 00130 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00131 GLUE_21 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const mmx_floating &arg_2) { 00132 return arg_1 * arg_2; 00133 } 00134 00135 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00136 GLUE_22 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const mmx_floating &arg_2) { 00137 return arg_1 / arg_2; 00138 } 00139 00140 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00141 GLUE_23 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const mmx_floating &arg_2) { 00142 return polynomial_sparse (arg_1, arg_2); 00143 } 00144 00145 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00146 GLUE_24 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const mmx_floating &arg_2, const int &arg_3, const int &arg_4) { 00147 return polynomial_sparse (arg_1, arg_2, arg_3, arg_4); 00148 } 00149 00150 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00151 GLUE_25 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const string &arg_2) { 00152 return polynomial_sparse (arg_1, arg_2); 00153 } 00154 00155 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00156 GLUE_26 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const generic &arg_2) { 00157 return polynomial_sparse (arg_1, arg_2); 00158 } 00159 00160 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00161 GLUE_27 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const string &arg_2) { 00162 return polynomial_sparse (arg_1, arg_2); 00163 } 00164 00165 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00166 GLUE_28 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const generic &arg_2) { 00167 return polynomial_sparse (arg_1, arg_2); 00168 } 00169 00170 static vector<generic> 00171 GLUE_29 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const int &arg_2) { 00172 return polynomial_sparse_coefficients (arg_1, arg_2); 00173 } 00174 00175 static vector<generic> 00176 GLUE_30 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00177 return polynomial_sparse_coefficients (arg_1); 00178 } 00179 00180 static vector<generic> 00181 GLUE_31 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1) { 00182 return polynomial_sparse_monomials (arg_1); 00183 } 00184 00185 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00186 GLUE_32 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00187 return homogenize (arg_1, arg_2); 00188 } 00189 00190 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00191 GLUE_33 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const int &arg_2, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_3) { 00192 return homogenize (arg_1, arg_2, arg_3); 00193 } 00194 00195 static generic 00196 GLUE_34 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const vector<generic> &arg_2) { 00197 return polynomial_sparse_eval_generic (arg_1, arg_2); 00198 } 00199 00200 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00201 GLUE_35 (const ring<mmx_floating, Sparse, DegRevLex> &arg_1, const int &arg_2) { 00202 return arg_1[arg_2]; 00203 } 00204 00205 static vector<generic> 00206 GLUE_36 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2, const int &arg_3) { 00207 return polynomial_sturm_sequence (arg_1, arg_2, arg_3); 00208 } 00209 00210 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00211 GLUE_37 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2, const int &arg_3) { 00212 return polynomial_resultant (arg_1, arg_2, arg_3); 00213 } 00214 00215 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00216 GLUE_38 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00217 return arg_1 / arg_2; 00218 } 00219 00220 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00221 GLUE_39 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00222 return arg_1 / arg_2; 00223 } 00224 00225 static ring<mmx_floating, Sparse, DegRevLex>::Polynomial 00226 GLUE_40 (const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_1, const ring<mmx_floating, Sparse, DegRevLex>::Polynomial &arg_2) { 00227 return arg_1 % arg_2; 00228 } 00229 00230 void 00231 glue_ring_sparse_floating () { 00232 static bool done = false; 00233 if (done) return; 00234 done = true; 00235 call_glue (string ("glue_int")); 00236 call_glue (string ("glue_basix_vector_generic")); 00237 call_glue (string ("glue_string")); 00238 call_glue (string ("glue_kernel")); 00239 define_type<ring<mmx_floating, Sparse, DegRevLex> > (gen (lit ("RingSparseMonomial"), lit ("Floating"))); 00240 define ("sample", GLUE_1); 00241 define (".[]", GLUE_2); 00242 define (".[]", GLUE_3); 00243 define ("ring", GLUE_4); 00244 define_type<ring<mmx_floating, Sparse, DegRevLex>::Polynomial > (gen (lit ("Polynomial"), gen (lit ("RingSparseMonomial"), lit ("Floating")))); 00245 define ("#", GLUE_5); 00246 define ("degree", GLUE_6); 00247 define ("nbvar", GLUE_7); 00248 define ("-", GLUE_8); 00249 define ("+", GLUE_9); 00250 define ("-", GLUE_10); 00251 define ("*", GLUE_11); 00252 define ("square", GLUE_12); 00253 define ("^", GLUE_13); 00254 define ("diff", GLUE_14); 00255 define ("diff", GLUE_15); 00256 define ("+", GLUE_16); 00257 define ("+", GLUE_17); 00258 define ("-", GLUE_18); 00259 define ("-", GLUE_19); 00260 define ("*", GLUE_20); 00261 define ("*", GLUE_21); 00262 define ("/", GLUE_22); 00263 define ("polynomial", GLUE_23); 00264 define ("polynomial", GLUE_24); 00265 define ("polynomial", GLUE_25); 00266 define ("polynomial", GLUE_26); 00267 define ("<<", GLUE_27); 00268 define ("<<", GLUE_28); 00269 define ("coefficients", GLUE_29); 00270 define ("coefficients", GLUE_30); 00271 define ("monomials", GLUE_31); 00272 define ("homogenize", GLUE_32); 00273 define ("homogenize", GLUE_33); 00274 define ("eval", GLUE_34); 00275 define (".[]", GLUE_35); 00276 define ("sturm_seq", GLUE_36); 00277 define ("resultant", GLUE_37); 00278 define ("/", GLUE_38); 00279 define ("quo", GLUE_39); 00280 define ("rem", GLUE_40); 00281 } 00282 }