- 2009-06-16 (Tue) 21:19
- テクノロジ
数学の問題をプログラムで解こうというプロジェクト。
正解すると他の回答者の投稿が見れます。
というわけでハマりました。
せっかくだからschemeでやってます。
毎日ちょっとずつやってますがプログラムより数学がむずい。
素因数分解とかフィボナッチ数列とか。
んでそのフィボナッチ数列が密かにマイブーム。
2つ目の問題に「(フィボナッチ)数列の項が400万を超えない範囲で、偶数の項の総和を求めよ」ってのがあって最初は
- 1 . 再帰で一個ずつ求めてリストに追加
- 2 . リミットに到達したらリストを返す
- 3 . リストから偶数だけ取り出して総和をとる
ってやってたのが。。。
φ(黄金比率)を使って「F(n)を求める式」と「nまでの総和をとる式」をwikipediaで発見&知り合いが「nまでの総和から偶数の総和を導く式」を教えてくれたのでコードを修正、せっかくだからうpします。
(fibo-sum-even (fibo-count 4000000))
;; nのb乗を返す
(define (expt n b)
(let itr((count b) (product 1))
(if (= 0 count)
product
(itr (- count 1) (* n product)))))
;; 黄金比率φ
(define phi (/ (+ 1 (sqrt 5)) 2))
;; フィボナッチ数列の第n項の値F(n)を返す
(define (fibo n)
(inexact->exact (floor (+ (/ 1 2)
(/ (expt phi n)
(sqrt 5))))))
;; フィボナッチ数列の第n項までの総和を返す
(define (fibo-sum n)
(- (fibo (+ n 2)) 1))
;; フィボナッチ数列の第n項までの偶数の総和を返す
(define (fibo-sum-even n)
(cond ((= 0 (modulo n 3))
(/ (fibo-sum n) 2))
((= 1 (modulo n 3))
(/ (fibo-sum (- n 1)) 2))
((= 2 (modulo n 3))
(/ (fibo-sum (- n 2)) 2))))
;; フィボナッチ数列においてF(n)がmaxを越えない最大の項数nを返す
(define (fibo-count max)
(let itr((count 0))
(if (> (fibo count) max)
(- count 1)
- はてなブックマーク: 0
-
Comments:1
- きんた 10-03-30 (Tue) 23:00
-
Project Eulerの問題2
日本語のwikiに当たっても設問の設定条件が微妙と言うか
緩くなっている
http://odz.sakura.ne.jp/projecteuler/index.php?Problem%202
自分で勝手に条件を限定してコードを書けばすっきりするけど
400万の要素と言い結構意地悪かも知れない
haskellで解いてみたけどリストを生成して処理する場合は
スタックが溢れたり等で実際には少ない要素数専用だった
実際には処理出来ない前提ならばシンプルなコードになります
適当に概算したのだけど、400万個目のフィボナッチ数は
0、1で始まった前提で、大まかに2^400万つまり400万ビット使うと仮定する
10ビットで1024、十進数で約3桁だから40x3万桁1.0e1200000この様な数値か
512Kbyte位の整数が扱える処理系が必要でlisp系統の処理系でお手軽って事には
なりませんでした
c++辺りの処理系で力技が可能かも知れませんが
Trackbacks:0
- Trackback URL for this entry
- http://blog.mikamix.net/wp-trackback.php?p=99
- Listed below are links to weblogs that reference
- Project Euler from ヲタク的な、あまりにヲタク的な
