SymPy:再帰的な分数(連分数)


2016年 11月 06日

連分数は数学の中でもとりわけ美しい魅惑的な分野だ。
しかし、分数の計算は面倒というのが小学校以来ある。
それを、SymPyで解決してしまおう。ContinuedFraction4.png

まず、連分数を最初に示す。
こんな数式を扱いたいのである。

右の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に以下の入門書がある。

BLUEBACKS_contfraction.jpgBLUE BACKS – B1770
連分数の不思議
    無理数の発見から超越数まで

木村 俊一 著

新書版、328ページ
2012/05/21 発売
1,100円(税別)
講談社
ISBN-978-4-06-257770-0