Python

Pythonで学ぶアルゴリズム ユークリッドの互除法

概要

ユークリッドの互除法を実装してみます。

ユークリッドの互除法(ユークリッドのごじょほう、: Euclidean Algorithm)は、2 つの自然数最大公約数を求める手法の一つである。

2 つの自然数 ab (a ≧ b) について、a の b による剰余を r とすると、 a と b との最大公約数は b と r との最大公約数に等しいという性質が成り立つ。この性質を利用して、 b を r で割った剰余、 除数 r をその剰余で割った剰余、と剰余を求める計算を逐次繰り返すと、剰余が 0 になった時の除数が a と b との最大公約数となる。

ユークリッドの互除法 – Wikipedia

サンプルコード

def euclidean_algorithm(a: int, b: int) -> int:
    while b:
        a, b = b, a % b
        print("a", a, ", b", b)
    return a


def euclidean_algorithm_recursive(a: int, b: int) -> int:
    print("a", a, ", b", b)
    return a if b == 0 else euclidean_algorithm_recursive(b, a % b)


print(f"euclidean_algorithm(8177, 3315) = {euclidean_algorithm(8177, 3315)}")
print(
    f"euclidean_algorithm_recursive(8177, 3315) = {euclidean_algorithm_recursive(8177, 3315)}")

実行結果(例)

a 3315 , b 1547
a 1547 , b 221
a 221 , b 0
euclidean_algorithm(8177, 3315) = 221
a 8177 , b 3315
a 3315 , b 1547
a 1547 , b 221
a 221 , b 0
euclidean_algorithm_recursive(8177, 3315) = 221