これもファレイ数列の問題です。
なんか、もうちょっといい方法が見つかりそうだんだけれども断念。
まあ、1分弱で解けたからいいということにしよう。
ファレイ数列の個数は、
※wikipediaの画像を勝手に拝借してみた。
と表わせるとのとのこと。 ここにでてくるφ(m)は前に出てきた、オイラーのトーシェント関数。
このまま計算すると、1から1000000までの数を全部素因数分解する必要があって、ちょっと大変なんで、最初は20分近くかかってしまった。
でも、素因数分解の関数(factors)を前のやつからちょっと工夫してやったら、1分を切った。
factorsはもうちょっと高速化できるかもしれない。
百万までの素数を作るのに、5秒くらいかるので、それを入れたら1分を切れないねぇ。
- phi-n
φ(n)を求める関数。
このとおり。
こういうふうに書けるところがClojure(lisp)が好きな理由だね。
- pe-72
ファレイ数列の式の通りの計算。
でも、公式の場合、0と1を含んだ個数で、PEの問題は両端を含まないので、
公式の結果から2を引いたものが答え。 ここちょっとはまった。
なんか、もうちょっといい方法が見つかりそうだんだけれども断念。
まあ、1分弱で解けたからいいということにしよう。
ファレイ数列の個数は、
※wikipediaの画像を勝手に拝借してみた。
と表わせるとのとのこと。 ここにでてくるφ(m)は前に出てきた、オイラーのトーシェント関数。
このまま計算すると、1から1000000までの数を全部素因数分解する必要があって、ちょっと大変なんで、最初は20分近くかかってしまった。
でも、素因数分解の関数(factors)を前のやつからちょっと工夫してやったら、1分を切った。
factorsはもうちょっと高速化できるかもしれない。
百万までの素数を作るのに、5秒くらいかるので、それを入れたら1分を切れないねぇ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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))))))) |
- phi-n
φ(n)を求める関数。
このとおり。
こういうふうに書けるところがClojure(lisp)が好きな理由だね。
- pe-72
ファレイ数列の式の通りの計算。
でも、公式の場合、0と1を含んだ個数で、PEの問題は両端を含まないので、
公式の結果から2を引いたものが答え。 ここちょっとはまった。
0 コメント:
コメントを投稿