読者です 読者をやめる 読者になる 読者になる

円周率を求めてみる(漸化式版)

ちょっと計算したらすごく簡単な式になった。
\frac{a_{n+1}}{a_n}=\frac{(2n+1)^2}{4(2n+2)(2n+3)}
これを基に再実装。

open Num

let pi length = 
  let min = Int 1 // Int 10 **/ Int length in
  let zero = Int 0 and one = Int 1
  and two = Int 2 and three = Int 3
  and four = Int 4 in
  let rec sum n an x =
    let n2 = two */ n in
    let n2_1 = n2 +/ one in
    let an' = (n2_1 */ n2_1) //
      (four */ (n2 +/ two) */ (n2 +/ three)) */
      an in
    if an' </ min then x +/ an'
    else sum (n +/ one) an' (x +/ an') in
  let a0 = Int 1 // Int 2 in
  Int 6 */ sum zero a0 a0

さっきと同様、500桁までの表示をやってみたら5秒かかった。
思ったよりも速くはならなかったな。