最近、Herokuでのアプリ作りで苦闘していたり、仕事が忙しかったりして、更新してなかったけど、久しぶりにPEを解いた。
数を素数で分割する問題です。
普通に組み合わせで解こうとするとできないのは目に見えている。
前の問題で、数を自然数で分割する問題は解いたので、これを利用できないかなと考えた。
で、そのときの漸化式はこれですが、
これ、結局、問題を分割していくわけで、そのとき、キーになるのが k です。 ここでは k を1から順に1ずつ増やしながら調べていくわけですが、数えられるのは、k と n が同じ値になったときであって、それを1通りと数えているわけです。
だから、k を素数に限定してしまえば素数で分割したものが得られるわけ。
うーん。今一つ説明がうまくできない。まあ、こういう式を作りました。
これだけ。
・ next-prime
その名の通り、xの次の素数を返します。
・ partition-num-prime
上の漸化式を表現したもの。 76の (inc k) を (next-prime k) に変えただけ。
・ pe76
1から順に計算していって、n以下のものを捨てて、最初の1つを取ります。
数を素数で分割する問題です。
普通に組み合わせで解こうとするとできないのは目に見えている。
前の問題で、数を自然数で分割する問題は解いたので、これを利用できないかなと考えた。
で、そのときの漸化式はこれですが、
- p(k, n) = 0 if k > n
- p(k, n) = 1 if k = n
- p(k, n) = p(k+1, n) + p(k, n − k) otherwise.
これ、結局、問題を分割していくわけで、そのとき、キーになるのが k です。 ここでは k を1から順に1ずつ増やしながら調べていくわけですが、数えられるのは、k と n が同じ値になったときであって、それを1通りと数えているわけです。
だから、k を素数に限定してしまえば素数で分割したものが得られるわけ。
うーん。今一つ説明がうまくできない。まあ、こういう式を作りました。
- p(k, n) = 0 if k > n
- p(k, n) = 1 if k = n
- p(k, n) = p(kの次の素数, n) + p(k, n − k) otherwise.
これだけ。
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 77 : 2012/4/19 | |
;;"Elapsed time: 67.917848 msecs" | |
;; defn-memo is my macro for memoise function definition. | |
;; -> https://gist.github.com/1185886 | |
(defn next-prime [x] | |
(first (drop-while #(>= x %) (get-prime-list)))) | |
(defn-memo partition-num-prime [k n] | |
(cond (> k n) 0 | |
(= k n) 1 | |
:else | |
(+ (partition-num-prime (next-prime k) n) | |
(partition-num-prime k (- n k))))) | |
(defn pe76 [n] | |
(first | |
(drop-while #(<= (second %) n) | |
(pmap #(vector % (partition-num-prime 2 %)) (iterate inc 2))))) |
・ next-prime
その名の通り、xの次の素数を返します。
・ partition-num-prime
上の漸化式を表現したもの。 76の (inc k) を (next-prime k) に変えただけ。
・ pe76
1から順に計算していって、n以下のものを捨てて、最初の1つを取ります。
0 コメント:
コメントを投稿