判断素数(费马小定理)

1)Sieve of Eratosthenes筛法


由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。例如要查找100以内的质数,首先2是质数,把2的倍数去掉;此时3没有被去掉,可认为是质数,所以把3的倍数去掉;再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数肯定都有一个因子小于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。

 

2)费马小定理+二次探测


费马小定理: 如果P是一个素数,且0<a<p,则a^(p-1)≡1(mod p)。 例如,67是一个素数,则2^66mod 67=1。 利用费马小定理,对于给定的整数n,可以设计一个素数判定算法。通过计算d=2^(n-1)mod n来判定整数n的素性。当d不等于1时,n肯定不是素数;当d等于1时, n则很可能是素数。但也存在合数n使得2^(n-1)≡1(mod n)。例如,满足此条件的最小合数是n=341。为了提高测试的准确性,我们可以随机地选取整数1<a<n-1,然后用条件a^(n-1)≡1(mod n)来判定整数n的素性。例如对于n=341,取a=3时,有3^340≡56(mod 341)。故可判定n不是素数。 费马小定理毕竟只是素数判定的一个必要条件。满足费马小定理条件的整数n未必全是素数。有些合数也满足费马小定理的条件。这些和数被称做Carmichael数,前3个Carmichael数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,只有255个Carmichael数。利用下面的二次探测定理可以对上面的素数判定算法作进一步改进,以避免将Carmichael数当作素数。 二次探测定理 如果p是一个素数,且0<x<p,则方程x^2≡1(mod p)的解为x=1,p-1。

 

(3)模取幂

关于快速求 (a ^ p) mod n ,首先将 p 转化为二进制数, 即 p = CnCn-1...C1C0 , 其中 Cj(0=<j<=n) 等于 0 或 1,则 a ^ p = a ^ [C0*(2^0)] * a ^ [C1*(2^1)] * ... * a ^ [Cn*(2^n)] , 另外如果 a % b = k , 则a = nb + k,则a ^ 2 % b = (nb + k) % b = k ^ 2 % b = (a % b) * (a % b) % b ,由递归可求出a ^ 4 % b ,a ^ 8 % b ,......。又因为若a = b * c,那么a % n = [(b % n) * (c % n)] %  n。这样,(a^p)% n等于上面等式右边各项 % n。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值