2012-03-05 88 views
0

歐幾里得:: INT - >內部 歐幾里得N =長度(濾波器(GCD n ==可1)[1 ... N-1])使用最大公約數樂趣

GCD :: INT - >內部 - >詮釋

..

+3

Haskell序言已經爲您定義了一個'gcd'函數,不需要自己定義它。 – 2012-03-05 13:51:45

+1

*「所有常見除數的長度== 1」* ---我不明白。這是什麼意思? – dave4420 2012-03-05 14:10:37

+0

你試圖解決什麼問題? (如果是Project Euler問題73,順便說一下,最佳解決方案不會計算任何'gcd'。) – 2012-03-05 14:12:38

回答

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 [email protected](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..])

+0

嗨,我不斷得到:「無法匹配預期類型'布爾'對推斷類型'詮釋' 在表達式中:x 在'gcd'的定義:gcd x 0 = x」 – gorn 2012-03-05 17:25:26

+0

請問,我得到它的工作。感謝您的幫助=) – gorn 2012-03-05 18:48:17

1

您的錯誤來自「gcd x 0 = x」。 「x :: Int」是推斷的結果,但「gcd :: Int-> Int-> Bool」的類型聲明需要Bool。我預計「gcd x 0 =(x == 1)」是你應該輸入的內容。