【发布时间】:2013-12-24 14:45:10
【问题描述】:
我有所有可以存储在 32 位 unsigned int 中的素数,并且我想用它们来生成一些 64 位素数。即使在逻辑和编译方面进行了优化,使用试除法也太慢了。
我正在尝试修改埃拉托色尼筛法以使用预定义列表,如下所示:
- 在数组 A 中,从 2 到 4294967291
- 在数组 B 中从 2^32 到 X 增加 1
- 找到当前素数的第一个倍数的 C。
- 从 C 标记并按当前素数跳转到 X。
- 转到 1。
问题是步骤 3 使用模数来找到素数倍数,这样的操作是我没有使用轨迹除法的原因。
有没有更好的方法来实现第 3 步或整个算法。
谢谢。
【问题讨论】:
-
你需要多少个素数?
-
0xFFFFFFFFFF的所有素数,我想计算它们。 -
3 给我的印象是每个素数的 O(1),而 4 给我的感觉更像是每个素数的 O(X),你能详细说明为什么你认为 3 是个问题吗?
-
0xFFFFFFFFFF 只有 40 位。这比 64 位要少得多。
-
3 只需要固定时间。如果你的上限是 0xFFFFFFFFFF,你只需要在 seive 中小于 0xFFFFF 的素数。
标签: c++ algorithm primes sieve-of-eratosthenes