√2 を計算してみた

ザリガニが見ていた...。√2や円周率πの驚きを参考にHaskell の練習に√2 を計算してみました。


{-
1 2 5 12 29 70 169 408 985 ...
次の数を求めるには、今の数を2倍して、前の数を足す。
例:5の次は... 5 × 2 + 2 = 12
√2 ≒ 408 ÷ 985 + 1 = 1.4142131979
-}

sqr2 x = (head (tail (rseq x))) / (head (rseq x)) + 1
where
rseq 1 = [1]
rseq 2 = [2,1]
rseq x = (((head (rseq (x-1))) * 2) + (head (rseq (x-2))))
:(rseq (x-1))

Prelude> :load root.hs
[1 of 1] Compiling Main ( root.hs, interpreted )
Ok, modules loaded: Main.
*Main> sqr2 3
1.4
*Main> sqr2 5
1.4137931034482758
*Main> sqr2 10
1.4142136248948696
*Main> sqr2 20
1.4142135623730965
*Main> sqr2 30
1.414213562373095

もっと簡単に。


sqr2 x = rseq (x -1) / rseq x + 1
where
rseq 1 = 1
rseq 2 = 2
rseq x = rseq (x-1) * 2 + rseq (x-2)

π も計算してみる。


{-
1 1 1 1 1 π^2
1 + --- + --- + --- + --- + --- +... = + ---
1^2 2^2 3^2 4^2 5^2 6

n = p^2 / 6

sqrt (n *6) = p

-}

p x = sqrt $ (sequ x) * 6
where
sequ 1 = 1
sequ 2 = 1 / 2^2 + 1
sequ x = 1 / x^2 + sequ (x-1)

> ghci pi.hs
GHCi, version 6.10.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( pi.hs, interpreted )
Ok, modules loaded: Main.
*Main> p 1
2.449489742783178
*Main> p 10
3.04936163598207
*Main> p 100
3.1320765318091053
*Main> p 1000
3.1406380562059946
*Main> p 10000
3.1414971639472147
*Main> p 100000
3.141583104326456