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 }