連分数は数学の中でもとりわけ美しい魅惑的な分野だ。
しかし、分数の計算は面倒というのが小学校以来ある。
それを、SymPyで解決してしまおう。
まず、連分数を最初に示す。
こんな数式を扱いたいのである。
右のpprint(f)のfは連分数の式で、それをpprint(f)で美しくprintした。
この形の再帰形式になっている分数を連分数という。
b1,b2,…. が全て1の場合を正則というそうだ。
aとbの数列を与えて連分数を生成する関数は以下のようになる。
分母のAの方が、分子のBより1つだけ長い。
import math
from sympy import *
def list_to_frac(A,B):
expr = 0
zip(A[1:],B)
for (a,b) in reversed(list(zip(A[1:],B))):
expr = b/(a+expr)
return A[0]+expr
In [22]: symsa = symbols('a0:5')
In [23]: symsa
Out[23]: (a0, a1, a2, a3, a4)
In [24]: symsb = symbols('b1:5')
In [25]: symsb
Out[25]: (b1, b2, b3, b4)
In [26]: f = list_to_frac(symsa,symsb)
In [27]: f
Out[27]: a0 + b1/(a1 + b2/(a2 + b3/(a3 + b4/a4)))
symbols()を使うことで、まとめて数列の添字付変数を作っている。
list_to_frac()に与える分母、分子の数列であるが、これはリストでもタプルでも構わない。pprint()を用いると美しい分数形式で表示されるのだが、単にprint()とかの場合には、カッコだらけのベタッとした感じに表示される。
連分数についてはネット上にもたくさん情報はあるが、BLUE BACKSに以下の入門書がある。
BLUE BACKS – B1770