关键字 (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, 满足i<j≤q的j,均有am*2^j(mod n)=1(实际上,当j>q时也成立)。
(∵(n-1)2=n2-2n+1≡1(mod n))
若n为素数,在首次遇到xm*2^i(mod n)=1(1≤i≤q)之前,
必有am*2^i(mod n)=n-1。(由定理:
若p为素数且0<x<p,则当x2≡1(mod p)时必有x=1或x=p-1。)
改进以后的Miller_Rabin的算法:
其他相关代码:
主程序代码:
本篇博客于2010/01/17前更新,谢谢^_^