用Haskell筛选素数

时间:2012-08-09 14:45:11

标签: haskell primes

好的,所以我试图编写一个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

1 个答案:

答案 0 :(得分:13)

优秀的StackOverflow教师D​​aniel 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