√2を連分数で分数のままどんどん近似してみた


2012年 11月 28日

RenbunsuunoFushigi.jpg黄金比のときは、連分数の計算に、[1,1..]のリストを使ったのだが、実はこのリストを適当に変えるだけでいろいろな数が求められるのだ。

連分数の分子部分が常に1になっているものを正則連分数という。
このとき、分母になる数だけを並べ、さらに最初の分数の前に加えられる数を;の前に置いた表現がある。

黄金比の場合には、 [1;1,1,1,..] となって全部1になってしまう。

この表記でいくと、√2(2の平方根)は、[1;2,2,2,…] となる。
詳しいことは、Wikipediaの√2の説明、あるいは連分数を見て確認して欲しい。

ということで、√2の連分数のn次近似は、リスト [1,2,2,…,2] (2がn個) を用意すれば計算できる。

*Main Data.List Data.Ratio> let ratSqrt2 n = foldr (\x y -> x+1/y) (1%1) (1 : (take n [2,2..]))

*Main Data.List Data.Ratio> ratSqrt2 10
11482 % 8119
*Main Data.List Data.Ratio> ratSqrt2 20
77227930 % 54608393

これで分数としては良いはずだが、分かりにくいので浮動小数点表示させてみよう。

*Main Data.List Data.Ratio> fromRational (ratSqrt2 10)
1.4142135731001355
*Main Data.List Data.Ratio> fromRational (ratSqrt2 20)
1.4142135623730954
*Main Data.List Data.Ratio> fromRational (ratSqrt2 30)
1.4142135623730951
*Main Data.List Data.Ratio> sqrt 2
1.4142135623730951

20次でほぼ有効範囲になっているようだ。収束の速度はまあまあか。

しかし、計算してみたい数といったら√2ではなくて、あれだろう。