/* GSoC12: Tobenna Peter, Igwe (Edited) */ double rattodouble(Rat a) { /*return (double)a.num/(double)a.den*/ int num, den; mptoi(a.num, &num, 1); mptoi(a.den, &den, 1); return (double)num / (double)den; }
void mixedtorealplan(int pl, Rat *mixed, Rat *rplan) { int r ; int i, len; int *list; mp num, den; /* numerator and denominator of sum */ mp x, y; list = TALLOC(nstrats[pl], int); /* for test purposes, we even compute the probability * of the empty sequence. Otherwise, we would start like this: * rplan[0] = ratfromi(1); * for (r = 1 .... */ for (r = 0; r < nseqs[pl]; r++) { itomp(0, num); itomp(1, den); len = seqtostratlist(firstmove[pl] + r, pl, list); for (i=0; i<len; i++) { itomp(mixed[list[i]].den, y); mulint (y, num, num); itomp(mixed[list[i]].num, x); mulint (den, x, x); linint (num, 1, x, 1); mulint (y, den, den); reduce(num, den) ; } /* mptoi( num, &(rplan[r].num), 1 ); */ if (mptoi( num, &(rplan[r].num), 1 )) printf(" numerator in mixed strategy probability %3d overflown\n", i); /* mptoi( den, &(rplan[r].den), 1 ); */ if (mptoi( den, &(rplan[r].den), 1 )) printf(" denominator in mixed strategy probability %3d overflown\n", i); } free(list); }
Rat ratadd (Rat a, Rat b) { /* a.num = a.num * b.den + a.den * b.num; a.den *= b.den; return ratreduce(a); */ mp num, den, x, y; itomp (a.num, num) ; itomp (a.den, den) ; itomp (b.num, x) ; itomp (b.den, y) ; mulint (y, num, num); mulint (den, x, x); linint (num, 1, x, 1); mulint (y, den, den); reduce(num, den) ; mptoi( num, &a.num, 1 ); mptoi( den, &a.den, 1 ); return a ; }
/* * Miller-Rabin probabilistic primality testing * Knuth (1981) Seminumerical Algorithms, p.379 * Menezes et al () Handbook, p.39 * 0 if composite; 1 if almost surely prime, Pr(err)<1/4**nrep */ int probably_prime(mpint *n, int nrep) { int j, k, rep, nbits, isprime; mpint *nm1, *q, *x, *y, *r; if(n->sign < 0) sysfatal("negative prime candidate"); if(nrep <= 0) nrep = 18; k = mptoi(n); if(k == 2) /* 2 is prime */ return 1; if(k < 2) /* 1 is not prime */ return 0; if((n->p[0] & 1) == 0) /* even is not prime */ return 0; /* test against small prime numbers */ if(smallprimetest(n) < 0) return 0; /* fermat test, 2^n mod n == 2 if p is prime */ x = uitomp(2, nil); y = mpnew(0); mpexp(x, n, n, y); k = mptoi(y); if(k != 2){ mpfree(x); mpfree(y); return 0; } nbits = mpsignif(n); nm1 = mpnew(nbits); mpsub(n, mpone, nm1); /* nm1 = n - 1 */ k = mplowbits0(nm1); q = mpnew(0); mpright(nm1, k, q); /* q = (n-1)/2**k */ for(rep = 0; rep < nrep; rep++){ for(;;){ /* find x = random in [2, n-2] */ r = mprand(nbits, prng, nil); mpmod(r, nm1, x); mpfree(r); if(mpcmp(x, mpone) > 0) break; } /* y = x**q mod n */ mpexp(x, q, n, y); if(mpcmp(y, mpone) == 0 || mpcmp(y, nm1) == 0) continue; for(j = 1;; j++){ if(j >= k) { isprime = 0; goto done; } mpmul(y, y, x); mpmod(x, n, y); /* y = y*y mod n */ if(mpcmp(y, nm1) == 0) break; if(mpcmp(y, mpone) == 0){ isprime = 0; goto done; } } } isprime = 1; done: mpfree(y); mpfree(x); mpfree(q); mpfree(nm1); return isprime; }
// Miller-Rabin probabilistic primality testing // Knuth (1981) Seminumerical Algorithms, p.379 // Menezes et al () Handbook, p.39 // 0 if composite; 1 if almost surely prime, Pr(err)<1/4**nrep int probably_prime(mpint *n, int nrep) { int j, k, rep, nbits, isprime = 1; mpint *nm1, *q, *x, *y, *r; if(n->sign < 0) sysfatal("negative prime candidate"); if(nrep <= 0) nrep = 18; k = mptoi(n); if(k == 2) // 2 is prime return 1; if(k < 2) // 1 is not prime return 0; if((n->p[0] & 1) == 0) // even is not prime return 0; // test against small prime numbers if(smallprimetest(n) < 0) return 0; // fermat test, 2^n mod n == 2 if p is prime x = uitomp(2, nil); y = mpnew(0); mpexp(x, n, n, y); k = mptoi(y); if(k != 2){ mpfree(x); mpfree(y); return 0; } nbits = mpsignif(n); nm1 = mpnew(nbits); mpsub(n, mpone, nm1); // nm1 = n - 1 */ k = mplowbits0(nm1); q = mpnew(0); mpright(nm1, k, q); // q = (n-1)/2**k for(rep = 0; rep < nrep; rep++){ // x = random in [2, n-2] r = mprand(nbits, prng, nil); mpmod(r, nm1, x); mpfree(r); if(mpcmp(x, mpone) <= 0) continue; // y = x**q mod n mpexp(x, q, n, y); if(mpcmp(y, mpone) == 0 || mpcmp(y, nm1) == 0) goto done; for(j = 1; j < k; j++){ mpmul(y, y, x); mpmod(x, n, y); // y = y*y mod n if(mpcmp(y, nm1) == 0) goto done; if(mpcmp(y, mpone) == 0){ isprime = 0; goto done; } } isprime = 0; } done: mpfree(y); mpfree(x); mpfree(q); mpfree(nm1); return isprime; }