Home > テクノロジ > Project Euler

Project Euler

euler

数学の問題をプログラムで解こうというプロジェクト。
正解すると他の回答者の投稿が見れます。

というわけでハマりました。
せっかくだから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)

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++辺りの処理系で力技が可能かも知れませんが

Comment Form
Remember personal info

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 ヲタク的な、あまりにヲタク的な

Home > テクノロジ > Project Euler

Search
Feeds
Meta

Return to page top