Algorithm
boolean millerRabin(long n, long a) {
if (n % a == 0) return n == a;
long d = n - 1; int s = 0;
while ((d & 1) == 0) { d >>= 1; s++; }
long x = modPow(a, d, n);
if (x == 1 || x == n - 1) return true;
for (int r = 1; r < s; r++) {
x = x * x % n;
if (x == n - 1) return true;
}
return false;
}Advertisement
Deterministic bounds
n < 3.3·10¹⁴: bases {2, 3, 5, 7, 11, 13, 17, 19, 23} deterministic. Full 64-bit: {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}.
Advertisement
Probability
k rounds with random bases: false-positive ≤ 4^(-k). k = 20 → ~10^(-12).
Complexity
O(k · log³ n) with big-int. O(k · log n) for 64-bit n with fast modmul.