| /* e(a, b, m) := a^b (mod m) */ |
| define e(a, b, m) { |
| auto s, sb; |
| |
| sb = obase; obase = 16; |
| s = 1; |
| while(b != 0) { |
| if((b % 2) == 1) { |
| s = (s * a) % m; |
| } |
| b /= 2; |
| a = (a * a) % m; |
| } |
| obase = sb; |
| return (s); |
| } |
| |
| /* g(a, b) := (a, b) */ |
| define g(a, b) { |
| auto r; |
| |
| while(b != 0) { |
| r = a % b; |
| a = b; |
| b = r; |
| } |
| if(a < 0) { |
| return(-a); |
| } else { |
| return(a); |
| } |
| } |
| |
| define a(x) { |
| if(x < 0) { |
| return (-x); |
| } else { |
| return (x); |
| } |
| } |
| |
| xgu = 0; xgv = 0; |
| define x(a, b) { |
| auto u, v, x, y, t, r; |
| |
| if(a(b) > a(a)) { |
| t = b; b = a; a = t; r = 1; |
| } else { |
| r = 0; |
| } |
| |
| u = 1; v = 0; |
| x = 0; y = 1; |
| |
| while(b != 0) { |
| t = a / b; |
| |
| a = a - (t * b); |
| v = v - (t * y); |
| u = u - (t * x); |
| |
| if(a(a) < a(b)) { |
| t = a; a = b; b = t; |
| t = v; v = y; y = t; |
| t = u; u = x; x = t; |
| } |
| } |
| |
| if(r) { |
| xgu = v; xgv = u; |
| } else { |
| xgu = u; xgv = v; |
| } |
| |
| if(a < 0) { |
| return (-a); |
| } else { |
| return (a); |
| } |
| } |
| |
| define i(a, m) { |
| auto c; |
| |
| c = x(a, m); |
| if(c != 1) |
| return(0); |
| |
| return ((xgu + m) % m); |
| } |
| |
| scale = 0 |
| rand_modulus = 2860385147 |
| rand_base = 129 |
| rand_seed = 10342799 |
| |
| define srand(s) { |
| rand_seed = s; |
| } |
| |
| define rand(n) { |
| auto r; |
| |
| r = (rand_seed * rand_base) % rand_modulus; |
| rand_seed = r; |
| return(r % n); |
| } |
| |
| define rand_digits(k) { |
| auto s; |
| |
| s = 0; |
| while(k > 0) { |
| s = (s * 10) + rand(10); |
| k = k - 1; |
| } |
| |
| return(s); |
| } |
| |
| define rval(ndigits, probneg) { |
| auto x; |
| x = rand_digits(ndigits); |
| if(probneg > 0 && rand(100) < probneg) |
| x = x * -1; |
| return(x); |
| } |
| |
| for(i = 2; i < 100; i += 4) { |
| value = rand_digits(i); |
| obase = 256; |
| print "readuns:", value; |
| obase = 10; |
| print ":", value, "\n" |
| } |
| |
| /* |
| for(i = 2; i < 100; i += 4) { |
| for(j = 0; j < 2; ++j) { |
| ndig = rand(7); |
| base = rval(ndig, 20); |
| expt = rand_digits(i); |
| mod = rand_digits(i); |
| |
| result = e(base, expt, mod); |
| if(result < 0) { |
| result = result + mod; |
| } |
| print "emodbv:", base, ",", expt, ",", mod, ",0:", result, "\n"; |
| print "emodbv:", base, ",", expt, ",", mod, ",=2:", result, "\n"; |
| print "emodbv:", base, ",", expt, ",", mod, ",=3:", result, "\n"; |
| } |
| } |
| */ |
| halt |