Euler : Problem 72

Posted by YpsilonTAKAI On 2011年12月12日月曜日 0 コメント
これもファレイ数列の問題です。

なんか、もうちょっといい方法が見つかりそうだんだけれども断念。
まあ、1分弱で解けたからいいということにしよう。




ファレイ数列の個数は、






※wikipediaの画像を勝手に拝借してみた。

と表わせるとのとのこと。 ここにでてくるφ(m)は前に出てきた、オイラーのトーシェント関数。

このまま計算すると、1から1000000までの数を全部素因数分解する必要があって、ちょっと大変なんで、最初は20分近くかかってしまった。
でも、素因数分解の関数(factors)を前のやつからちょっと工夫してやったら、1分を切った。
factorsはもうちょっと高速化できるかもしれない。

百万までの素数を作るのに、5秒くらいかるので、それを入れたら1分を切れないねぇ。


;; Problem 72 : 2011/12/9
;;"Elapsed time: 51713.086719 msecs"
(defn phi-n [n]
(reduce * n (map #(- 1 (/ 1 %)) (distinct (factors n)))))
(defn pe-72 [n]
(reduce + -1 (pmap phi-n (range 1 (inc n)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; factors
(defn factors
"Returns a list of factors of n.
ex. (foctors 12) => (2 2 3)
This function needs prime nember tool."
[n]
(loop [factor-list []
target n
prime-list (prime-list-under (Math/sqrt target))]
(cond (is-prime? target)
(conj factor-list target)
(or (= target 1) (empty? prime-list))
factor-list
:else
(let [one-prime (first prime-list)]
(if (zero? (rem target one-prime))
(recur (conj factor-list one-prime) (/ target one-prime) prime-list)
(recur factor-list target (rest prime-list)))))))
view raw pe_72.clj hosted with ❤ by GitHub



- phi-n
 φ(n)を求める関数。





このとおり。
こういうふうに書けるところがClojure(lisp)が好きな理由だね。


- pe-72
  ファレイ数列の式の通りの計算。
  でも、公式の場合、0と1を含んだ個数で、PEの問題は両端を含まないので、
  公式の結果から2を引いたものが答え。  ここちょっとはまった。


0 コメント:

コメントを投稿