【发布时间】:2013-12-18 09:04:05
【问题描述】:
好的,所以我选择了使用 java 时中断的项目 euler,我遇到了问题 10。我现在使用 Haskell,我认为学习一些 Haskell 会很好,因为我还在非常初学者。
http://projecteuler.net/problem=10
我还在用 java 编码的朋友想出了一个非常直接的方法来实现eratosthenes 的筛子:
我尝试实现一个更好看(并且我认为会稍微更有效)的 Haskell 函数来查找所有最高 2,000,000 的素数。 我来到了这个非常优雅但显然效率极低的函数:
primeSieveV2 :: [Integer] -> [Integer]
primeSieveV2 [] = []
primeSieveV2 (x:xs) = x:primeSieveV2( (filter (\n -> ( mod n x ) /= 0) xs) )
现在我不确定为什么我的函数比他的慢得多(他声称他的作品在 5 毫秒内完成),如果我的任何东西应该更快,因为我只检查一次复合材料(当它们被从列表中删除时)找到),而他会尽可能多地检查它们。
有什么帮助吗?
【问题讨论】:
-
埃拉托色尼筛? 5毫秒?对于所有高达 200 万的素数?对我来说听起来很可疑。如果您还想做其他事情,要让计算机计数那么快是半困难的。
-
他在撒谎,除非他在 NSA 工作,但我对此表示怀疑,如果他是,他就不会从事 euler 项目
-
如果您只需要不超过 2,000,000 的数字,请使用 Int 而不是 Integer。如果您关心速度,请使用
rem而不是mod。 -
你的不是筛子。这是蛮力划分数字。他使用布尔向量来实现您的筛子,返回实际数字的任意精度整数。结果甚至没有可比性。
-
还有人不知道cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf?在这一点上应该需要阅读..
标签: haskell primes sieve-of-eratosthenes