Clojureの勉強のために、L-99: Ninety-Nine Lisp Problemsを解いてみる。
オイラーのトーシェント関数を愚直に、素因数分解をHaskell版から書き換え。
P34 (**) Calculate Euler's totient function phi(m).
1以上与えられた値未満の整数の中で与えられた値と互いに素であるものの個数を返す関数を書く。
(これをオイラーのトーシェント関数というらしい)
うーむ、特に工夫なくp33.cljで作った互いに素であるかを判定する関数をそのまま使ったが、こんなんで良かっただろうか…。
P35 (**) Determine the prime factors of a given positive integer.
与えられた値を素因数分解する関数を書く。
これはHaskellで書いたZaneli.Euler.primeFactorsとほぼ同じ事をClojureで書けばよさそうだ。
あまり違いはないけれど2パターン書いてみた。
こちらは2,3,5...と割る値を増加させていき、割り切れれば商を元の値と置き換えて再帰、
割り切れなければ割る値を増加させて再帰、を繰り返す。
全ての奇数に対して割り切れるかどうかを試みるので、途中素数ではないものも出てくるが、
3で割り切れるまで割り切った後であれば21では割り切れないので、まぁ問題ないだろうと判断した。
こちらはcount-quot関数を呼んで割り切れるまで割って再帰、を繰り返す。
count-quotは割り切れた回数と、割り切った後の商を返す。
> (count-quot 56 2) ; 56は2で3回割り切れ、割り切った後の商は7
(7 3)
> (count-quot 56 5) ; 56は5で一度も割り切れない
(56 0)
両者の違いは、例えば(my-prime-factors 8)の場合、前者は2で割り切れるので(my-prime-factors 4 2 (2))として再帰し、
後者は2で3回割り切れるので(my-prime-factors 1 3 (2 2 2))として再帰する。
P36 (**) Determine the prime factors of a given positive integer (2).
こちらは結果の表記が少し異なるだけで基本的にp35-1.cljと同じ。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .