完成计算后未关闭列表

时间:2018-07-06 08:00:52

标签: haskell list-comprehension

为了练习,我编写了一个Haskell程序来查找主要因素。

代码如下:

getfactors :: Int -> [Int]
getfactors n = [x | x<-[1..n], n `mod` x == 0]

prime :: Int -> Bool
prime n | getfactors n == [1,n] = True
        | otherwise              = False

primefactors :: Int -> [Int]
primefactors n = [x | x <- getfactors n, prime x == True]

对于较小的数字,一切都可以正常工作,但是当我输入较大的数字时,计算将以最大的质因数停止,预期的列表不会关闭。 例如:

>primefactors 1263
[3,421]
>primefactors 1387781234
[2,7,2161,6553

非常感谢您的解释。

1 个答案:

答案 0 :(得分:4)

无法复制:

> :set +s
> primefactors 1387781234
[2,7,2161,6553]
(368.04 secs, 288,660,869,072 bytes)

您的算法非常慢。有很多方法可以改善它:

  • 您正在通过试算除所有小于候选数的数字来检查素数。您可以通过仅检查候选人的平方根来改进(无需更改算法)。
  • 除审判部门外,还有各种各样的其他素数检查算法,其运行范围从“简单但缓慢”到“复杂而又快速”。其他Internet来源将提供大量详细信息。
  • 如果您想分解许多数字,记住两次通话之间的素数检查可能会比较有益-例如通过存储素数列表并对其进行迭代,而不是对所有数字进行迭代。由于这是唯一性检查的使用者,因此您可能需要考虑直接创建此列表,而不是首先实现一个唯一性检查算法;再次,有各种各样的算法可以使频谱从简单到快速运行。
  • 一旦找到一个因数,就可以将要乘以的因子除以那个,从而得到一个较小的,更快的数字,用以计算剩余因子。

可能还有其他简单的机会可以加快处理速度,还有很多先前的工作需要在线阅读。享受吧!