【发布时间】:2014-06-23 22:14:09
【问题描述】:
所以,我承认我是 Haskell 新手,但到目前为止我非常喜欢它,因为我最近一直在挥霍质数。 (这就是让我喜欢它的原因)
我有这个相对基本的脚本。它完全按照应有的方式工作,即使它不是尽可能高效。不过,这不是我的问题。这是我的脚本:
import System.Environment
oddFactors p = [x | x<- [3,5..floor (sqrt (fromIntegral p))], p `mod` x == 0]
prime x = oddFactors (2^x -1) == []
main = do
args <- getArgs
print (prime (read (head args) :: Int))
就像我说的,很简单。 oddFactors 遍历从 3 到 sqrt(p) 的奇数,如果它是 p 的因子,则将其添加到列表中。
primes 在2^x -1 上调用oddFactors 并检查结果列表是否等于空列表。
奇怪的是,它似乎已经被优化了。在primes 的情况下,如果我要这样做,例如 61,我的程序需要 49 秒才能运行并返回 True。但是,如果我执行 60 或 62,则需要 0.005 秒才能运行并返回 False。这些是正确的返回值,但我很好奇它是否以某种方式进行了优化,因为它知道它只是在寻找一个匹配 [] 的列表,并且在找到一个之后,它返回 false,因为列表永远不会是 []
冗长的问题,但到目前为止,我也愿意就我的代码提出任何建议。大约两个小时前我拿起了 Haskell,所以要友善 :)
编辑:我当然知道我可以使用更好的东西作为素性测试,例如 Miller-Rabin,但这不是重点 ;)
【问题讨论】:
-
这几乎与这个问题完全相同:stackoverflow.com/questions/24263611/…
-
谢谢!找不到任何东西
-
顺便说一句,不要写
l == []。它与null l相同,但不要求列表的元素类型具有Eq实例。
标签: haskell