我知道实际应用中有许多素数测试算法(例如Eratosthenes筛法,Fermat测试,Miller-Rabin算法,AKS等),但它们要么速度较慢(如筛法),要么是概率性的(Fermat和Miller-Rabin),要么相对难以实现(AKS)。
什么是最好的确定性解决方案来确定一个数字是否为质数?
请注意,我主要(双关语意)感兴趣的是针对32位(也许是64位)数量级的数字进行测试。因此,不需要一个适用于更大数字的强大解决方案。
我能翻译编程相关内容。以下是需要翻译的内容:
在2的30次方
以内,您可以使用试除法进行暴力破解。
在3.4*10^14
以内,已经证明用前7个质数的Rabin-Miller算法是确定性的。
在此之上,您需要自己解决。目前没有已知的亚立方确定性算法。
编辑:我记得这一点,但直到现在我才找到参考资料:
http://reference.wolfram.com/legacy/v5_2/book/section-A.9.4
PrimeQ首先使用小质数进行可除性测试,然后使用Miller-Rabin强伪素数测试基于2和3,然后使用Lucas测试。
截至1997年,已知此过程仅对
n<10^16
正确,并且可以想象对于更大的n
,它可能会声称一个复合数是质数。
因此,如果您实现了Rabin-Miller和Lucas,则可以处理高达10^16的数据。
使用埃拉托斯特尼筛法预先计算尽可能多的质数,您可以每个数字使用一个位来存储,并通过仅筛选奇数(将2作为特殊情况)来减少一半的空间。
对于从Sieve.MAX_NUM
到Sieve.MAX_NUM
的平方的数字,您可以使用试除法,因为您已经列出了所需的质数。在更大的未分解残差上谨慎使用Miller-Rabin测试可以加快进程。
对于更大的数字,我会使用其中一种概率测试,Miller-Rabin是很好的选择,如果重复几次,可以得到比计算机硬件故障更不可能出错的结果。
2^64
的质数。32可以。 - Steve Jessop