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/complex.hpp> 00011 #include <algebramix/vector_unrolled.hpp> 00012 #include <algebramix/vector_simd.hpp> 00013 #include <algebramix/vector_modular.hpp> 00014 #include <basix/compound.hpp> 00015 #include <basix/mmx_syntax.hpp> 00016 #include <basix/lisp_syntax.hpp> 00017 #include <basix/cpp_syntax.hpp> 00018 #include <basix/syntactic.hpp> 00019 #include <algebramix/polynomial.hpp> 00020 #include <algebramix/polynomial_polynomial.hpp> 00021 #include <algebramix/polynomial_integer.hpp> 00022 #include <algebramix/polynomial_rational.hpp> 00023 #include <algebramix/polynomial_modular.hpp> 00024 #include <algebramix/polynomial_modular_integer.hpp> 00025 #include <algebramix/polynomial_complex.hpp> 00026 #include <algebramix/polynomial_schonhage.hpp> 00027 #include <algebramix/quotient.hpp> 00028 #include <basix/glue.hpp> 00029 00030 #define int_literal(x) as_int (as_string (x)) 00031 #define is_generic_literal is<literal> 00032 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00033 #define gen_literal_access(f,v) access (as<generic> (f), v) 00034 #define is_generic_compound is<compound> 00035 #define compound_arguments(x) cdr (as_vector (x)) 00036 #define gen_compound_apply(f,v) gen (as<generic> (f), v) 00037 namespace mmx { 00038 template<typename C> polynomial<C> 00039 polynomial_reverse (const vector<C>& v) { 00040 return polynomial<C> (reverse (v)); } 00041 00042 template<typename C> polynomial<modular<modulus<C>, modular_local> > 00043 as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) { 00044 modular<modulus<C>, modular_local>::set_modulus (p); 00045 return as<polynomial<modular<modulus<C>, modular_local> > > (f); } 00046 00047 template<typename C> vector<generic> 00048 wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) { 00049 return as<vector<generic> > (subresultants (f, g)); } 00050 00051 } 00052 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE } 00053 #define simple_quotient(C) quotient<C,C > 00054 00055 namespace mmx { 00056 static simple_quotient(polynomial<rational> ) 00057 GLUE_1 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2) { 00058 return (simple_quotient(polynomial<rational> ) (arg_1, arg_2)); 00059 } 00060 00061 static simple_quotient(polynomial<rational> ) 00062 GLUE_2 (const polynomial<rational> &arg_1) { 00063 return (simple_quotient(polynomial<rational> ) (arg_1)); 00064 } 00065 00066 static simple_quotient(polynomial<rational> ) 00067 GLUE_3 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2) { 00068 return (simple_quotient(polynomial<rational> ) (arg_1, arg_2)); 00069 } 00070 00071 static simple_quotient(polynomial<rational> ) 00072 GLUE_4 (const polynomial<rational> &arg_1) { 00073 return (simple_quotient(polynomial<rational> ) (arg_1)); 00074 } 00075 00076 static polynomial<rational> 00077 GLUE_5 (const simple_quotient(polynomial<rational> ) &arg_1) { 00078 return numerator (arg_1); 00079 } 00080 00081 static polynomial<rational> 00082 GLUE_6 (const simple_quotient(polynomial<rational> ) &arg_1) { 00083 return denominator (arg_1); 00084 } 00085 00086 static simple_quotient(polynomial<rational> ) 00087 GLUE_7 (const simple_quotient(polynomial<rational> ) &arg_1) { 00088 return -arg_1; 00089 } 00090 00091 static simple_quotient(polynomial<rational> ) 00092 GLUE_8 (const simple_quotient(polynomial<rational> ) &arg_1) { 00093 return square (arg_1); 00094 } 00095 00096 static simple_quotient(polynomial<rational> ) 00097 GLUE_9 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00098 return arg_1 + arg_2; 00099 } 00100 00101 static simple_quotient(polynomial<rational> ) 00102 GLUE_10 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00103 return arg_1 - arg_2; 00104 } 00105 00106 static simple_quotient(polynomial<rational> ) 00107 GLUE_11 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00108 return arg_1 * arg_2; 00109 } 00110 00111 static simple_quotient(polynomial<rational> ) 00112 GLUE_12 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00113 return arg_1 / arg_2; 00114 } 00115 00116 static simple_quotient(polynomial<rational> ) 00117 GLUE_13 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00118 return arg_1 + arg_2; 00119 } 00120 00121 static simple_quotient(polynomial<rational> ) 00122 GLUE_14 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00123 return arg_1 + arg_2; 00124 } 00125 00126 static simple_quotient(polynomial<rational> ) 00127 GLUE_15 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00128 return arg_1 - arg_2; 00129 } 00130 00131 static simple_quotient(polynomial<rational> ) 00132 GLUE_16 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00133 return arg_1 - arg_2; 00134 } 00135 00136 static simple_quotient(polynomial<rational> ) 00137 GLUE_17 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00138 return arg_1 * arg_2; 00139 } 00140 00141 static simple_quotient(polynomial<rational> ) 00142 GLUE_18 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00143 return arg_1 * arg_2; 00144 } 00145 00146 static simple_quotient(polynomial<rational> ) 00147 GLUE_19 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00148 return arg_1 / arg_2; 00149 } 00150 00151 static simple_quotient(polynomial<rational> ) 00152 GLUE_20 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00153 return arg_1 / arg_2; 00154 } 00155 00156 static simple_quotient(polynomial<rational> ) 00157 GLUE_21 (const simple_quotient(polynomial<rational> ) &arg_1, const int &arg_2) { 00158 return powint (arg_1, arg_2); 00159 } 00160 00161 static bool 00162 GLUE_22 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00163 return arg_1 == arg_2; 00164 } 00165 00166 static bool 00167 GLUE_23 (const simple_quotient(polynomial<rational> ) &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00168 return arg_1 != arg_2; 00169 } 00170 00171 static bool 00172 GLUE_24 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00173 return arg_1 == arg_2; 00174 } 00175 00176 static bool 00177 GLUE_25 (const simple_quotient(polynomial<rational> ) &arg_1, const polynomial<rational> &arg_2) { 00178 return arg_1 != arg_2; 00179 } 00180 00181 static bool 00182 GLUE_26 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00183 return arg_1 == arg_2; 00184 } 00185 00186 static bool 00187 GLUE_27 (const polynomial<rational> &arg_1, const simple_quotient(polynomial<rational> ) &arg_2) { 00188 return arg_1 != arg_2; 00189 } 00190 00191 void 00192 glue_quotient_polynomial_rational () { 00193 static bool done = false; 00194 if (done) return; 00195 done = true; 00196 call_glue (string ("glue_polynomial_rational")); 00197 define_type<simple_quotient(polynomial<rational> ) > (gen (lit ("Quotient"), gen (lit ("Polynomial"), lit ("Rational")))); 00198 define ("quotient", GLUE_1); 00199 define ("quotient", GLUE_2); 00200 define ("/", GLUE_3); 00201 define_converter ("upgrade", GLUE_4, PENALTY_INCLUSION); 00202 define ("numerator", GLUE_5); 00203 define ("denominator", GLUE_6); 00204 define ("-", GLUE_7); 00205 define ("square", GLUE_8); 00206 define ("+", GLUE_9); 00207 define ("-", GLUE_10); 00208 define ("*", GLUE_11); 00209 define ("/", GLUE_12); 00210 define ("+", GLUE_13); 00211 define ("+", GLUE_14); 00212 define ("-", GLUE_15); 00213 define ("-", GLUE_16); 00214 define ("*", GLUE_17); 00215 define ("*", GLUE_18); 00216 define ("/", GLUE_19); 00217 define ("/", GLUE_20); 00218 define ("^", GLUE_21); 00219 define ("=", GLUE_22); 00220 define ("!=", GLUE_23); 00221 define ("=", GLUE_24); 00222 define ("!=", GLUE_25); 00223 define ("=", GLUE_26); 00224 define ("!=", GLUE_27); 00225 } 00226 }