π
http://www.kt.rim.or.jp/~kbk/zakkicho/10/zakkicho1010c.html#D20101030-5
http://www.kt.rim.or.jp/~kbk/zakkicho/10/zakkicho1010c.html#D20101031-2
より。
2の式は5の変形(2項ずつまとめてある)と分かったけど3, 4は全く知らなかったので調べてみたら、それぞれsin(πz)の無限乗積展開式にz=1/2, z=1/6を代入した物だという事が分かった。
特に1/2の時の式
はウォリス積っていうのと同じなんだって。へー。
で、lisp vs pythonじゃないけどこれはclojureのiterate! と思ったので書いてみた。
(let [s2 (iterate (fn [[i s]] [(inc i) (+ s (* 8 (let [a (+ (* 4 i) 2)] (/ (- (* a a) 1)))))]) [0 0.0]) s3 (iterate (fn [[i p]] [(inc i) (* p (let [a (* 4 i i)] (/ a (dec a))))]) [1 2.0]) s4 (iterate (fn [[i p]] [(inc i) (* p (let [a (* 36 i i)] (/ a (dec a))))]) [1 3.0]) s5 (iterate (fn [[i s]] [(inc i) (+ s (* 4 (/ (if (even? i) 1 -1) (inc (* 2 i)))))]) [0 0.0]) d (/ Math/PI 100000)] (time (doseq [l [s2 s3 s4 s5]] (println (count (take-while #(< d (Math/abs (- Math/PI (double (second %))))) l)))))) ; 15916 ; 25000 ; 2778 ; 31831 ; "Elapsed time: 901.638616 msecs"
loop & recurで書けば速くなるかな。
Arcでループ
(= f2 (let s 0 [* 8 (++ s (/:- (expt (+ (* 4 _) 2) 2) 1.0))]) f3 (let p 1 [* 2 (zap * p (let a (* 4 ++._ _) (/ a (- a 1.0))))]) f4 (let p 1 [* 3 (zap * p (let a (* 36 ++._ _) (/ a (- a 1.0))))]) f5 (let s 0 [* 4 (zap (if even._ + -) s (/:+ (* 2 _) 1.0))])) (def test (f) (loop (= i 0 pi (acos -1) d (/ pi 100000)) (< d (abs:- (f i) pi)) ++.i) (prn f ":" i)) (time (map test (list f2 f3 f4 f5))) ; #<procedure: f2>:15915 ; #<procedure: f3>:24999 ; #<procedure: f4>:2777 ; #<procedure: f5>:31830 ; time: 375 msec.
こーゆークロージャはgolf以外ではダメ絶対