円周率を求めてみる(漸化式版)
ちょっと計算したらすごく簡単な式になった。
これを基に再実装。
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秒かかった。
思ったよりも速くはならなかったな。