这不是作业,我只是好奇。
无限是这里的关键词。
我希望将其用作 for p in primes()
。我相信这是 Haskell 中的一个内置函数。
所以,答案不能像“做一个筛子”那样天真。
首先,你不知道会消耗多少个连续素数。好吧,假设你一次可以调制 100 个。您会使用相同的 Sieve 方法和素数频率公式吗?
我更喜欢非并发方法。
感谢您阅读(和写作 ;))!
原文由 Hamish Grubijan 发布,翻译遵循 CC BY-SA 4.0 许可协议
这不是作业,我只是好奇。
无限是这里的关键词。
我希望将其用作 for p in primes()
。我相信这是 Haskell 中的一个内置函数。
所以,答案不能像“做一个筛子”那样天真。
首先,你不知道会消耗多少个连续素数。好吧,假设你一次可以调制 100 个。您会使用相同的 Sieve 方法和素数频率公式吗?
我更喜欢非并发方法。
感谢您阅读(和写作 ;))!
原文由 Hamish Grubijan 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
“如果我看得更远……”
食谱中的
erat2
函数可以进一步加速(大约 20-25%):erat2a
not (x&1)
检查验证x
是奇数。但是,由于 ---q
和p
都是奇数,通过添加2*p
避免了一半的步骤以及奇数测试。erat3
如果不介意多花点心思,
erat2
可以通过以下更改加快 35-40%(注意:需要 Python 2.7+ 或 Python 3+,因为itertools.compress
功能):erat3
函数利用了所有素数(2、3、5 除外)模 30 结果只有八个数字:MODULOS
frozenset 中包含的那些。因此,在产生最初的三个素数后,我们从 7 开始, 只 处理候选素数。候选过滤使用
itertools.compress
函数; “魔术”在MASK
序列中;MASK
有 15 个元素(每 30 个数字中有 15 个奇数,由itertools.islice
函数选择)和1
开始7. 循环按照itertools.cycle
函数的指定重复。候选过滤的引入还需要修改:
or (x%30) not in MODULOS
勾选。erat2
算法处理了所有奇数;既然erat3
算法只处理 r30 个候选者,我们需要确保所有D.keys()
只能是这样的“假”候选者。基准
结果
在 Atom 330 Ubuntu 9.10 服务器上,版本 2.6.4 和 3.1.1+:
在 AMD Geode LX Gentoo 家庭服务器上,Python 2.6.5 和 3.1.2:
基准代码
一个
primegen.py
模块包含erat2
,erat2a
和erat3
函数以下是测试脚本: