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 <basix/glue.hpp> 00011 00012 #define int_literal(x) as_int (as_string (x)) 00013 #define is_generic_literal is<literal> 00014 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00015 #define gen_literal_access(f,v) access (as<generic> (f), v) 00016 00017 namespace mmx { 00018 static rational 00019 GLUE_1 (const integer &arg_1) { 00020 return rational (arg_1); 00021 } 00022 00023 static rational 00024 GLUE_2 (const integer &arg_1, const integer &arg_2) { 00025 return rational_new (arg_1, arg_2); 00026 } 00027 00028 static rational 00029 GLUE_3 (const int &arg_1) { 00030 return rational (arg_1); 00031 } 00032 00033 static rational 00034 GLUE_4 (const integer &arg_1) { 00035 return rational (arg_1); 00036 } 00037 00038 static double 00039 GLUE_5 (const rational &arg_1) { 00040 return as_double (arg_1); 00041 } 00042 00043 static rational 00044 GLUE_6 (const integer &arg_1, const integer &arg_2) { 00045 return rational_new (arg_1, arg_2); 00046 } 00047 00048 static integer 00049 GLUE_7 (const rational &arg_1) { 00050 return numerator (arg_1); 00051 } 00052 00053 static integer 00054 GLUE_8 (const rational &arg_1) { 00055 return denominator (arg_1); 00056 } 00057 00058 static bool 00059 GLUE_9 (const rational &arg_1) { 00060 return is_integer (arg_1); 00061 } 00062 00063 static rational 00064 GLUE_10 (const rational &arg_1) { 00065 return -arg_1; 00066 } 00067 00068 static rational 00069 GLUE_11 (const rational &arg_1) { 00070 return square (arg_1); 00071 } 00072 00073 static rational 00074 GLUE_12 (const rational &arg_1, const rational &arg_2) { 00075 return arg_1 + arg_2; 00076 } 00077 00078 static rational 00079 GLUE_13 (const rational &arg_1, const rational &arg_2) { 00080 return arg_1 - arg_2; 00081 } 00082 00083 static rational 00084 GLUE_14 (const rational &arg_1, const rational &arg_2) { 00085 return arg_1 * arg_2; 00086 } 00087 00088 static rational 00089 GLUE_15 (const rational &arg_1, const rational &arg_2) { 00090 return arg_1 / arg_2; 00091 } 00092 00093 static rational 00094 GLUE_16 (const rational &arg_1, const integer &arg_2) { 00095 return arg_1 + arg_2; 00096 } 00097 00098 static rational 00099 GLUE_17 (const rational &arg_1, const integer &arg_2) { 00100 return arg_1 - arg_2; 00101 } 00102 00103 static rational 00104 GLUE_18 (const rational &arg_1, const integer &arg_2) { 00105 return arg_1 * arg_2; 00106 } 00107 00108 static rational 00109 GLUE_19 (const rational &arg_1, const integer &arg_2) { 00110 return arg_1 / arg_2; 00111 } 00112 00113 static rational 00114 GLUE_20 (const integer &arg_1, const rational &arg_2) { 00115 return arg_1 + arg_2; 00116 } 00117 00118 static rational 00119 GLUE_21 (const integer &arg_1, const rational &arg_2) { 00120 return arg_1 - arg_2; 00121 } 00122 00123 static rational 00124 GLUE_22 (const integer &arg_1, const rational &arg_2) { 00125 return arg_1 * arg_2; 00126 } 00127 00128 static rational 00129 GLUE_23 (const integer &arg_1, const rational &arg_2) { 00130 return arg_1 / arg_2; 00131 } 00132 00133 static generic 00134 GLUE_24 (const integer &arg_1, const integer &arg_2) { 00135 return old_integer_pow (arg_1, arg_2); 00136 } 00137 00138 static rational 00139 GLUE_25 (const rational &arg_1, const integer &arg_2) { 00140 return pow (arg_1, arg_2); 00141 } 00142 00143 static rational 00144 GLUE_26 (const rational &arg_1, const rational &arg_2) { 00145 return arg_1 / arg_2; 00146 } 00147 00148 static bool 00149 GLUE_27 (const rational &arg_1, const rational &arg_2) { 00150 return divides (arg_1, arg_2); 00151 } 00152 00153 static rational 00154 GLUE_28 (const rational &arg_1, const rational &arg_2) { 00155 return gcd (arg_1, arg_2); 00156 } 00157 00158 static rational 00159 GLUE_29 (const rational &arg_1, const rational &arg_2) { 00160 return lcm (arg_1, arg_2); 00161 } 00162 00163 static bool 00164 GLUE_30 (const rational &arg_1, const rational &arg_2) { 00165 return arg_1 == arg_2; 00166 } 00167 00168 static bool 00169 GLUE_31 (const rational &arg_1, const rational &arg_2) { 00170 return arg_1 != arg_2; 00171 } 00172 00173 static bool 00174 GLUE_32 (const rational &arg_1, const rational &arg_2) { 00175 return arg_1 < arg_2; 00176 } 00177 00178 static bool 00179 GLUE_33 (const rational &arg_1, const rational &arg_2) { 00180 return arg_1 <= arg_2; 00181 } 00182 00183 static bool 00184 GLUE_34 (const rational &arg_1, const rational &arg_2) { 00185 return arg_1 > arg_2; 00186 } 00187 00188 static bool 00189 GLUE_35 (const rational &arg_1, const rational &arg_2) { 00190 return arg_1 >= arg_2; 00191 } 00192 00193 static bool 00194 GLUE_36 (const rational &arg_1, const integer &arg_2) { 00195 return arg_1 == arg_2; 00196 } 00197 00198 static bool 00199 GLUE_37 (const rational &arg_1, const integer &arg_2) { 00200 return arg_1 != arg_2; 00201 } 00202 00203 static bool 00204 GLUE_38 (const rational &arg_1, const integer &arg_2) { 00205 return arg_1 < arg_2; 00206 } 00207 00208 static bool 00209 GLUE_39 (const rational &arg_1, const integer &arg_2) { 00210 return arg_1 <= arg_2; 00211 } 00212 00213 static bool 00214 GLUE_40 (const rational &arg_1, const integer &arg_2) { 00215 return arg_1 > arg_2; 00216 } 00217 00218 static bool 00219 GLUE_41 (const rational &arg_1, const integer &arg_2) { 00220 return arg_1 >= arg_2; 00221 } 00222 00223 static bool 00224 GLUE_42 (const integer &arg_1, const rational &arg_2) { 00225 return arg_1 == arg_2; 00226 } 00227 00228 static bool 00229 GLUE_43 (const integer &arg_1, const rational &arg_2) { 00230 return arg_1 != arg_2; 00231 } 00232 00233 static bool 00234 GLUE_44 (const integer &arg_1, const rational &arg_2) { 00235 return arg_1 < arg_2; 00236 } 00237 00238 static bool 00239 GLUE_45 (const integer &arg_1, const rational &arg_2) { 00240 return arg_1 <= arg_2; 00241 } 00242 00243 static bool 00244 GLUE_46 (const integer &arg_1, const rational &arg_2) { 00245 return arg_1 > arg_2; 00246 } 00247 00248 static bool 00249 GLUE_47 (const integer &arg_1, const rational &arg_2) { 00250 return arg_1 >= arg_2; 00251 } 00252 00253 static int 00254 GLUE_48 (const rational &arg_1) { 00255 return sign (arg_1); 00256 } 00257 00258 static rational 00259 GLUE_49 (const rational &arg_1) { 00260 return abs (arg_1); 00261 } 00262 00263 static rational 00264 GLUE_50 (const rational &arg_1, const rational &arg_2) { 00265 return min (arg_1, arg_2); 00266 } 00267 00268 static rational 00269 GLUE_51 (const rational &arg_1, const rational &arg_2) { 00270 return max (arg_1, arg_2); 00271 } 00272 00273 static rational 00274 GLUE_52 (const rational &arg_1, const integer &arg_2) { 00275 return min (arg_1, arg_2); 00276 } 00277 00278 static rational 00279 GLUE_53 (const rational &arg_1, const integer &arg_2) { 00280 return max (arg_1, arg_2); 00281 } 00282 00283 static rational 00284 GLUE_54 (const integer &arg_1, const rational &arg_2) { 00285 return min (arg_1, arg_2); 00286 } 00287 00288 static rational 00289 GLUE_55 (const integer &arg_1, const rational &arg_2) { 00290 return max (arg_1, arg_2); 00291 } 00292 00293 static rational 00294 GLUE_56 (const rational &arg_1, const rational &arg_2) { 00295 return min (arg_1, arg_2); 00296 } 00297 00298 static rational 00299 GLUE_57 (const rational &arg_1, const rational &arg_2) { 00300 return max (arg_1, arg_2); 00301 } 00302 00303 static rational 00304 GLUE_58 (const rational &arg_1, const integer &arg_2) { 00305 return min (arg_1, arg_2); 00306 } 00307 00308 static rational 00309 GLUE_59 (const rational &arg_1, const integer &arg_2) { 00310 return max (arg_1, arg_2); 00311 } 00312 00313 static rational 00314 GLUE_60 (const integer &arg_1, const rational &arg_2) { 00315 return min (arg_1, arg_2); 00316 } 00317 00318 static rational 00319 GLUE_61 (const integer &arg_1, const rational &arg_2) { 00320 return max (arg_1, arg_2); 00321 } 00322 00323 static rational 00324 GLUE_62 (const rational &arg_1) { 00325 return floor (arg_1); 00326 } 00327 00328 static rational 00329 GLUE_63 (const rational &arg_1) { 00330 return ceil (arg_1); 00331 } 00332 00333 static rational 00334 GLUE_64 (const rational &arg_1) { 00335 return trunc (arg_1); 00336 } 00337 00338 static rational 00339 GLUE_65 (const rational &arg_1) { 00340 return round (arg_1); 00341 } 00342 00343 static rational 00344 GLUE_66 (const mmx_modular(int) &arg_1) { 00345 return reconstruct (arg_1); 00346 } 00347 00348 static rational 00349 GLUE_67 (const mmx_modular(integer) &arg_1) { 00350 return reconstruct (arg_1); 00351 } 00352 00353 void 00354 glue_rational () { 00355 static bool done = false; 00356 if (done) return; 00357 done = true; 00358 call_glue (string ("glue_int")); 00359 call_glue (string ("glue_integer")); 00360 call_glue (string ("glue_modular_int")); 00361 call_glue (string ("glue_modular_integer")); 00362 define_type<rational > (lit ("Rational")); 00363 define ("rational", GLUE_1); 00364 define ("rational", GLUE_2); 00365 define_converter ("upgrade", GLUE_3, PENALTY_INCLUSION); 00366 define_converter ("upgrade", GLUE_4, PENALTY_INCLUSION); 00367 define_converter ("upgrade", GLUE_5, PENALTY_INCLUSION); 00368 define ("/", GLUE_6); 00369 define ("numerator", GLUE_7); 00370 define ("denominator", GLUE_8); 00371 define ("integer?", GLUE_9); 00372 define ("-", GLUE_10); 00373 define ("square", GLUE_11); 00374 define ("+", GLUE_12); 00375 define ("-", GLUE_13); 00376 define ("*", GLUE_14); 00377 define ("/", GLUE_15); 00378 define ("+", GLUE_16); 00379 define ("-", GLUE_17); 00380 define ("*", GLUE_18); 00381 define ("/", GLUE_19); 00382 define ("+", GLUE_20); 00383 define ("-", GLUE_21); 00384 define ("*", GLUE_22); 00385 define ("/", GLUE_23); 00386 define ("^", GLUE_24); 00387 define ("^", GLUE_25); 00388 define ("div", GLUE_26); 00389 define ("divides?", GLUE_27); 00390 define ("gcd", GLUE_28); 00391 define ("lcm", GLUE_29); 00392 define ("=", GLUE_30); 00393 define ("!=", GLUE_31); 00394 define ("<", GLUE_32); 00395 define ("<=", GLUE_33); 00396 define (">", GLUE_34); 00397 define (">=", GLUE_35); 00398 define ("=", GLUE_36); 00399 define ("!=", GLUE_37); 00400 define ("<", GLUE_38); 00401 define ("<=", GLUE_39); 00402 define (">", GLUE_40); 00403 define (">=", GLUE_41); 00404 define ("=", GLUE_42); 00405 define ("!=", GLUE_43); 00406 define ("<", GLUE_44); 00407 define ("<=", GLUE_45); 00408 define (">", GLUE_46); 00409 define (">=", GLUE_47); 00410 define ("sign", GLUE_48); 00411 define ("abs", GLUE_49); 00412 define ("min", GLUE_50); 00413 define ("max", GLUE_51); 00414 define ("min", GLUE_52); 00415 define ("max", GLUE_53); 00416 define ("min", GLUE_54); 00417 define ("max", GLUE_55); 00418 define ("inf", GLUE_56); 00419 define ("sup", GLUE_57); 00420 define ("inf", GLUE_58); 00421 define ("sup", GLUE_59); 00422 define ("inf", GLUE_60); 00423 define ("sup", GLUE_61); 00424 define ("floor", GLUE_62); 00425 define ("ceil", GLUE_63); 00426 define ("trunc", GLUE_64); 00427 define ("round", GLUE_65); 00428 define ("reconstruct", GLUE_66); 00429 define ("reconstruct", GLUE_67); 00430 } 00431 }