- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
64位以內RabinMiller强伪素数测试和Pollardrho因数分解算法的实现
64位以内Rabin-Miller强伪素数测试和Pollard ?因数分解算法的实现
在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard ?因数分解算法。前者可以在的时间内以很高的成功概率判断一个整数是否是素数。后者可以在最优的时间内完成合数的因数分解。这两种算法相对于试除法都显得比较复杂。本文试图对这两者进行简单的阐述,说明它们在32位计算机上限制在64位以内的条件下的实现中的细节。下文提到的所有字母均表示整数。
一、Rabin-Miller强伪素数测试
Rabin-Miller强伪素数测试的基本思想来源于如下的Fermat小定理:
如果p是一个素数,则对任意a有。特别的,如果p不能整除a,则还有。
利用Fermat小定理可以得到一个测试合数的有力算法:对,选择,计算,若结果不等于1则n是合数。若结果等于1则n可能是素数,并被称为一个以a为基的弱可能素数(weak probable prime base a,a-PRP);若n是合数,则又被称为一个以a为基的伪素数(pseudoprime)。
这个算法的成功率是相当高的。在小于25,000,000,000的1,091,987,405个素数中,一共只用21,853个以2为基的伪素数。但不幸的是,Alford、Granville和Pomerance在1994年证明了存在无穷多个被称为Carmichael数的整数对于任意与其互素的整数a算法的计算结果都是1。最小的五个Carmichael数是561、1,105、1,729、2,465和2,801。
考虑素数的这样一个性质:若n是素数,则1对模n的平方根只可能是1和。因此对模n的平方根也只可能是1和。如果本身还是一个偶数,我们可以再取一次平方根……将这些写成一个算法:
(Rabin-Miller强伪素数测试)记,其中d是奇数而s非负。如果,或者对某个有,则认为n通过测试,并称之为一个以a为基的强可能素数(strong probable prime base a,a-SPRP)。若n是合数,则又称之为一个以a为基的强伪素数(strong pseudoprime)。
这个测试同时被冠以Miller的名字是因为Miller提出并证明了如下测试:如果扩展黎曼猜想(extended Riemann hypothesis)成立,那么对于所有满足的基a,n都是a-SPRP,则n是素数。
尽管Monier和Rabin在1980年证明了这个测试的错误概率(即合数通过测试的概率)不超过,单个测试相对来说还是相当弱的(Pomerance、Selfridge和Wagstaff, Jr.证明了对任意都存在无穷多个a-SPRP)。但由于不存在“强Carmichael数”(任何合数n都存在一个基a试之不是a-SPRP),我们可以组合多个测试来产生有力的测试,以至于对足够小的n可以用来证明其是否素数。
取前k个素数为基,并用来表示以前k个素数为基的强伪素数,Riesel在1994年给出下表:
考虑到64位二进制数能表示的范围,只需取前9个素数为基,则对小于的所有大于1的整数测试都是正确的;对大于或等于并小于的整数测试错误的概率不超过。
Rabin-Miller强伪素数测试本身的形式稍有一些复杂,在实现时可以下面的简单形式代替:
对,如果则认为n通过测试。
代替的理由可简单证明如下:
仍然记,其中d是奇数而s非负。若n是素数,由可以推出或。若为前者,显然取即可使n通过测试。若为后者,则继续取平方根,直到对某个有,或。无论还是,n都通过测试。
Rabin-Miller强伪素数测试的核心是幂取模(即计算)。计算幂取模有以下的算法(以Sprache伪代码语言描述):
这个算法在32位计算机上实现的难点在于指令集和绝大部分编程语言的编译器都只提供了32位相乘结果为64位的整数乘法,浮点运算由于精度的问题不能应用于这里的乘法。唯一解决办法是模仿一些编译器内建的64位整数乘法来实现两个无符号64位相乘结果为128位的乘法。这个乘法可以将两个乘数分别分割成两个32位数来实现。为方便乘法之后的取模运算,运算结果应当用连续的128个二进制位来表示。以下是其伪代码:
乘法之后的取模运算可以用浮点运算快速完成。具体做法是乘积的高64位和低64位分别先对除数取模,然后再利用浮点单元合并取模。这里的浮点运算要求浮点单元以最高精度运算,计算前应先将浮点单元控制字中的精度控制位设置为64位精度。为保证精度,应当用80位浮点数实现此运算。伪代码如下:
至此,Rabin-Miller强伪素数测试的核心已经全部实现。
二、Pollard ?因数分解算法
Pollard ?因数分解算法又称为Pollard Monte C
您可能关注的文档
最近下载
- 2025年高考真题地理(安徽卷)含答案 .pdf VIP
- 叉车操作技能大比武设计.doc VIP
- 电子线路陈其纯版第十四章时序逻辑电路.doc VIP
- 电力讲座课件_基于区块链技术的电力交易“六签”深化 应用.pptx VIP
- T∕CCIAT 0024-2020 全过程工程咨询服务管理标准.docx
- 小学二年级语文下册看图写话PPT课件(公开课).pptx VIP
- HBM T20WN technology data说明书用户手册.pdf
- 数学思想与方法模拟考试题及答案.pdf VIP
- 《视频监控知识培训》课件.ppt VIP
- 父亲节《哒哒哒-爸爸超人》【室内活动+创意美术】-.pptx VIP
文档评论(0)