ユークリッド::のInt使用 - >のInt ユークリッドN =長さ(フィルタ(GCD N == 1)[1 ... N-1])最大公約数楽しい
GCD ::のInt - >のInt - >のInt
..あなたがEuler's totient functionを探していると仮定すると、
ユークリッド::のInt使用 - >のInt ユークリッドN =長さ(フィルタ(GCD N == 1)[1 ... N-1])最大公約数楽しい
GCD ::のInt - >のInt - >のInt
..あなたが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..])
するのではなく、素数のリストを使用することです。
あなたのエラーは "gcd x 0 = x"に由来します。 "x :: Int"は推論結果ですが、 "gcd :: Int-> Int-> Bool"の型宣言ではBoolが必要です。私は "gcd x 0 =(x == 1)"があなたが入力すべきものであることを期待しています。
Haskell preludeはすでにあなたのために 'gcd'関数を定義しています。あなた自身で定義する必要はありません。 –
* "すべての共通因子の長さ== 1" * ---わかりません。これはどういう意味ですか? – dave4420
解決しようとしている問題は何ですか? (Project Eulerの問題73の場合、最適解は '' gcd''を計算しません) –