Pythonプログラミング(ステップ4・反復処理・連分数)
連分数の計算について考える。
1.連分数と実数の「よい」近似法
実数
このように「無駄」が少なく良い近似を与えるような有理数を求める方法として、連分数展開(continued fraction expansion)が知られている。
調べたい数を (整数部) + (小数部)
に分解する。
次に、
同様の操作を繰り返すと、展開の
以上をまとめると、
連分数を数式で表現するのはなかなか厄介であるため、上記の連分数は
練習:連分数展開
以下に、実数値を入力すると、その連分数展開(
具体的な値を入力して動作を確認してみなさい。
リストや関数について知識のある者は、各段階での近似値(
# coding: utf-8 import math x = float(input("x=")) b = x while True: a = math.floor(b) print(a,"+ 1/") if abs(b-a) < 0.0001: break b = 1/(b-a)
ヒント
math.floor()
は、実数値の整数部分(小数部を切り捨てた値)を与える関数である。
反対に、切り上げはmath.ceil()
。
解説: fractionsモジュール
連分数の計算などを行う際に、分数は分数として計算したくなる。そのような用途に、Pythonの標準モジュールの中にfractionsが含まれている。
詳しい機能はマニュアル等を参照してもらうこととして、連分数展開を与えると、その値を有理数で表示するコードの例の以下に示す。
# coding: utf-8 from fractions import Fraction contfrac = [1,2,2,2,2,2] c = Fraction(contfrac.pop()) for a in reversed(contfrac): c = Fraction(a) + Fraction(1)/Fraction(c) print(c)
上記のコードには、これから学ぶ事項(リスト)が含まれているが、計算の流れは理解できるはずだ。
contfrac.pop()
はリストの最後の要素を取り出す(同時に削除する)操作、
for a in reversed(contfrac):
は、リストの最後から順に要素を取り出してc
にセットする操作を表す。