false
我了解大部分代码,但第二行isPrime::Integer->Bool
isPrime n=not (hasfactor n 2(div n 2))
hasfactor::Integer->Integer->Integer->Bool
hasfactor n low high
|low>high=False
|mod n low==0=True
|otherwise = hasfactor n (low+1) high
除外。为什么上限为not (hasfactor n 2(div n 2))
?
假设我们(div n 2)
,test 8
(hasfactor n 2(div n 2))
为hasfactor 8 2 4
,我在这里看不到8
的分歧。
答案 0 :(得分:3)
这里使用了整数的最小素数因子是2的事实,所以最大的最多可以是n / 2.
更好的算法会检查最大为sqrt(n)的数字,以确定是否存在因子。
类似这样的事情
prime n = null [ k | k <- [2..n], k*k <= n, mod n k == 0 ]
虽然您需要将1
作为特殊情况处理为非素数
<强>更新强>
将质量数的sqrt(n)到n之间的检查短路,这可能是更好的方法
prime n = null [ k | k <- takeWhile (\x -> x*x<=n) [2..], mod n k == 0 ]