SICPを読む(93) 3.1.2 (3) - モンテカルロ法 (2)

難航するかと思ったら、それほどでもなくて良かった。

互いに素 - Wikipedia

ふむふむ。なんとなく理解出来る自分がいることに驚く。

  • aとbが互いに素であることと 2^a-1 と2^b-1 が互いに素であることは同値。
  • pが素数で、任意の数で割り切れる確率は、1/pである。
    • 例えば素数2と、任意の数を選んだら、当然割り切れる確率は1/2になる。
  • aがpで割り切れる確率 × bがpで割り切れる確率 = 1/p^2
    • 確率論の勉強もしないとな・・・。

で、1-1/p^2のが総乗がゼータ関数(2)の逆数になり、


「でたらめに整数を選んで互いに素になる確率から円周率が出る」


謎だ。謎過ぎる。互いに素と円周率って全然関係ないじゃん!!


1-1/p^2のが総乗が・・・以降は理解できて無い。ゼータ関数については、数学ガールに書いてあったので後で読むとして・・・。


おぉ、素晴らしい解説が。

2つの自然数が互いに素となる確率 - ひとり予備校@国分寺 - Yahoo!ブログ

連載になってます。

コーディング

ここは簡単。

(define (monte-cario n ex)
  (letrec ((iter (lambda (m pass)
                   (if (zero? m)
                       (/ pass n)
                       (iter (- m 1)
                             (+ pass
                                (if (ex) 1 0)))))))
          (iter n 0)))

(define (monte-cario-estimate-pi test n)
  (sqrt (/ 6 (monte-cario n
                          (lambda ()
                            (= (gcd (rand test) (rand test)) 1))))))

(monte-cario-estimate-pi 1000 10) ; 3.1622776601683795
(monte-cario-estimate-pi 1000 100) ; 3.188964020716403
(monte-cario-estimate-pi 1000 1000) ; 3.180887273208006
(monte-cario-estimate-pi 1000 10000) ; 3.136507342239028
(monte-cario-estimate-pi 1000 100000) ; 3.1373304915081257
(monte-cario-estimate-pi 1000 1000000) ; 3.143726770912694


物凄い事だけど、あんまり使えないのは前回と一緒だ。


またオイラーに辿りついてしまったようだ。

で、重要なところ

要約すると、

「代入を取り入れた事によってシンプルに書けるようになった」

というところ。サンプルが悪い気もするけど、モナドも面倒そうだし納得しておくことにする。


破壊的代入があるからこそSchemeなのだ。