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

π

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の時の式
\frac{\pi}{2}=\prod\limits_{n=0}^{\infty}{\frac{4n^{2}}{4n^{2}-1}}
ウォリス積っていうのと同じなんだって。へー。

で、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以外ではダメ絶対