我需要在非常大的数字区间(long long范围内)上测试素数,因此我需要一些快速的算法来检查一个数字是否为素数。请提出你的想法。
我需要在非常大的数字区间(long long范围内)上测试素数,因此我需要一些快速的算法来检查一个数字是否为素数。请提出你的想法。
一个好的方法是使用Miller-Rabin素性检验。然而需要注意的是,这只是一种概率性测试。
Jim Sinclair证明了Miller-Rabin测试对于基数2、325、9375、28178、450775、9780504、1795265022可以确定地测试小于2^64的数字是否为质数。请参阅http://miller-rabin.appspot.com/。
我认为目前(非概率)素数测试中渐进最快的是“Lenstra / Pomerance改进的AKS”,其复杂度基本上是O(n^6)。
然而,long long
的范围(假设典型系统为64位整数)并不是很大。特别是,在小于2^32的范围内只有约两亿个质数,因此在该范围内使用快速概率测试,再用预先计算好的质数列表进行试除运算(或者如果你有质数列表,直接在列表中查找数字),将会非常快,并且可能是正确的方法。
如果您想测试一个长整型数是否为质数,那么Baillie PSW质性测试是一个不错的选择。这个测试只需要进行一次强伪素数测试和一次Lucas测试,因此速度非常快。预计有一些组合数可以通过此测试,但迄今为止没有已知的例外,且在1015以下肯定不存在。例如,Mathematica中使用了这个测试的变体。
在我看来,最好的算法是“ALI素性测试”。
最快的方法可能是在预先计算好的质数列表中查找。例如,请参见此处,他们拥有高达2^43112609-1(已知最大质数)。
pi(2^64)
的粗略估计,即使没有进行压缩,这个列表所需的存储空间将超过十亿吉字节。 - Dietrich Epp