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 <basix/glue.hpp> 00010 00011 #define int_literal(x) as_int (as_string (x)) 00012 #define is_generic_literal is<literal> 00013 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00014 #define gen_literal_access(f,v) access (as<generic> (f), v) 00015 00016 namespace mmx { 00017 static mmx_modular(int) 00018 GLUE_1 (const mmx_modular(int) &arg_1, const integer &arg_2) { 00019 return binpow (arg_1, arg_2); 00020 } 00021 00022 static modulus<integer> 00023 GLUE_2 (const integer &arg_1) { 00024 return modulus<integer > (arg_1); 00025 } 00026 00027 static modulus<integer> 00028 GLUE_3 (const integer &arg_1) { 00029 return modulus<integer > (arg_1); 00030 } 00031 00032 static integer 00033 GLUE_4 (const modulus<integer> &arg_1) { 00034 return *arg_1; 00035 } 00036 00037 static mmx_modular(integer) 00038 GLUE_5 (const integer &arg_1, const integer &arg_2) { 00039 return (mmx_modular(integer ) (arg_1, arg_2)); 00040 } 00041 00042 static mmx_modular(integer) 00043 GLUE_6 (const integer &arg_1, const modulus<integer> &arg_2) { 00044 return (mmx_modular(integer ) (arg_1, arg_2)); 00045 } 00046 00047 static mmx_modular(integer) 00048 GLUE_7 (const integer &arg_1, const modulus<integer> &arg_2) { 00049 return (mmx_modular(integer ) (arg_1, arg_2)); 00050 } 00051 00052 static modulus<integer> 00053 GLUE_8 (const mmx_modular(integer) &arg_1) { 00054 return get_modulus (arg_1); 00055 } 00056 00057 static integer 00058 GLUE_9 (const mmx_modular(integer) &arg_1) { 00059 return *arg_1; 00060 } 00061 00062 static mmx_modular(integer) 00063 GLUE_10 (const mmx_modular(integer) &arg_1) { 00064 return -arg_1; 00065 } 00066 00067 static mmx_modular(integer) 00068 GLUE_11 (const mmx_modular(integer) &arg_1) { 00069 return square (arg_1); 00070 } 00071 00072 static mmx_modular(integer) 00073 GLUE_12 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00074 return arg_1 + arg_2; 00075 } 00076 00077 static mmx_modular(integer) 00078 GLUE_13 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00079 return arg_1 - arg_2; 00080 } 00081 00082 static mmx_modular(integer) 00083 GLUE_14 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00084 return arg_1 * arg_2; 00085 } 00086 00087 static mmx_modular(integer) 00088 GLUE_15 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00089 return arg_1 + arg_2; 00090 } 00091 00092 static mmx_modular(integer) 00093 GLUE_16 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00094 return arg_1 + arg_2; 00095 } 00096 00097 static mmx_modular(integer) 00098 GLUE_17 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00099 return arg_1 - arg_2; 00100 } 00101 00102 static mmx_modular(integer) 00103 GLUE_18 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00104 return arg_1 - arg_2; 00105 } 00106 00107 static mmx_modular(integer) 00108 GLUE_19 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00109 return arg_1 * arg_2; 00110 } 00111 00112 static mmx_modular(integer) 00113 GLUE_20 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00114 return arg_1 * arg_2; 00115 } 00116 00117 static mmx_modular(integer) 00118 GLUE_21 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00119 return arg_1 / arg_2; 00120 } 00121 00122 static mmx_modular(integer) 00123 GLUE_22 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00124 return arg_1 / arg_2; 00125 } 00126 00127 static mmx_modular(integer) 00128 GLUE_23 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00129 return arg_1 / arg_2; 00130 } 00131 00132 static mmx_modular(integer) 00133 GLUE_24 (const mmx_modular(integer) &arg_1, const int &arg_2) { 00134 return binpow (arg_1, arg_2); 00135 } 00136 00137 static mmx_modular(integer) 00138 GLUE_25 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00139 return binpow (arg_1, arg_2); 00140 } 00141 00142 static bool 00143 GLUE_26 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00144 return arg_1 == arg_2; 00145 } 00146 00147 static bool 00148 GLUE_27 (const mmx_modular(integer) &arg_1, const mmx_modular(integer) &arg_2) { 00149 return arg_1 != arg_2; 00150 } 00151 00152 static bool 00153 GLUE_28 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00154 return arg_1 == arg_2; 00155 } 00156 00157 static bool 00158 GLUE_29 (const mmx_modular(integer) &arg_1, const integer &arg_2) { 00159 return arg_1 != arg_2; 00160 } 00161 00162 static bool 00163 GLUE_30 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00164 return arg_1 == arg_2; 00165 } 00166 00167 static bool 00168 GLUE_31 (const integer &arg_1, const mmx_modular(integer) &arg_2) { 00169 return arg_1 != arg_2; 00170 } 00171 00172 void 00173 glue_modular_integer () { 00174 static bool done = false; 00175 if (done) return; 00176 done = true; 00177 call_glue (string ("glue_int")); 00178 call_glue (string ("glue_integer")); 00179 call_glue (string ("glue_modular_int")); 00180 define_type<modulus<integer> > (gen (lit ("Modulus"), lit ("Integer"))); 00181 define_type<mmx_modular(integer) > (gen (lit ("Modular"), lit ("Integer"))); 00182 define ("^", GLUE_1); 00183 define ("modulus", GLUE_2); 00184 define_converter ("upgrade", GLUE_3, PENALTY_HOMOMORPHISM); 00185 define_converter (":>", GLUE_4, PENALTY_CAST); 00186 define ("modular", GLUE_5); 00187 define ("modular", GLUE_6); 00188 define ("mod", GLUE_7); 00189 define ("get_modulus", GLUE_8); 00190 define ("preimage", 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 ("^", GLUE_25); 00207 define ("=", GLUE_26); 00208 define ("!=", GLUE_27); 00209 define ("=", GLUE_28); 00210 define ("!=", GLUE_29); 00211 define ("=", GLUE_30); 00212 define ("!=", GLUE_31); 00213 } 00214 }