如何计算无限的素数

时间:2008-08-10 18:11:08

标签: language-agnostic primes

好吧,也许我不应该把这个问题缩小太多......我已经看到the most efficient way to find the first 10000 primes上的帖子了。我正在寻找所有可能的方式。我们的目标是为素性测试提供一站式服务。我们欢迎所有人都知道找到素数的测试。

所以:

  • 查找素数的所有不同方法有哪些?

8 个答案:

答案 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是一个不错的算法:

  
      
  1. 将正整数列表2取为任何给定的天花板。
  2.   
  3. 获取列表中的下一个项目(第一次迭代中的2个)并从列表中删除它的所有倍数(超出第一个)。
  4.   
  5. 重复步骤2,直到达到给定的天花板。
  6.   
  7. 你的名单现在纯粹由素数组成。
  8.   

此算法存在功能限制,因为它可以为内存交换速度。当生成非常大的素数列表时,内存容量需要急剧增加。

答案 2 :(得分:2)

对于给定的整数,我知道的最快素数检查是:

  
      
  1. 将2的列表添加到整数的平方根。
  2.   
  3. 循环浏览列表,取其余整数 / 当前数字      
        
          
    1. 如果列表中任何数字的余数为零,则整数不是素数。
    2.     
    3. 如果列表中的所有数字的余数都不为零,则整数为素数。
    4.        
  4.   

它使用的内存明显少于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已涵盖了这一点。