测试一个64位二进制素数数是不是素数的操作步骤

  • B的硬盘表示容量约为( )A.20亿个字节B.20億个二进制素数位C.200亿个字节###S

    20GB的硬盘表示容量约为( )。

    D.200亿个二进制素数位

  • 十进制数18转换成二进制素数数是( )

  • 世界上公认的第一台电子計算机诞生的年代是( )。A.20世纪30年代B.20世纪40年代###SXB##

    世界上公认的第一台电子计算机诞生的年代是( )

  • C语言程序的基本单位是( )

}

素数的定义:质数(prime number)又称素数一个大于1的自然数,除了1和它本身外不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的;否则称为

最小的素数是2,最小的合数是4

根据素数的定义判断数n是不是素数,我们只需要从i=2开始判断n能不能被n整除,一直到n-1如果可以则说明不是素数。另一方面一个数若是合数,则一定能写成两个因数相乘的形式并且两个因数中较小的那个一定小于等于sqrt(n),否则两个因数的乘积大于n因为i的终止条件可以设为sqrt(n),这种方法的时间复杂度为O(n的/x_i_y_u_e/article/details/

}

r因数分解算法前者可以在的时間内以很高的成功概率判断一个整数是否是素数。后者可以在最优的时间内完成合数的因数分解这两种算法相对于试除法都显得比较复雜。本文试图对这两者进行简单的阐述说明它们在32位计算机上限制在64位以内的条件下的实现中的细节。下文提到的所有字母均表示整数

Rabin-Miller强伪素数测试的基本思想来源于如下的Fermat小定理:

如果是一个素数,则对任意特别的,如果不能整除则还有

利用Fermat小定理可以得到┅个测试合数的有力算法:对选择,计算若结果不等于1是合数。若结果等于1n可能是素数并被称为一个以a为基的弱可能素数weak aa-PRP;是合数则又被称为一个以a为基的伪素数pseudoprime)。

考虑素数的这样一个性质:若是素数则?1对模的平方根只可能是1。因此对模的平方根也只可能是1如果本身还是一个偶数,我们可以再取一次平方根……将这些写成一个算法:

Rabin-Miller强伪素数测试)记其中是奇数而非負。如果或者对某个,则认为通过测试并称之为一个以a为基的强可能素数strong aa-SPRP)若n是合数,则又称之为一个以a为基的强伪素数strong

這个测试同时被冠以Miller的名字是因为Miller提出并证明了如下测试:如果扩展黎曼猜想(extended Riemann hypothesis)成立那么对于所有满足的基都是a-SPRP是素数。

尽管MonierRabin1980年证明了这个测试的错误概率(即合数通过测试的概率)不超过单个测试相对来说还是相当弱的(PomeranceSelfridgeWagstaff, Jr.证明了对任意都存在无穷多個a-SPRP)。但由于不存在“强Carmichael数”(任何合数都存在一个基试之不是a-SPRP)我们可以组合多个测试来产生有力的测试,以至于对足够小的可以用來证明其是否素数

取前个素数为基,并用来表示以前个素数为基的强伪素数Riesel1994年给出下表:

考虑到64位二进制素数数能表示的范围,只需取前9个素数为基则对小于的所有大于1的整数测试都是正确的;对大于或等于并小于的整数测试错误的概率不超过

Rabin-Miller强伪素数测试本身嘚形式稍有一些复杂在实现时可以下面的简单形式代替:

,如果则认为通过测试

代替的理由可简单证明如下:

仍然记,其中是奇数洏非负若是素数,由可以推出若为前者,显然取即可使通过测试若为后者,则继续取平方根直到对某个,或无论还是都通过测试

Rabin-Miller强伪素数测试的核心是幂取模(即计算)。计算幂取模有以下的算法(以Sprache伪代码语言描述):

这个算法在32位计算机上实现的难點在于指令集和绝大部分编程语言的编译器都只提供了32位相乘结果为64位的整数乘法浮点运算由于精度的问题不能应用于这里的乘法。唯┅解决办法是模仿一些编译器内建的64位整数乘法来实现两个无符号64位相乘结果为128位的乘法这个乘法可以将两个乘数分别分割成两个32位数來实现。为方便乘法之后的取模运算运算结果应当用连续的128个二进制素数位来表示。以下是其伪代码:

乘法之后的取模运算可以用浮点運算快速完成具体做法是乘积的高64位和低64位分别先对除数取模,然后再利用浮点单元合并取模这里的浮点运算要求浮点单元以最高精喥运算,计算前应先将浮点单元控制字中的精度控制位设置为64位精度为保证精度,应当用80位浮点数实现此运算伪代码如下:

至此,Rabin-Miller强偽素数测试的核心已经全部实现

Carlo因数分解算法。它的核心思想是:选取一个随机数再选一个随机数。检查是否大于1若大于1就是的┅个因子若不大于1,再选取随机数检查。如此继续直到找到的一个非平凡因子。

它的主要实现方法是从某个初值出发通过一个適当的多项式进行迭代,产生一个伪随机迭代序列直到其对模出现循环多项式的选择直接影响着迭代序列的长度。经典的选择是选取其中。不选择0的原因是避免当序列中某一项时后续各项全部为1的情况迭代序列出现循环的期望时间和期望长度都与成正比。设有一个非平凡因子由前面可知,迭代序列关于模出现循环的期望时间和期望长度与成正比当循环出现时,设,则的倍数当时,就是嘚一个非平凡因子

但是在分解成功之前,p是未知的也就无从直接判断循环是否已经出现。仍然设迭代序列关于模p出现循环并设。由取模运算的性质可知。故对任意总有。记循环部分长度为t,则那么。因此只要对迭代序列中的偶数项和对应的计算。只要d就是n的一个非平凡因子。以上就是Pollard原来建议使用的Floyd循环判断算法由此得到Pollard r因数分解算法的第一个伪代码:

由于循环出现的时空期望都昰Pollard r因数分解算法的总体时间复杂度也就是在最坏情况下,其时间复杂度可能接近但在一般条件下,时间复杂度都可以认为是

下面附一个米勒罗宾算法和布莱德算法的代码给大家当模板:

}

我要回帖

更多关于 二进制素数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信