好的,所以我试图编写一个Haskell程序,它可以非常快速地计算素数。据推测,我不是第一个尝试这样做的人。 (特别是,我该死的确定我看到了一些现有技术,但我现在无法找到它......)
最初,我想计算小于10 ^ 11的素数。目前我已经让我的程序运行了大约15分钟,而且它还没到中途。一些狂热的C ++程序员声称他的程序只需要8 秒 分钟。很明显,我做了一件可怕的事情。
(如果重要的话,我当前的实现使用IOUArray Integer Bool
和多个线程来处理搜索空间的独立子范围。目前从10MB阵列块中删除所有2的倍数需要几秒钟... )
请注意,10 ^ 11对于32位算术来说太大了。此外,10 ^ 11位= 12.5 GB,远太多数据无法适应Haskell的32位地址空间。因此,您无法立即在内存中拥有整个位图。最后请注意,小于10 ^ 11的素数只是小于2 ^ 32的阴影,所以你也无法同时存储实际的整数。
编辑:显然我误读了时间信息。 C ++人实际声称的是:
计算素数< 10 ^ 11仅使用一个核心需要8分钟,使用4个核心需要56秒。 (未指定CPU类型。)
计算素数< 10 ^ 10需要5秒。 (不确定使用了多少个核心。)
抱歉错误......
修改:我的源代码可在此处找到:http://hpaste.org/72898
答案 0 :(得分:13)
优秀的StackOverflow教师Daniel Fischer使用包arithmoi
:
import Math.NumberTheory.Primes.Counting
main = print $ primeCount (10^11)
-- $ time ./arith
-- 4118054813
--
-- real 0m0.209s
-- user 0m0.198s
-- sys 0m0.008s
这比你的'狂热'C ++朋友写的快40倍;也许他可以学习一两件看Haskell来源......这里有the haddocks