使用Haskell计算Prime因子

时间:2014-08-22 16:53:46

标签: algorithm haskell math primes prime-factoring

我通过浏览learnyouahaskell来学习haskell,做了haskellwiki的99个问题,并且还计划了euler问题。我昨天大部分时间都在PE problem 3工作,没有成功,因为我的所有解决方案都会运行很长一段时间并且我的电脑耗尽了。我通读haskell wiki page on prime numbers但仍然没有成功,所以我放弃并查看了here发布的解决方案。

以下是代码:

primes = 2 : filter ((==1) . length . primeFactors) [3,5..]

primeFactors n = factor n primes
    where
        factor n (p:ps) 
            | p*p > n        = [n]
            | n `mod` p == 0 = p : factor (n `div` p) (p:ps)
            | otherwise      = factor n ps

它很快,它会立即吐出答案,但我不能围绕这段代码。具体来说,primes功能以及过滤器发生了什么,以及primes调用primeFactorsprimeFactors调用primes的方式。如果我在GHCI中运行primes,它会创建一个无限的素数列表,我无法找出原因。

1 个答案:

答案 0 :(得分:2)

我目前正在通过Euler项目问题​​并实施一个基于主筛的非常基本的解决方案,并且遇到与您的解决方案相同的问题,因为它会长时间运行任何数量的中等大小或更大

正如meditans在对你的问题的评论中所说的那样,看看this question,特别是Will Ness的第一个评论和接受的答案,这些都对我有很大帮助。

我还发现这两个HaskellWiki页面帮助我理解解决方案以及为其他问题编写自己的函数。

Haskell Lazy Evaluation

Performance/Laziness