最快的素数测试算法

时间:2010-04-06 16:43:37

标签: c++ algorithm math primes

我需要在非常大的数字(在很长的范围内)之间的间隔上测试素数,所以我需要一些快速算法来检查数字是否为素数。请提出您的想法。

10 个答案:

答案 0 :(得分:19)

一个好的方法是Miller-Rabin测试。但应该指出,这只是一种概率测试。

答案 1 :(得分:17)

Jim Sinclair证实,对7个碱基2,355,9375,28178,450775,9780504,1795265022进行了Miller-Rabin检验,以确定性地检验小于2 ^ 64的数是否为素数。请参阅 http://miller-rabin.appspot.com/

答案 2 :(得分:10)

我相信渐近最快的当前(非概率)素性测试是“Lenstra / Pomerance改进的AKS”,其复杂性基本上是O(n ^ 6)。

然而,long long的范围(假设典型系统是64位整数)并不是那么大。特别是,只有大约2亿个质数小于2 ^ 32,因此使用快速概率检验,然后使用预先计算的素数列表进行试验分割(或者只是查看素数列表中的数字,如果有的话)在这个范围内会非常快,并且可能是正确的方法。

答案 3 :(得分:7)

我建议使用GNU MP library算法的Miller-Rabin。我已经用了几个月而且速度非常快。

具体来说,函数mpz_probab_prime_p执行此操作,您还可以使用另一个函数mpz_nextprime来查找大于数字的下一个素数。如果您愿意,我可以发布代码示例。

答案 4 :(得分:6)

我提出了一个非常好的算法,比检查所有除数要快得多 - 这当然也让我破解了公钥加密。

坚持 - 我只需要关闭窗户,所有这些黑色直升机都在头顶上........

(或查看How can I test for primality?

答案 5 :(得分:5)

如果你想长时间测试素数,那么Baillie PSW primality test是个不错的选择。该测试进行了一次强伪测试和一次Lucas测试,因此非常快。预计存在一些通过该测试的复合材料,但到目前为止还没有人知道,并且在10 15 之下肯定没有例外。该测试的变体例如在Mathematica中使用。

答案 6 :(得分:1)

Cobbal和grokus是对的。 Miller-Rabin测试是最有用的算法。是的,这是概率性的,但实际上不应该吓跑你。该测试是最广泛用于实际目的。

请注意,重复测试可以使误报的概率(没有假阴性)变得任意小。

答案 7 :(得分:1)

在这里看看我的答案:

how to test a prime number 1000 digits long?

测试非常快。如果你在64位或更小的范围内工作,你可以使用30030投入GCD,为大多数数字节省一点时间。

答案 8 :(得分:-1)

我认为最好的算法是“ALI素性测试”。

答案 9 :(得分:-3)

最快可能是在预先计算的素数列表中查找它。见here for example,它们最多有2 ^ 43112609-1(最大的已知素数)。