Miller-Rabin素性测试算法详解

看了一些别人的博客,发现里面涉及到的公式没有证明,于是就打算自己写一篇比较详细的讲解。

先看两个引理及其证明(建议把证明搞懂)。

PS:以下图片均为作者用wps制作,如想使用请附上作者博客链接,谢谢O(∩_∩)O。


看完了上面的引理,那就可以正式开始Miller-Rabin算法的讲解了。

背景:

素性测试(即测试给定的数是否为素数)是近代密码学中的一个非常重要的课题。虽然Wilson定理(对于给定的正整数n,n是素数的充要条件为)给出了一个数是素数的充要条件,但根据它来素性测试所需的计算量太大,无法实现对较大整数的测试。目前,尽管高效的确定性的素性算法尚未找到,但已有一些随机算法可用于素性测试及大整数的因数分解。下面描述的Miller-Rabin素性测试算法就是一个这样的算法。

算法:

首先要知道费马定理只是n是素数的必要条件。即费马定理不成立,n一定是合数;费马定理成立,n可能是素数。接下来请看Miller-Rabin算法的分析过程。


如果仔细看的话,应该能看懂大致原理了,数论基础好的甚至都可以开始写代码了吧,哈哈。

示例代码如下:

typedef long long int ll;

ll mod_mul(ll a, ll b, ll mod)
{
    ll res = 0;
    while (b)
    {
        if (b & 1)
            res = (res + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return res;
}

ll mod_pow(ll a, ll n, ll mod)
{
    ll res = 1;
    while (n)
    {
        if (n & 1)
            res = mod_mul(res, a, mod);
        a = mod_mul(a, a, mod);
        n >>= 1;
    }
    return res;
}

// Miller-Rabin随机算法检测n是否为素数
bool Miller_Rabin(ll n)
{
    if (n == 2)
        return true;
    if (n < 2 || !(n & 1))
        return false;
    ll m = n - 1, k = 0;
    while (!(m & 1))
    {
        k++;
        m >>= 1;
    }
    for (int i = 1; i <= 20; i++)  // 20为Miller-Rabin测试的迭代次数
    {
        ll a = rand() % (n - 1) + 1;
        ll x = mod_pow(a, m, n);
        ll y;
        for (int j = 1; j <= k; j++)
        {
            y = mod_mul(x, x, n);
            if (y == 1 && x != 1 && x != n - 1)
                return false;
            x = y;
        }
        if (y != 1)
            return false;
    }
    return true;
}


  • 69
    点赞
  • 254
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Miller-Rabin素性测试算法是一种用于判断一个数是否为质数的算法。该算法基于费马小定理,使用随机数进行迭代运算,可以高效地判断一个数是否为质数。 具体来说,该算法将要判断的数记作n,随机选取一个小于n的正整数a,将a与n进行求模运算得到b。如果b等于0或者b等于n-1,则继续选择下一个a。否则,将b平方并对n取模,得到c。如果c等于1或者c等于n-1,则继续选择下一个a。否则,不断平方c并对n取模,直到c等于1或者迭代次数达到了一定阈值。如果c等于1,则n可能是一个合数;如果迭代过程中出现了c等于n-1的情况,则n很可能是一个质数。 为了提高判断的准确性,Miller-Rabin算法会进行多次随机迭代,每次选取不同的随机数a。随机迭代次数越多,判断结果的准确性越高,但计算时间也越长。 总之,Miller-Rabin素性测试算法是一种高效、准确的判断一个数是否为质数的算法,被广泛应用于密码学、计算机科学等领域。 ### 回答2: Miller-Rabin素性测试算法是一种用于判断一个数是否为素数的快速算法。该算法基于费马小定理,利用随机数的特性来判断一个数是否为素数。该算法的优势在于速度快且准确率高,同时能够应对大整数的素性测试。 该算法的具体步骤如下: 1. 首先确定待测试的数n,如果n为偶数,则直接判断n是否等于2,如果是则n为素数,因为2是最小的质数。 2. 若n为奇数,则写成n-1=2^r * d的形式,其中r为非负整数,d为奇数。 3. 接着随机选取一个整数a,且1 < a < n-1。计算a^d mod n,如果结果等于1或n-1,则可以认为n有很大的可能是素数,结束测试。 4. 若结果不等于1或n-1,则重复计算a^(2^j*d) mod n,直到出现下面两种情况之一:结果为1,或者出现了j=0,1,...,r-1时,结果为n-1。 5. 如果满足上述两种情况之一,则认为n有很大的可能是素数,结束测试。否则,重新随机选取一个a,重复上述操作进行测试。 需要说明的是,该算法的准确率可以通过多次测试进行提高。一般来说,重复进行10~20次检验,即可认为检验结果是正确的。 总之,Miller-Rabin素性测试算法是一种简单高效的素数测试算法,可以广泛应用于需要高精度计算的场合。它在加密、密码学等领域中,有着重要的应用价值。 ### 回答3: Miller-Rabin素性测试算法是一种用于判断一个数是否为素数的算法,名字来源于两位发明者:Gary L. Miller和Michael O. Rabin。与其它素数检测算法不同,Miller-Rabin素性测试算法有极高的概率能够正确地识别素数,其准确率可以达到误判的可能性小于$\frac{1}{4}$。 Miller-Rabin素性测试算法的基本原理是利用了费马小定理和欧拉判别法,即对于一个素数$p$和$a<p$,有$a^{p-1} \equiv 1 \pmod{p}$,而对于合数$n=pq$,其中$p,q$为大于1的素数,则在模n下,$a^{n-1} \equiv 1 \pmod{n}$,并且除了一些“小概率事件”外,$a^{(n-1)/2} \equiv \pm 1 \pmod{n}$。 Miller-Rabin 素性测试算法的流程如下: 1.将$n-1$分解成$2^sd$的形式,其中$d$是奇数。 2.对于给定的$a<n$,利用费马小定理,计算$a^d \pmod{n}$。 3.如果$a^d \equiv 1 \pmod{n}$,则认为$n$可能是一个素数,算法结束。 4.对于$0\leq r \leq s-1$,如果$a^{2^rd} \equiv -1 \pmod{n}$,则认为$n$可能是一个素数,算法结束。 5.如果$a^{2^sd} \not \equiv 1 \pmod{n}$或$a^{2^{r}d} \not \equiv -1 \pmod{n}$(其中$0\leq r \leq s-1$),则认为$n$不是素数,算法结束。 通过多次进行以上的步骤,可以提高算法的准确率。 Miller-Rabin素性测试算法是一种在计算机领域经常使用的算法,其特点是计算量较小、正确率较高、可扩展性好。在计算机安全领域,该算法被广泛地应用于RSA算法中,用于加密和解密数据。虽然该算法在某些情况下会出现一定的偏差,但是通过多次计算,可以达到一个非常高的准确率。因此,在实际应用中,Miller-Rabin素性测试算法是一个非常实用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值