64位以内Rabin-Miller强伪素数测试和Pollard因数分解算法的实现在求解POJ1811题PrimeTest中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard因数分解算法
前者可以在的时间内以很高的成功概率判断一个整数是否是素数
后者可以在最优的时间内完成合数的因数分解
这两种算法相对于试除法都显得比较复杂
本文试图对这两者进行简单的阐述,说明它们在32位计算机上限制在64位以内的条件下的实现中的细节
下文提到的所有字母均表示整数
一、Rabin-Miller强伪素数测试Rabin-Miller强伪素数测试的基本思想来源于如下的Fermat小定理:如果p是一个素数,则对任意a有
特别的,如果p不能整除a,则还有
利用Fermat小定理可以得到一个测试合数的有力算法:对,选择,计算,若结果不等于1则n是合数
若结果等于1则n可能是素数,并被称为一个以a为基的弱可能素数(weakprobableprimebasea,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非负