Miller-Rabin快速素性判断
利用 二次探测定理和 费马小定理
二次探测定理:
\(x ^2 \equiv 1 (mod \; p)\) \(p\) 是奇素数
当且仅当 $x \equiv 1 $ 或者 \(x \equiv -1\)
我们结合费马小定理,对于将要检验的数 \(p\) ,使用一个底数 \(a\)
若 $ a ^{p - 1} \neq 1 (mod p) $ 则一定不是质数
令 $p - 1= 2 ^ t \times u $,我们取 $b = a ^ t $
对其进行 \(t\) 次二次探测检验,再将最后的结果进行 Fermat 素性测试
$2, 3, 5, 7 $ 四个底数已经可以在 \(10^{12}\) 内实现确定性素性测试
\(2, ....37\) 可以在 \(2 ^ {78}\) 内确定性判素
点击查看代码
ll qpow(ll a, ll p, ll mod) {
ll base = 1;
for(; p; p >>= 1, a = mul(a, a, mod))
if(p & 1) base = mul(base, a, mod);
return base % mod;
}
ll Test[10] = {2, 3, 5, 7, 11, 13, 17};
bool Query(ll P) {
if(P == 1) return 0;
ll t = P - 1, k = 0;
while(!(t & 1)) k++, t >>= 1;
for(int i = 0; i < 4; i++) {
if(P == Test[i]) return 1;
// Test[i] = rr(1, P-2);
ll a = qpow(Test[i], t, P), nxt = a;
for(int j = 1; j <= k; j++) {
nxt = mul(a, a, P);
if(nxt == 1 && a != 1 && a != P - 1) return 0;
a = nxt;
}
if(a != 1) return 0;
}
return 1;
}