使用最大公约数乐趣

时间:2012-03-05 13:43:59

标签: functional-programming lazy-evaluation

euclid :: Int - >诠释 euclid n = length(filter(gcd n == 1)[1 .. n-1])

gcd :: Int - > Int - > INT

...

2 个答案:

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