見出し画像

Pythonで分数を単位分数の和にするプログラムを作ろう

久しぶりのPython記事です。今回は、分数を単位分数の和、つまり単位分数分解をするプログラムを作っていきます。


単位分数とは?

単位分数とは、分子が1の分数のことを言います。
例えば、$${\frac{1}{2}}$$や$${\frac{1}{7}}$$、$${\frac{1}{100}}$$のような数のことです。
また、単位分数分解とは、ある分数を単位分数の和の形にすることをいいます。

単位分数分解のやり方

次に単位分数分解のやり方です。

  1. 単位分数の分母を1ずつ大きくしていき、分解する分数より小さくなったタイミングで止める

  2. 分解する分数から1の分数を引く

  3. 1~3を繰り返し、2の分数の分子が1になるまで繰り返す

具体例として$${\frac{9}{20}}$$を単位分数分解をしてみます。

$$
\frac{9}{20}<\frac{1}{2}  ,  \frac{9}{20}>\frac{1}{3}\\
\frac{9}{20}-\frac{1}{3}=\frac{7}{60}\\
そして、\frac{7}{60}<\frac{1}{8}  ,  \frac{7}{60}>\frac{1}{9}\\
\frac{7}{60}-\frac{1}{9}=\frac{1}{180}\\
$$

$$
よって、\frac{9}{20}=\frac{1}{3}+\frac{1}{9}+\frac{1}{180}
$$

プログラム化のポイント

次にプログラミングですが、これについてはちょっとしたポイントだけ解説しておきます。

約分のやり方

pythonには約分に便利な関数が組み込みモジュールがあります。
$${\verb|fractions|}$$モジュールの$${\verb|Fraction|}$$です。具体的なプログラムは次のようになります。

from fractions import Fraction

###約分する
def frac(a,b):
    return Fraction(a,b).numerator,Fraction(a,b).denominator

$${\verb|Fraction(a,b)|}$$は$${\frac{a}{b}}$$を約分し、その結果を出力します。$${\verb|.numerator|}$$で分子、$${\verb|.denominator|}$$で分母が数値として出力されます。

最小公倍数の求め方(通分への利用)

通分のためには最小公倍数を求めるのが最善です。しかし、pythonに組み込まれている$${\verb|math|}$$モジュールには最大公約数を求める$${\verb|.gcd(a,b)|}$$しかなく、最小公倍数を求める組み込み関数はありません。実は最小公倍数は次のような式で求めることができます。

$$
(aとbの最小公倍数)=\frac{|a\times b|}{(aとbの最大公約数)}
$$

これをプログラムにすると次のようなものになります。

import math

###最小公倍数
def lcm(a,b):
    return abs(a*b) // math.gcd(a,b)

全体のコード

最後に全体のプログラムコードです。

from fractions import Fraction
import math

###最小公倍数
def lcm(a,b):
    return abs(a*b) // math.gcd(a,b)

###約分する
def frac(a,b):
    return Fraction(a,b).numerator,Fraction(a,b).denominator

###単位分数に分解
def div(n,m):
    xn = n
    xm = m
    result = []
    while xn != 1:
        value = xn / xm
        num = 1
        while value <= 1 / num:
            num += 1
        l = lcm(num,xm)
        xn = xn * l // xm
        result.append(f'1/{num}')
        re = frac(xn-l//num,l)
        xn = re[0]
        xm = re[1]
    result.append(f'1/{xm}')
    return result

###入出力
def a():
    try:
        n1 = int(input("分子の値を入力してください>>>"))
        n2 = int(input("分母の値を入力してください>>>"))
        r = (' + ').join(div(n1,n2))
        print(f"{n1}/{n2} = {r}")
    except:
        print("指定以外の値が入力されました。入力し直してください。")

###説明文
print("""
このプログラムは分数を単位分数の和の形に分解するプログラムです。
a()と入力するとプログラムが起動します。
""")

$${\verb|div|}$$関数の最後のほうは分数同士を通分して引き算をする処理をしています。

この記事が参加している募集

#数学がすき

2,928件

この記事が気に入ったらサポートをしてみませんか?