寻找素数的Haskell列表理解
我试图使用列表理解,尽可能简洁地找到小于某个整数寻找素数的Haskell列表理解,haskell,syntax,syntax-error,list-comprehension,primes,Haskell,Syntax,Syntax Error,List Comprehension,Primes,我试图使用列表理解,尽可能简洁地找到小于某个整数n的所有素数。我正在学习Haskell,这只是一个练习。我想写一些类似于: isqrt :: Integral a => a -> a isqrt = floor . sqrt . fromIntegral primes :: Integral a => a -> [a] primes n = [i | i <- [1,3..n], mod i k /= 0 | k <- primes (isqrt
n
的所有素数。我正在学习Haskell,这只是一个练习。我想写一些类似于:
isqrt :: Integral a => a -> a
isqrt = floor . sqrt . fromIntegral
primes :: Integral a => a -> [a]
primes n = [i | i <- [1,3..n], mod i k /= 0 | k <- primes (isqrt i)]
但是-我真的不希望语法是合法的:-)
其目的是尽可能直接地翻译:“primes n
=奇整数集i
小于n
,使得i
不可被任何k
整除,对于集合中的所有k
:primes(isqrt i)
”-或多或少。(我希望我没弄错?)
谢谢 我在以下方面取得了一些进展:
primes::积分a=>a->[a]
素数2=[2]
素数n=2:[i | i如果(mod ik/=0)那么为真,否则为假)
(素数(isqrt i))]
有没有一种更短的方法来编写lambda谓词
编辑:是的,有,感谢评论中的评论
primes::积分a=>a->[a]
素数2=[2]
素数n=2:[i | i你的代码
primes n = [i | i <- [1,3..n], mod i k /= 0
| k <- primes (isqrt i)]
最佳试验划分通常在~n1.4..1.45处运行,基于列表的埃拉托斯烯筛在~n1.2..1.25处运行,如果在可变阵列上优化实施,则在~n1.0..1.1处运行(产生的素数为n,而不是上限).不起作用是非常没有帮助的。发布错误。你能把这个错误放到你的帖子正文中吗?谢谢。这里有一个:-试用除法和一种Eratosthenes筛选法。永远不要说if…then True else False
。只需说。
部分:\k->mod i k/=0
,你也可以让它无意义,如果这是你的事情:(/=0.mod i)
更清楚的是定义一个单独的函数:可除i=(==0.mod i
,然后用(not.divisible i)
代替lambda函数,为什么从不说“if…then True else False”?@Frank:因为条件表达式的计算结果已经是True
或False
。if
语句是完全冗余的,会把事情弄得一团糟。
primes n = [i | i <- [1,3..n], mod i k /= 0
| k <- primes (isqrt i)]
primes n = [i | (i,k) <- zip [i | i <- [1,3..n], mod i k /= 0]
-- not in scope: k ^
[k | k <- primes (isqrt i)] ]
-- not in scope: i ^
primes 1 = []
primes n = 2:[i | i <- [3,5..n], and [mod i k /= 0 | k <- primes (isqrt i)]]
> length $ primes 10000 -- => 1229 (0.50 secs)
> length $ primes 20000 -- => 2262 (1.40 secs)
> logBase (2262/1229) (1.4/0.5) -- => 1.6878 ~ n^1.69
> length $ primes 40000 -- => 4203 (4.07 secs)
> logBase (4203/2262) (4.07/1.4) -- => 1.7225 ~ n^1.72