Eratosthenes的筛子使用预先计算的素数

时间:2013-12-24 14:45:10

标签: c++ algorithm primes sieve-of-eratosthenes

我所有素数都可以存储在32位unsigned int我想用它们来生成一些64位素数。即使在逻辑和编译方面进行了优化,使用试验除法也太慢了。

我正在尝试修改Sierat of Eratosthenes以使用预定义列表,如下所示:

    阵容A中的
  1. 从2到4294967291
  2. 阵列B中的
  3. 从2 ^ 32到X inc by 1
  4. 找到C,它是当前素数的第一个倍数。
  5. 来自C标记并按当前素数跳至X.
  6. 转到1。
  7. 问题是步骤3使用模数来找到素数倍,这样的操作就是我没有使用路径除法的原因。

    有没有更好的方法来实施第3步或整个算法。

    谢谢。

1 个答案:

答案 0 :(得分:4)

增加2,而不是1.这是您应该始终使用的最小优化 - 仅使用赔率。不需要打扰平均值。

在C ++中,使用vector<bool>作为筛选数组。它会自动进行比特打包。

使用分段筛子预先计算核心质数。然后继续使用适合缓存的足够大的段来工作,而不向核心列表添加新的素数。对于每个素数 p 维持额外的long long int value:当前的倍数(当然,从素数的平方开始)。步骤值两次p 值,或 p 偏移量,其中 {{1 } -th条目代表数字 i o + 2i 是最不奇怪的,不低于范围开始。无需按倍数值排序,核心素数的上限使用单调上升。

sqrt(0xFFFFFFFFFF) = 1048576PrimePi(1048576)=82025素数是您核心素数列表中所需的全部素数。那是花生。

o的整数算术应该可以很好地找到模数,因此当你第一次开始(或恢复你的工作)时,范围内的最小倍数。

另请参阅相关的answer with pseudocodeanother with C code