Pythonで連分数展開する方法を考えてみました。
連分数とは
次のような形で書かれる式のことを連分数といいます。分子が1になっているところが特徴です。
変わるのは1,2,3,4,5の部分です。
これを[1,2,3,4,5]というリスト(配列)で表すことにします。
連分数を計算する関数
[1,2,3,4,5]というリスト(配列)を渡すと連分数としての値を計算する関数です。
def calc_continued_fraction(seq):
len_seq = len(seq)
a = 0
for i in range(len_seq):
if i == 0:
a = seq[len_seq - i - 1]
else:
a = seq[len_seq - i - 1] + 1 / a
return a
len_seq = len(seq)
a = 0
for i in range(len_seq):
if i == 0:
a = seq[len_seq - i - 1]
else:
a = seq[len_seq - i - 1] + 1 / a
return a
連分数展開する関数
ある数を渡すと連分数に展開する関数です。リストを返します。
def make_continued_fraction(src, keta = 10):
seq = []
c0 = 1 / src
for i in range(keta):
b0 = math.floor(1 / c0)
seq.append(b0)
c0 = 1 / c0 - b0
return seq
seq = []
c0 = 1 / src
for i in range(keta):
b0 = math.floor(1 / c0)
seq.append(b0)
c0 = 1 / c0 - b0
return seq
使用例
seq = [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
dst = calc_continued_fraction(seq)
print(dst)
dst = calc_continued_fraction(seq)
print(dst)
実行結果
1.4142135642135643
√2のような値になりました。
今度は√2を連分数にしてみます。
src = 2 ** (1 / 2)
print(src)
seq = make_continued_fraction(src, 20)
print(seq)
dst = calc_continued_fraction(seq)
print(dst)
print(src)
seq = make_continued_fraction(src, 20)
print(seq)
dst = calc_continued_fraction(seq)
print(dst)
実行結果
1.4142135623730951
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
1.4142135623730965
一行目が元の√2の値です。
二行目が連分数を表す配列です。
三行目が連分数の値です。
かなり近い値になります。
コメント