Miller_Rabin素数测验

本文介绍了一种快速的素数测试算法——Miller-Rabbin算法,该算法基于费马小定理,并通过随机测试来判断一个数是否为素数。文章详细解释了算法的流程,包括计算特定形式的N、选择随机数A进行多次测试等步骤,并给出了通过测试后N不是素数的概率计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.背景
数论学家利用费马小定理研究出了多种素数测试办法,Miller-Rabbin 素数测试算法是其中较快的一种。
二次探测定理:如果p是素数,且0<x<p,则方程x21(mod p)的解为1p1

2.过程
(1)计算奇数M,使得N=2^r * M + 1;
(2)选择随机数A<N;
(3)对于任意i<r,若A^(2^i*M) mod N = N - 1,则N通过随机数A的测试;
(4)或者,若A^M mod N = 1,则N通过随机数A的测试;
(5)让A取不同的值对N进行行多次测试(一般要求5~10次,有较高要求的话可以进行20~30次),若全部通过则判定N为素数;

3.概率计算
若N通过一次测试,则N不是素数的概率为25%;
若N通过 t 次测试,则N不是素数的概率为1/( 4 ^ t );
事实上,当 t = 5 时,N不是素数的概率已为1/128,已经大于99.99%。
在实际运用中,可首先用300~500个小素数对N进行测试,以提高测试通过的概率与算法的速度。在随机生成的素数中,选取的随机数最好让 r = 0,则可以省去步骤(3)的操作,进一步减少判定时间。

4.代码

// 18位素数:154590409516822759  
// 19位素数:2305843009213693951 (梅森素数)  
// 19位素数:4384957924686954497  
LL prime[6] = {2, 3, 5, 233, 331};  
const int time = 5;
LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘; O(1)乘法或者转化成二进制加法    
    return (x * y - (long long)(x / (long double)mod * y + 1e-3) *mod + mod) % mod;  
    /* 
    LL ret = 0; 
    while(y) { 
        if(y & 1) 
            ret = (ret + x) % mod; 
        x = x * 2 % mod; 
        y >>= 1; 
    } 
    return ret; 
    */  
}  
LL qpow(LL a, LL n, LL mod) {  
    LL ret = 1;  
    while(n) {  
        if(n & 1) ret = qmul(ret, a, mod);  
        a = qmul(a, a, mod);  
        n >>= 1;  
    }  
    return ret;  
}  
bool Miller_Rabin(LL p) {  
    if(p < 2) return 0;  
    if(p != 2 && p % 2 == 0) return 0;  
    LL s = p - 1;  
    while(! (s & 1)) s >>= 1;  
    for(int i = 0; i < 5; ++i) {  
        if(p == prime[i]) return 1;  
        LL t = s, m = qpow(prime[i], s, p);  
        while(t != p - 1 && m != 1 && m != p - 1) {  
            m = qmul(m, m, p);  
            t <<= 1;  
        }  
        if(m != p - 1 && !(t & 1)) return 0;  
    }  
    return 1;  
}  


阅读全文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值