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 }