【发布时间】:2019-07-03 13:19:15
【问题描述】:
我是 Haskell 的新手,对于我正在实现的东西,我需要一个素数列表。我试过写一个,但是太慢了。
这是我尝试过的。
primeList = primes 1000
primes :: Int -> [Bool]
primes x = primeRecursion 2 ([False,False] ++ replicate (x-1) True)
where primeRecursion y l
| y == x = l
| not (l!!y) = primeRecursion (y+1) l
| otherwise = primeRecursion (y+1) [ if (a>y && (a `mod` y == 0)) then False else l!!a | a <- [0..x]]
它有效,但算法复杂度高于程序等价物,因为对于每个素数,它都会遍历整个列表,而不仅仅是它的倍数。由于函数式编程的工作方式,我找不到使它成为 O(n (log n) (log log n)) 的方法。这样做的方法是什么(最好是简单明了)?
【问题讨论】:
-
另一篇文章是cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf。它不是基于您的文章,但它仍然是一个有趣的阅读。
-
对我来说,这是一本非常令人困惑的书,而数学部分确实很有启发性。
-
我之前使用的另一种方法是预先生成(或下载)足够大的素数列表,然后将它们加载到我的程序中。
标签: list haskell optimization primes sieve-of-eratosthenes