#include #include u64int mulmod(u64int a, u64int b, u64int p) { u64int r = 0; while(b) { if(b & 1) r = (r + a) % p; a = (a << 1) % p; b >>= 1; } return r; } u64int modpot(u64int a, u64int b, u64int p) { u64int f = 1; while(b) { if(b & 1) f = mulmod(f, a, p); a = mulmod(a, a, p); b >>= 1; } return f; } int miller(u64int n, u64int a) { u64int s = 0, t = n - 1, j = 0; while(!(t & 1)) { t >>= 1; s++; } u64int x = modpot(a, t, n); if(x == 1) return 1; while(1) { if(x+1 == n) return 1; x = mulmod(x, x, n); j++; if((j > s) || (x == 1)) return 0; } } int main(int argc, char** argv) { srand(time(0)); int i; for(i=0;i<1000;i++) { u64int n = ((u64int) rand() << 32) | rand(), a; u64int topbound = ceil(4 * log(log(n))); int p = 1; for(a=1;a<=topbound;a++) { p = miller(n, a); if(!p) break; } // if(p) print("%lld\n", n); } return 0; }