algebramix_doc 0.3
|
00001 00002 #include <numerix/integer.hpp> 00003 #include <basix/int.hpp> 00004 #include <numerix/modular.hpp> 00005 #include <numerix/modular_integer.hpp> 00006 #include <basix/vector.hpp> 00007 #include <algebramix/vector_unrolled.hpp> 00008 #include <algebramix/vector_simd.hpp> 00009 #include <algebramix/vector_modular.hpp> 00010 #include <algebramix/p_expansion.hpp> 00011 #include <algebramix/p_expansion_modular_integer.hpp> 00012 #include <algebramix/p_adic.hpp> 00013 #include <basix/tuple.hpp> 00014 #include <basix/glue.hpp> 00015 00016 #define int_literal(x) as_int (as_string (x)) 00017 00018 #define simple_p_expansion(C) polynomial<C, polynomial_carry_variant_helper<C>::PV> 00019 #define simple_as_p_expansion(C) as_p_expansion<C,Modulus_variant(C),modular_local> 00020 00021 00022 namespace mmx { 00023 static inline simple_p_expansion(mmx_modular(integer)) 00024 integer_as_p_expansion(const integer& c, const modulus<integer>& p) { 00025 return simple_as_p_expansion(integer)(c, p); } 00026 } 00027 00028 00029 #define simple_p_adic(C) series<C, series_carry_variant_helper<C>::SV> 00030 00031 00032 namespace mmx { 00033 static void 00034 GLUE_1 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const generic &arg_2) { 00035 set_variable_name (arg_1, arg_2); 00036 } 00037 00038 static void 00039 GLUE_2 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) { 00040 set_output_order (arg_1, arg_2); 00041 } 00042 00043 static void 00044 GLUE_3 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) { 00045 set_cancel_order (arg_1, arg_2); 00046 } 00047 00048 static void 00049 GLUE_4 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const bool &arg_2) { 00050 set_formula_output (arg_1, arg_2); 00051 } 00052 00053 static simple_p_adic(mmx_modular(integer) ) 00054 GLUE_5 (const tuple<mmx_modular(integer) > &arg_1) { 00055 return (simple_p_adic(mmx_modular(integer) ) (as_vector (arg_1))); 00056 } 00057 00058 static simple_p_adic(mmx_modular(integer) ) 00059 GLUE_6 (const mmx_modular(integer) &arg_1) { 00060 return (simple_p_adic(mmx_modular(integer) ) (arg_1)); 00061 } 00062 00063 static iterator<generic> 00064 GLUE_7 (const simple_p_adic(mmx_modular(integer) ) &arg_1) { 00065 return as<iterator<generic> > (iterate (arg_1)); 00066 } 00067 00068 static mmx_modular(integer) 00069 GLUE_8 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) { 00070 return arg_1[arg_2]; 00071 } 00072 00073 static simple_p_expansion(mmx_modular(integer) ) 00074 GLUE_9 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2, const int &arg_3) { 00075 return range (arg_1, arg_2, arg_3); 00076 } 00077 00078 static simple_p_adic(mmx_modular(integer) ) 00079 GLUE_10 (const simple_p_adic(mmx_modular(integer) ) &arg_1) { 00080 return -arg_1; 00081 } 00082 00083 static simple_p_adic(mmx_modular(integer) ) 00084 GLUE_11 (const simple_p_adic(mmx_modular(integer) ) &arg_1) { 00085 return square (arg_1); 00086 } 00087 00088 static simple_p_adic(mmx_modular(integer) ) 00089 GLUE_12 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00090 return arg_1 + arg_2; 00091 } 00092 00093 static simple_p_adic(mmx_modular(integer) ) 00094 GLUE_13 (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_14 (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_15 (const 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_16 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) { 00110 return arg_1 + arg_2; 00111 } 00112 00113 static simple_p_adic(mmx_modular(integer) ) 00114 GLUE_17 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00115 return arg_1 - arg_2; 00116 } 00117 00118 static simple_p_adic(mmx_modular(integer) ) 00119 GLUE_18 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) { 00120 return arg_1 - arg_2; 00121 } 00122 00123 static simple_p_adic(mmx_modular(integer) ) 00124 GLUE_19 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00125 return arg_1 * arg_2; 00126 } 00127 00128 static simple_p_adic(mmx_modular(integer) ) 00129 GLUE_20 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) { 00130 return arg_1 * arg_2; 00131 } 00132 00133 static simple_p_adic(mmx_modular(integer) ) 00134 GLUE_21 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) { 00135 return binpow (arg_1, arg_2); 00136 } 00137 00138 static simple_p_adic(mmx_modular(integer) ) 00139 GLUE_22 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00140 return arg_1 / arg_2; 00141 } 00142 00143 static simple_p_adic(mmx_modular(integer) ) 00144 GLUE_23 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00145 return arg_1 / arg_2; 00146 } 00147 00148 static simple_p_adic(mmx_modular(integer) ) 00149 GLUE_24 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) { 00150 return arg_1 / arg_2; 00151 } 00152 00153 static simple_p_adic(mmx_modular(integer) ) 00154 GLUE_25 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00155 return gcd (arg_1, arg_2); 00156 } 00157 00158 static simple_p_adic(mmx_modular(integer) ) 00159 GLUE_26 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) { 00160 return lcm (arg_1, arg_2); 00161 } 00162 00163 static simple_p_adic(mmx_modular(integer) ) 00164 GLUE_27 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) { 00165 return separable_root (arg_1, arg_2); 00166 } 00167 00168 static simple_p_adic(mmx_modular(integer) ) 00169 GLUE_28 (const simple_p_adic(mmx_modular(integer) ) &arg_1) { 00170 return pth_root (arg_1); 00171 } 00172 00173 void 00174 glue_p_adic_modular_integer () { 00175 static bool done = false; 00176 if (done) return; 00177 done = true; 00178 call_glue (string ("glue_integer")); 00179 call_glue (string ("glue_modular_integer")); 00180 call_glue (string ("glue_p_expansion_modular_integer")); 00181 define_type<simple_p_adic(mmx_modular(integer) ) > (gen (lit ("P_adic"), gen (lit ("Modular"), lit ("Integer")))); 00182 define ("set_variable_name", GLUE_1); 00183 define ("set_output_order", GLUE_2); 00184 define ("set_cancel_order", GLUE_3); 00185 define ("set_formula_output", GLUE_4); 00186 define ("p_adic", GLUE_5); 00187 define_converter ("upgrade", GLUE_6, PENALTY_INCLUSION); 00188 define_converter (":>", GLUE_7, PENALTY_CAST); 00189 define (".[]", GLUE_8); 00190 define (".[]", GLUE_9); 00191 define ("-", GLUE_10); 00192 define ("square", GLUE_11); 00193 define ("+", GLUE_12); 00194 define ("-", GLUE_13); 00195 define ("*", GLUE_14); 00196 define ("+", GLUE_15); 00197 define ("+", GLUE_16); 00198 define ("-", GLUE_17); 00199 define ("-", GLUE_18); 00200 define ("*", GLUE_19); 00201 define ("*", GLUE_20); 00202 define ("^", GLUE_21); 00203 define ("/", GLUE_22); 00204 define ("/", GLUE_23); 00205 define ("/", GLUE_24); 00206 define ("gcd", GLUE_25); 00207 define ("lcm", GLUE_26); 00208 define ("separable_root", GLUE_27); 00209 define ("pth_root", GLUE_28); 00210 } 00211 }