2012-03-05 3 views
0

ユークリッド::のInt使用 - >のInt ユークリッドN =長さ(フィルタ(GCD N == 1)[1 ... N-1])最大公約数楽しい

GCD ::のInt - >のInt - >のInt

..あなたがEuler's totient functionを探していると仮定すると、

+3

Haskell preludeはすでにあなたのために 'gcd'関数を定義しています。あなた自身で定義する必要はありません。 –

+1

* "すべての共通因子の長さ== 1" * ---わかりません。これはどういう意味ですか? – dave4420

+0

解決しようとしている問題は何ですか? (Project Eulerの問題73の場合、最適解は '' gcd''を計算しません) –

答えて

0

は、単に

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

こんにちは、私は次のようになっています: "推測型' Bool 'と推定型 'Int'を一致させることができませんでした。 式中:x ' gcd 'の定義で:gcd x 0 = x " – gorn

+0

それは働くようになった。助けてくれてありがとう=) – gorn

1

あなたのエラーは "gcd x 0 = x"に由来します。 "x :: Int"は推論結果ですが、 "gcd :: Int-> Int-> Bool"の型宣言ではBoolが必要です。私は "gcd x 0 =(x == 1)"があなたが入力すべきものであることを期待しています。

関連する問題