. Python 数値計算ノート
Python 数値計算ノート
Python 数値計算ノート

分数(有理数)の計算

数学教室の 演習問題 PS-21 の検算に用いたコードを載せておきます(ちなみに PS ナンバーは確率分野です)。fractionモジュールの Fractionクラスをインポートして、次の分数の計算をします。 \[\beginx&=\frac\\[6pt]y&=\frac\\[6pt]z&=1-x-y\end\] 手計算が正しければ、$x=\cfrac,\ y=\cfrac,\ z=\cfrac$ となるはずです。

# In[9] a = Fraction(1, 6) b = Fraction(5, 6) x = a * Fraction(1, 1 - b ** 3) y = a * b * Fraction(1, 1 - b ** 3) z = Fraction(1 - x - y) num_list = [x, y, z] print(num_list) # [Fraction(36, 91), Fraction(30, 91), Fraction(25, 91)] sympy.Rational()

SymPy をインポートすると、コンストラクタ sympy.Rational() を使って、有理数 (分数) を扱えるようになります。

sympy.Rational(p, q=None, gcd=None)

p, q に整数を渡すと、p を分子、q を分母とする分数が生成されます。

# SYMPYT_FRACTION # In[1] from sympy import * # 有理数オブジェクトを生成 x = Rational(1, 3) print(x) # 1/3

p に浮動小数点数を渡すと分数に変換されます。 しかし、たとえば p=0.2 を指定しても、期待している値 (1/5) は得られません。

# In[2] # 浮動小数点数0.2を分数に変換 x = Rational(.2) print(x) # 3602879701896397/18014398509481984

これは浮動小数点数 0.2 を有限桁の 2 進数で表せないことに起因しています。渡した値が「0.2 の近似値」ではなく、「正確な 0.2」であることを明示するときには文字列型の ".2" を渡します。

# In[3] # 浮動小数点数0.2を分数表式に変換 x = Rational(".2") print(x) # 1/5

sympy.Rational(a, b) は a, b が互いに素でない場合には、自動的に約分されて既約分数を返します。

# In[4] # 20/48 x = Rational(24, 180) print(x) # 2/15 sympy.fraction()

sympy.fraction() は受け取った式を (分子, 分母) のタプルで返します。

# SYMPYT_FRACTION # In[1] from sympy import * # a,b,c,dを記号として定義 var ("a:d") # 分数をタプルに変換 x = fraction((a+b)/c) print(x) # (a + b, c) # In[2] # 有理数を生成 x = Rational(5, 11) # 有理数をタプルに変換 y = fraction(x) print(y) # (5, 11) # In[3] # exp(-a)をタプルに変換 x = fraction(exp(-a)) print(x) # (1, exp(a))

コメント

コメントをどうぞ コメントをキャンセル 最新記事
  • MobileNetV2で転移学習を試してみる
  • 二次形式
  • パスワード(暗証番号)生成関数
📎📎📎📎📎📎📎📎📎📎