测试整数是否为素数

时间:2017-04-23 02:02:23

标签: algorithm haskell

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的分歧。

1 个答案:

答案 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 ]