ネイピア数を連分数展開すると、以下のように規則的な列になります。
e = [2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, 1, .... ]
上式の連分数を分数に変換し、さらに分数を小数に変換するという手順で計算します。
以下の機能が標準でサポートされているPythonで書きました。
- 多倍長整数の乗算
- ジェネレータを利用した無限リストの生成
- 任意精度の小数演算
import itertools from decimal import Decimal, getcontext def pi_expansion(): yield 2 for i in itertools.count(2, 2): yield 1 yield i yield 1 getcontext().prec = 100 cf = pi_expansion() p0, q0 = 0, 1 p1, q1 = 1, 0 for _ in range(100): a = cf.next() p1, p0 = a * p1 + p0, p1 q1, q0 = a * q1 + q0, q1 print Decimal(p1) / Decimal(q1)
100番目のconvergentまで計算して、
e ~ 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427となりました。90番目あたりのconvergentからこの値に収束していました。
ググってみると、正しいみたいです。