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 <algebramix/vector_unrolled.hpp>
00010 #include <algebramix/vector_simd.hpp>
00011 #include <algebramix/vector_modular.hpp>
00012 #include <algebramix/p_expansion.hpp>
00013 #include <algebramix/p_expansion_modular_integer.hpp>
00014 #include <algebramix/p_adic.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
00023 #define simple_p_expansion(C) polynomial<C, polynomial_carry_variant_helper<C>::PV>
00024 #define simple_as_p_expansion(C) as_p_expansion<C,Modulus_variant(C),modular_local>
00025
00026
00027 namespace mmx {
00028 static inline simple_p_expansion(mmx_modular(integer))
00029 integer_as_p_expansion(const integer& c, const modulus<integer>& p) {
00030 return simple_as_p_expansion(integer)(c, p); }
00031 }
00032
00033
00034 #define simple_p_adic(C) series<C, series_carry_variant_helper<C>::SV>
00035
00036
00037 namespace mmx {
00038 static void
00039 GLUE_1 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const generic &arg_2) {
00040 set_variable_name (arg_1, arg_2);
00041 }
00042
00043 static void
00044 GLUE_2 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00045 set_output_order (arg_1, arg_2);
00046 }
00047
00048 static void
00049 GLUE_3 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00050 set_cancel_order (arg_1, arg_2);
00051 }
00052
00053 static void
00054 GLUE_4 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const bool &arg_2) {
00055 set_formula_output (arg_1, arg_2);
00056 }
00057
00058 static simple_p_adic(mmx_modular(integer) )
00059 GLUE_5 (const tuple<mmx_modular(integer) > &arg_1) {
00060 return (simple_p_adic(mmx_modular(integer) ) (as_vector (arg_1)));
00061 }
00062
00063 static simple_p_adic(mmx_modular(integer) )
00064 GLUE_6 (const mmx_modular(integer) &arg_1) {
00065 return (simple_p_adic(mmx_modular(integer) ) (arg_1));
00066 }
00067
00068 static iterator<generic>
00069 GLUE_7 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00070 return as<iterator<generic> > (iterate (arg_1));
00071 }
00072
00073 static mmx_modular(integer)
00074 GLUE_8 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00075 return arg_1[arg_2];
00076 }
00077
00078 static simple_p_expansion(mmx_modular(integer) )
00079 GLUE_9 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2, const int &arg_3) {
00080 return range (arg_1, arg_2, arg_3);
00081 }
00082
00083 static simple_p_adic(mmx_modular(integer) )
00084 GLUE_10 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00085 return -arg_1;
00086 }
00087
00088 static simple_p_adic(mmx_modular(integer) )
00089 GLUE_11 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00090 return square (arg_1);
00091 }
00092
00093 static simple_p_adic(mmx_modular(integer) )
00094 GLUE_12 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00095 return arg_1 + arg_2;
00096 }
00097
00098 static simple_p_adic(mmx_modular(integer) )
00099 GLUE_13 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00100 return arg_1 - arg_2;
00101 }
00102
00103 static simple_p_adic(mmx_modular(integer) )
00104 GLUE_14 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00105 return arg_1 * arg_2;
00106 }
00107
00108 static simple_p_adic(mmx_modular(integer) )
00109 GLUE_15 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00110 return arg_1 + arg_2;
00111 }
00112
00113 static simple_p_adic(mmx_modular(integer) )
00114 GLUE_16 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00115 return arg_1 + arg_2;
00116 }
00117
00118 static simple_p_adic(mmx_modular(integer) )
00119 GLUE_17 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00120 return arg_1 - arg_2;
00121 }
00122
00123 static simple_p_adic(mmx_modular(integer) )
00124 GLUE_18 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00125 return arg_1 - arg_2;
00126 }
00127
00128 static simple_p_adic(mmx_modular(integer) )
00129 GLUE_19 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00130 return arg_1 * arg_2;
00131 }
00132
00133 static simple_p_adic(mmx_modular(integer) )
00134 GLUE_20 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00135 return arg_1 * arg_2;
00136 }
00137
00138 static simple_p_adic(mmx_modular(integer) )
00139 GLUE_21 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00140 return binpow (arg_1, arg_2);
00141 }
00142
00143 static simple_p_adic(mmx_modular(integer) )
00144 GLUE_22 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00145 return lshiftz (arg_1, arg_2);
00146 }
00147
00148 static simple_p_adic(mmx_modular(integer) )
00149 GLUE_23 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00150 return rshiftz (arg_1, arg_2);
00151 }
00152
00153 static simple_p_adic(mmx_modular(integer) )
00154 GLUE_24 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00155 return arg_1 / arg_2;
00156 }
00157
00158 static simple_p_adic(mmx_modular(integer) )
00159 GLUE_25 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00160 return arg_1 / arg_2;
00161 }
00162
00163 static simple_p_adic(mmx_modular(integer) )
00164 GLUE_26 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00165 return arg_1 / arg_2;
00166 }
00167
00168 static simple_p_adic(mmx_modular(integer) )
00169 GLUE_27 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00170 return gcd (arg_1, arg_2);
00171 }
00172
00173 static simple_p_adic(mmx_modular(integer) )
00174 GLUE_28 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00175 return lcm (arg_1, arg_2);
00176 }
00177
00178 static simple_p_adic(mmx_modular(integer) )
00179 GLUE_29 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00180 return separable_root (arg_1, arg_2);
00181 }
00182
00183 static simple_p_adic(mmx_modular(integer) )
00184 GLUE_30 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00185 return pth_root (arg_1);
00186 }
00187
00188 static bool
00189 GLUE_31 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00190 return arg_1 == arg_2;
00191 }
00192
00193 static bool
00194 GLUE_32 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00195 return arg_1 != arg_2;
00196 }
00197
00198 static bool
00199 GLUE_33 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00200 return arg_1 == arg_2;
00201 }
00202
00203 static bool
00204 GLUE_34 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00205 return arg_1 != arg_2;
00206 }
00207
00208 static bool
00209 GLUE_35 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00210 return arg_1 == arg_2;
00211 }
00212
00213 static bool
00214 GLUE_36 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00215 return arg_1 != arg_2;
00216 }
00217
00218 void
00219 glue_p_adic_modular_integer () {
00220 static bool done = false;
00221 if (done) return;
00222 done = true;
00223 call_glue (string ("glue_integer"));
00224 call_glue (string ("glue_modular_integer"));
00225 call_glue (string ("glue_p_expansion_modular_integer"));
00226 define_type<simple_p_adic(mmx_modular(integer) ) > (gen (lit ("P_adic"), gen (lit ("Modular"), lit ("Integer"))));
00227 define ("set_variable_name", GLUE_1);
00228 define ("set_output_order", GLUE_2);
00229 define ("set_cancel_order", GLUE_3);
00230 define ("set_formula_output", GLUE_4);
00231 define ("p_adic", GLUE_5);
00232 define_converter ("upgrade", GLUE_6, PENALTY_INCLUSION);
00233 define_converter (":>", GLUE_7, PENALTY_CAST);
00234 define (".[]", GLUE_8);
00235 define (".[]", GLUE_9);
00236 define ("-", GLUE_10);
00237 define ("square", GLUE_11);
00238 define ("+", GLUE_12);
00239 define ("-", GLUE_13);
00240 define ("*", GLUE_14);
00241 define ("+", GLUE_15);
00242 define ("+", GLUE_16);
00243 define ("-", GLUE_17);
00244 define ("-", GLUE_18);
00245 define ("*", GLUE_19);
00246 define ("*", GLUE_20);
00247 define ("^", GLUE_21);
00248 define ("<<", GLUE_22);
00249 define (">>", GLUE_23);
00250 define ("/", GLUE_24);
00251 define ("/", GLUE_25);
00252 define ("/", GLUE_26);
00253 define ("gcd", GLUE_27);
00254 define ("lcm", GLUE_28);
00255 define ("separable_root", GLUE_29);
00256 define ("pth_root", GLUE_30);
00257 define ("=", GLUE_31);
00258 define ("!=", GLUE_32);
00259 define ("=", GLUE_33);
00260 define ("!=", GLUE_34);
00261 define ("=", GLUE_35);
00262 define ("!=", GLUE_36);
00263 }
00264 }