見出し画像

Retro-gaming and so on

遅延評価で円周率

詳しくは知らん。
っつーか書いてるHaskellのコードがどうやら今じゃあ動かねぇんだよなぁ。
だから仕様の無い言語は(苦笑)。

で、調べてみると、

> piG3 = g(1,180,60,2) where
>  g(q,r,t,i) = let (u,y)=(3*(3*i+1)*(3*i+2),div(q*(27*i-12)+5*r)(5*t))
>      in y : g(10*q*i*(2*i-1),10*u*(q*(5*i-2)+r-y*t),t*u,i+1)

yがどうやら円周率の各桁に現れる「整数」らしい。
それさえ分かればSRFI-41を用いてSchemeで実装するのはさして難しくない。

(require srfi/41)

(define (g q r t i)
 (let ((u (* 3 (+ (* 3 i) 1) (+ (* 3 i) 2)))
   (y (quotient (+ (* q (- (* 27 i) 12)) (* 5 r)) (* 5 t))))
  (stream-cons y
       (g (* 10 q i (- (* 2 i) 1))
        (* 10 u (- (+ (* q (- (* 5 i) 2)) r) (* y t)))
        (* t u)
        (+ i 1)))))

この再帰関数gが無限長の円周率の桁の整数を作り出す関数である。
ここでは論文の通り初期値を与えてみよう。

(define piG3 (g 1 180 60 2))

あとはほしい桁数を取り出すだけである。
基本的にはSRFI-41のstream-takeを使うだけ、なのだが、どうせならPretty-Printingに挑戦する。

(display (let ((ls (map (lambda (x)
          (number->string x 10))
         (stream->list (stream-take 1000 piG3)))))
    (apply string-append
      (cons (car ls)
       (cons "." (cdr ls))))))
(newline)

1,000桁を想定して実行してみると、

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198
>

と言う値が出てくる。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事