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;
}
posted @ 2022-10-07 17:30  CDsidi  阅读(22)  评论(0编辑  收藏  举报