我需要在非常大的数字(在很长的范围内)之间的间隔上测试素数,所以我需要一些快速算法来检查数字是否为素数。请提出您的想法。
答案 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)
我提出了一个非常好的算法,比检查所有除数要快得多 - 这当然也让我破解了公钥加密。
坚持 - 我只需要关闭窗户,所有这些黑色直升机都在头顶上........
答案 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(最大的已知素数)。