好吧,也许我不应该把这个问题缩小太多......我已经看到the most efficient way to find the first 10000 primes上的帖子了。我正在寻找所有可能的方式。我们的目标是为素性测试提供一站式服务。我们欢迎所有人都知道找到素数的测试。
所以:
答案 0 :(得分:3)
某些素数测试仅适用于某些数字,例如,Lucas–Lehmer测试仅适用于梅森数。
用于大数字的大多数素数测试只能告诉你某个数字“可能是素数”(或者,如果数字未通过测试,则肯定是不素数)。通常,您可以继续算法,直到数字为素数的概率非常高。
请查看this page,尤其是“另请参阅”部分。
我认为Miller-Rabin test是最好的测试之一。在它的标准形式中,它给出了可能的素数 - 尽管已经证明,如果你将测试应用于3.4 * 10 ^ 14以下的数字,并且它通过了每个参数的测试2,3,5,7,11,13和17,肯定是 prime。
AKS test是第一个确定性的,经证实的,一般的多项式时间测试。但是,据我所知,它的最佳实现结果比其他测试慢,除非输入非常大。
答案 1 :(得分:2)
The Sieve of Eratosthenes是一个不错的算法:
- 将正整数列表2取为任何给定的天花板。
- 获取列表中的下一个项目(第一次迭代中的2个)并从列表中删除它的所有倍数(超出第一个)。
- 重复步骤2,直到达到给定的天花板。
- 你的名单现在纯粹由素数组成。
醇>
此算法存在功能限制,因为它可以为内存交换速度。当生成非常大的素数列表时,内存容量需要急剧增加。
答案 2 :(得分:2)
对于给定的整数,我知道的最快素数检查是:
- 将2的列表添加到整数的平方根。
- 循环浏览列表,取其余整数 / 当前数字
醇>
- 如果列表中任何数字的余数为零,则整数不是素数。
- 如果列表中的所有数字的余数都不为零,则整数为素数。
醇>
它使用的内存明显少于The Sieve of Eratosthenes,并且对于个别数字通常更快。
答案 3 :(得分:2)
@ akdom对我的问题:
循环在我之前的建议中可以正常工作,并且您无需进行任何计算来确定数字是否均匀;在循环中,只需跳过每个偶数,如下所示:
//Assuming theInteger is the number to be tested for primality.
// Check if theInteger is divisible by 2. If not, run this loop.
// This loop skips all even numbers.
for( int i = 3; i < sqrt(theInteger); i + 2)
{
if( theInteger % i == 0)
{
//getting here denotes that theInteger is not prime
// somehow indicate that some number, i, divides it and break
break;
}
}
答案 4 :(得分:2)
罗格斯大学的一名研究生最近找到了recurrence relation that generates primes。其连续数字的差异将产生素数或1。
a(1) = 7
a(n) = a(n-1) + gcd(n,a(n-1)).
它需要过滤掉很多垃圾。 Benoit Cloitre也有这种复发,它做了类似的任务:
b(1) = 1
b(n) = b(n-1) + lcm(n,b(n-1))
然后,连续数的比率减去1 [b(n)/ b(n-1)-1]为素数。有关所有这些内容的完整说明,请参阅Recursivity。
对于筛子,你可以通过使用滚轮而不是每次添加一个来做得更好,查看Improved Incremental Prime Number Sieves。这是一个轮子的例子。让我们看看数字,2和5要忽略。他们的轮子是[2,4,2,2]。
答案 5 :(得分:0)
在使用从2到整数根的列表的算法中,你可以通过仅测试2之后的奇数来提高性能。也就是说,你的列表只需要包含2和从3到平方根的所有奇数整数。这样可以减少你在没有引入任何复杂性的情况下进行一半的次数。
答案 6 :(得分:0)
@theprise
如果我想使用递增循环而不是实例化列表(大量数字的内存问题......),那么在不构建列表的情况下这样做会有什么好办法?
对于给定的整数(X%3)进行可分性检查似乎比检查正常数字(N%X)更便宜。
答案 7 :(得分:-1)
如果您想找到一种生成素数的方法,previous question已涵盖了这一点。