最大公約数--ユークリッドアルゴリズムと最小公倍数を求めます

1266 ワード

最大公約数
ユークリッドアルゴリズム
ユークリッドアルゴリズムは、2つの整数a,bの最大公約数を計算するために、転がり相除去法とも呼ばれる.その計算原理は以下の定理に依存する.
 gcd(a, b) = gcd(b, a mod b)
ここでgcd(a,b)はaとbの最大公約数を表し、modはモード演算である、すなわちaをbで割った残数を求める. 
コンピュータの実現構想:
例えば10と7の最大公約数を求めると、gcd(10,7)=gcd(7,3)=gcd(3,1)となり、このとき最大公約数は必然的に1であることが一目でわかる.ここに来てもいいですか?例えば、gcd(10,6)=gcd(6,4)=gcd(4,2)の場合も、最大公約数が2であることが一目で分かる.では、私たちはどのようにしてこの2つの例の共通点を見つけることができますか?明らかに、共通点は最後に収束した2つの数であり、後者は必ず前者を除去し、つまり私たちは判断するだけで、後者が前者を除去すると、私たちは答えを得ることができます.そこで私たちはどのようにコンピュータを実現するかを考えました.実装では,上記の考え方を実現するには,前者が後者によって除去されるか否かを一歩一歩判断しなければならないが,このようなプログラムの効率は高くなく,毎回1回の除去と判断演算を行わなければならないことが分かった.だからこれはまだ最高の結果ではありません.
しかし,上記の2つの例は収束を続けることができることを見出した.すなわちgcd(3,1)=gcd(1,0),gcd(4,2)=gcd(2,0),すなわち後者が0の場合,前者は我々が探す最大公約数であり,コンピュータは後者が0であるか否かを判断するだけで効率が高い.
そこで答えが見つかりました.
コード実装
pythonコード実装:
def gcd(m, n):
    while n:
        temp = m
        m = n
        n = temp % n
    return m

再帰的な実装
def gcd(m, n):
    if n == 0:
        return m
    return gcd(n,m%n)

最小公倍数
最小公倍数=2数の積/最大公約(因)数
def gcd(m, n):
    if n == 0:
        return m
    return gcd(n,m%n)

def lcm(m,n):
    return m*n/gcd(m,n)
    
print(lcm(10,6))