分数

Python2.6からFractionクラス(分数というか有理数)がライブラリに追加された。すなわち、昨日の日記のコードはFractionを使っているので、2.6以上でないと動かない。
ここでは、Python2.6に付属しているヘルプを見ながら、Fractionクラスの紹介をする。


コンストラクタは、


from fractions import Fraction

a = Fraction() # 0 (デフォルト)
b = Fraction(1, 2) # 1/2
c = Fraction(12, 18) # 2/3 (ちゃんと約分する)
d = Fraction(3, -5) # -3/5(分母は必ず正らしい)
e = Fraction(1) # 1 (デフォルトの分母は1)
e = Fraction(b) # 1/2 (コピー)
f = Fraction("3/5") # 3/5 (文字列でもOK)

分母が0なら、例外ZeroDivisionErrorが発生する。
また、小数でも分数化できる。


a = Fraction.from_float(1.234567) # 5559995481163911/4503599627370496

IEEE 754で1.234567は、


1.2345669999999999699724639867781661450862884521484375

となる。これを正確に表すと、上の分数になる。
しかし、これではあまりに不便で、実際にはもっと小さい分母のほうがうれしいことが多い。そこで、分母の上限を設定する。


a = Fraction.from_float(1.234567)
b = a.limit_denominator() # デフォルトは100万
print b # 1234567/1000000

c = a.limit_denominator(1000)
print c # 100/81

分母・分子は次のように得る。


f = Fraction(6, -8)
print f.denominator # 4
print f.numerator # -3
f.denominator = 2 # AttributeError: can't set attribute

整数・実数との演算も普通にできる。


f = Fraction(3, 5)
print f + 1 # 8/5
print f + 1.0 # 1.6

最大公約数を返すメソッドも提供されている。


from fractions import Fraction
import fractions

print fractions.gcd(8, 6) # 2
print fractions.gcd(8, -6) # -2
print fractions.gcd(-8, 6) # 2
print fractions.gcd(-8, -6) # -2
print fractions.gcd(2, 0) # 2