[学习笔记]Miller Rabin测试
我们直接给出其测试方法。
将\(a^{n - 1} \equiv 1 (\bmod p)\)
的指数分解为\(n - 1 = u \times 2^t\),在每轮测试中随机出来的\(a\),先求\(a^u(\bmod n)\),对这个值执行最多\(t\)次平方操作,发现非平凡平方根时即可判断出不是素数。
一个较为正确的 \(Miller Rabin\)
Miller Rabin
// C++ Version
bool millerRabin(int n) {
if (n < 3 || n % 2 == 0) return n == 2;
int a = n - 1, b = 0;
while (a % 2 == 0) a /= 2, ++b;
for (int i = 1, j; i <= test_time; ++i) {
int x = rand() % (n - 2) + 2, v = quickPow(x, a, n);
if (v == 1) continue;
for (j = 0; j < b; ++j) {
if (v == n - 1) break;
v = (long long)v * v % n;
}
if (j >= b) return 0;
}
return 1;
}