Euler : Problem 77

Posted by YpsilonTAKAI On 2012年4月19日木曜日 0 コメント
最近、Herokuでのアプリ作りで苦闘していたり、仕事が忙しかったりして、更新してなかったけど、久しぶりにPEを解いた。


数を素数で分割する問題です。







普通に組み合わせで解こうとするとできないのは目に見えている。
前の問題で、数を自然数で分割する問題は解いたので、これを利用できないかなと考えた。
で、そのときの漸化式はこれですが、

  • p(kn) = 0 if k  > n
  • p(kn) = 1 if k = n
  • p(kn) = p(k+1, n) + p(kn − k) otherwise.

これ、結局、問題を分割していくわけで、そのとき、キーになるのが k です。 ここでは k を1から順に1ずつ増やしながら調べていくわけですが、数えられるのは、k と n が同じ値になったときであって、それを1通りと数えているわけです。

だから、k を素数に限定してしまえば素数で分割したものが得られるわけ。

うーん。今一つ説明がうまくできない。まあ、こういう式を作りました。


  • p(kn) = 0 if k  > n
  • p(kn) = 1 if k = n
  • p(kn) = p(kの次の素数n) + p(kn − k) otherwise.

これだけ。

;; 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)))))
view raw pe_76.clj hosted with ❤ by GitHub


・ next-prime
 その名の通り、xの次の素数を返します。


・ partition-num-prime
 上の漸化式を表現したもの。 76の (inc k) を (next-prime k) に変えただけ。


・ pe76
 1から順に計算していって、n以下のものを捨てて、最初の1つを取ります。


0 コメント:

コメントを投稿