我所有素数都可以存储在32位unsigned int
和我想用它们来生成一些64位素数。即使在逻辑和编译方面进行了优化,使用试验除法也太慢了。
我正在尝试修改Sierat of Eratosthenes以使用预定义列表,如下所示:
问题是步骤3使用模数来找到素数倍,这样的操作就是我没有使用路径除法的原因。
有没有更好的方法来实施第3步或整个算法。
谢谢。答案 0 :(得分:4)
增加2,而不是1.这是您应该始终使用的最小优化 - 仅使用赔率。不需要打扰平均值。
在C ++中,使用vector<bool>
作为筛选数组。它会自动进行比特打包。
使用分段筛子预先计算核心质数。然后继续使用适合缓存的足够大的段来工作,而不向核心列表添加新的素数。对于每个素数 p
维持额外的long long int value
:当前的倍数(当然,从素数的平方开始)。步骤值两次p
值,或 p
偏移量,其中 {{1 } -th条目代表数字 i
, o + 2i
是最不奇怪的,不低于范围开始。无需按倍数值排序,核心素数的上限使用单调上升。
sqrt(0xFFFFFFFFFF) = 1048576。 PrimePi(1048576)=82025素数是您核心素数列表中所需的全部素数。那是花生。
o
的整数算术应该可以很好地找到模数,因此当你第一次开始(或恢复你的工作)时,范围内的最小倍数。