用于素数生成的动态筛选算法

时间:2011-09-26 18:02:54

标签: java c++ algorithm primes sieve

我正在实施Eratosthenes的Sieve,对此进行解释http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes。但是我想让它适应它来生成M素数,而不是素数1到N.我这样做的方法就是创建一个足够大的N,使得所有M素数都包含在这个范围内。有没有人有任何良好的启发式来模拟素数的增长?如果您希望发布代码片段,我将在Java和C ++中实现它。

5 个答案:

答案 0 :(得分:4)

要生成M素数,您需要达到大约M log M.请参阅Approximations for the nth prime number中关于素数定理的this Wikipedia article。为了安全起见,你可能想要高估 - 比如N = M(log M + 1)。

编辑添加:正如David Hammen指出的那样,这种高估并不总是足够好。维基百科文章将M(log M + log log M)作为M> = 6的安全上限。

答案 1 :(得分:3)

第n个素数的近似值来自维基百科;因此,您只需要分配一个m*log(m)+m*log(log(m))的数组; <{1}}数组效率不高。

答案 2 :(得分:1)

另一种替代方案是分段筛。筛选数字到一百万。然后是第二个百万。然后是第三个。等等。当你有足够的时候停止。

为下一段重置筛子并不困难。有关详细信息,请参阅我的blog

答案 3 :(得分:0)

为什么不动态地筛选筛子?每当你需要更多质数时,重新分配seive内存,并使用先前找到的素数在新空间上运行筛选算法。

答案 4 :(得分:0)

想到了懒惰的评估(比如Haskell和其他函数式语言为你做的)。虽然你用命令式语言写作,但你可以应用我认为的概念。

考虑从候选集中删除剩余基数的操作。在没有真正触及真实算法的情况下(更重要的是没有猜测你将创建多少个数字),以懒惰的方式执行此操作(必须实现,因为当你试图获取最小的剩余数字时,你会使用命令式语言。