euclid :: Int - >诠释 euclid n = length(filter(gcd n == 1)[1 .. n-1])
gcd :: Int - > Int - > INT
...
答案 0 :(得分:1)
您的错误来自“gcd x 0 = x”。 “x :: Int”是推断的结果,但“gcd :: Int-> Int-> Bool”的类型声明需要Bool。我希望你应该键入“gcd x 0 =(x == 1)”。
答案 1 :(得分:0)
假设您正在寻找Euler's totient function,只需致电
euler_fi1 n = length $ filter ((==1).(gcd n)) [1..n-1]
链接的WP文章给出了直接计算的公式:
euler_fi n = let
fs = Data.List.nub $ factorize n
pr = n * product [p-1 | p <- fs]
in Data.List.foldl' div pr fs
您需要factorize
函数:
factorize n | n > 1 = go n (2:[3,5..]) where
go n ds@(d:t)
| d*d > n = [n]
| r == 0 = d : go q ds
| otherwise = go n t
where
(q,r) = quotRem n d
下一个优化是使用素数列表而不是(2:[3,5..])
。