大素数测试

关键字 (keywords): 大素数 高效 快速 测试 检测 验证

 

 


先列出几篇已经写过的大素数测试的文章

基本都是用Miller_Rabin的测试方法

http://blog.csdn.net/fisher_jiang/archive/2006/07/27/986654.aspx

http://www.cppblog.com/zoyi-zhang/archive/2008/09/23/62572.aspx

但似乎都没有实现完整的代码,另外对于Miller_Rabin的方法还有可以改进的地方

 

 

Miller_Rabin的算法:

我们的问题是给定一个数n,想判断它到底是不是素数?

 

首先,根据公式:n - 1 = m * 2q,求出m和q(要求q,只要看n-1的二进制右边有多少个0就是q了)

若太大直接用2除,除到余数不为0为止,这样就可以得到m和q

再根据另外一个公式:(x为1,2,...,n-1中的一个数a的m次方,即am)判断x2%n是不是等于1,

      1. 如果等于1,并且判断x!=1和x!=n-1,就返回合数

      2. 如果不等于1,x=x2,判断x2%n,再到一步骤

如果总共q次循环以后,没有得出是合数,则判断x是不是等于1

如果不等于1,则还是合数

如果等于1,则是素数(满足fermat小定理)


为改进的Miller_Rabin的算法:时间复杂度:O((log(n))3)

 

 

1. 若am(mod n)=1,则a2m,a4m,,am*2^q(mod n)=1(后者是前者平方)

2. 如果对于某个非负整数i有am*2^i(mod n)=n-1,则对于所有

3, 满足ijqj,均有am*2^j(mod n)=1(实际上,当j>q时也成立)。

(∵(n-1)2=n2-2n+11(mod n)

n为素数,在首次遇到xm*2^i(mod n)=1(1iq)之前,

必有am*2^i(mod n)=n-1。(由定理:

p为素数且0<x<p,则当x21(mod p)时必有x=1x=p-1。)

 

 


改进以后的Miller_Rabin的算法:

 

 

 

 

其他相关代码:

 

 

 

 

主程序代码:

 

 

 

 

本篇博客于2010/01/17前更新,谢谢^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值