155 lines
2.2 KiB
Text
155 lines
2.2 KiB
Text
/* 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
|