【Python】再帰処理で2つの数の最大公約数(GCD)を求めるプログラム
はじめに
2つの数 a と b が与えられたとき、これらの最大公約数(GCD)を再帰的な手法で求めることを考えます。GCDを計算するには、古典的なユークリッドの互除法を利用します。
例えば、入力が a = 25、b = 45 の場合、出力は 5 になります。
アルゴリズムの手順
この問題を解くためには、以下の手順に従います。
gcd()関数を定義します。引数としてaとbを受け取ります。aとbが等しい場合:aを返します。
a < bの場合:gcd(b, a)を返します(引数の順序を入れ替えて再帰呼び出しします)。
- それ以外の場合:
gcd(b, a - b)を返します。
ユークリッドの互除法の仕組み
ユークリッドの互除法は、「2つの数の最大公約数は、大きい方から小さい方を引いても変化しない」という性質を利用したアルゴリズムです。この引き算の操作を繰り返していくと、最終的に2つの数が等しくなり、その時点の値が最大公約数となります。
実装例
以下のPythonコードを見て、理解を深めましょう。
def gcd(a, b):
if a == b:
return a
elif a < b:
return gcd(b, a)
else:
return gcd(b, a - b)
a = 25
b = 45
print(gcd(a, b))
入力
25, 45
出力
5
処理の流れを追ってみる
上記のコードがどのように動作するのか、a = 25、b = 45 の場合を順番に確認してみましょう。
gcd(25, 45)→ 25 < 45 なのでgcd(45, 25)を呼び出すgcd(45, 25)→ 45 > 25 なのでgcd(25, 20)を呼び出すgcd(25, 20)→gcd(20, 5)を呼び出すgcd(20, 5)→gcd(5, 15)を呼び出すgcd(5, 15)→ 5 < 15 なのでgcd(15, 5)を呼び出すgcd(15, 5)→gcd(5, 10)を呼び出すgcd(5, 10)→gcd(10, 5)を呼び出すgcd(10, 5)→gcd(5, 5)を呼び出すgcd(5, 5)→ 2つの数が等しくなったので 5 を返す
このように再帰呼び出しが繰り返され、最終的に GCD である 5 が得られます。
まとめ
ユークリッドの互除法を再帰関数として実装すると、ロジックがシンプルで直感的なコードになります。ただし、引き算ベースのこの実装は数値の差が大きい場合に再帰の回数が増えるという弱点があります。そのため、実務では「大きい数を小さい数で割った余り」を使う剰余演算(%)による改良版がよく用いられます。まずは本記事の基本形を理解した上で、発展的な実装にも挑戦してみてください。
-
Pythonで配列内の複数の数値の最大公約数(GCD)を求める方法
はじめに本記事では、Pythonを使って配列(リスト)内の2つ以上の数値から最大公約数(GCD:Greatest Common Divisor)を求める方法を解説します。問題の概要数値の配列が与えられ、そのすべての要素に共通する最大公約数を求めることが目的です。3つ以上の数値のGCDは、「引数として渡されたすべての数値に共通する素因数の積」として定義できます。また、隣り合う2つの数値のGCDを繰り返し計算していくことでも求められます。ここでは、後者のアプローチである「ペアごとのGCDを順番に計算する」方法を実装します。アルゴリズムの流れまず、リストの最初の2つの要素のGCDを計算します。次に、
-
Pythonで複数の数値や配列の最大公約数(GCD)を求める方法
本記事では、以下の問題に対する解決策について詳しく解説します。問題の概要与えられた数値の配列から、それらすべての最大公約数(GCD)を求める必要があります。アプローチ2つより多い数値の最大公約数を求める場合、GCDは引数として渡されたすべての数値に共通する素因数の積と等しくなります。これは数学的な定義に基づく方法ですが、実装がやや複雑になります。もう一つの方法として、2つの数値ずつペアでGCDを繰り返し計算するという手法があります。具体的には、最初の2つの数値のGCDを求め、その結果と次の数値のGCDを計算し、これを配列の最後まで繰り返します。本記事では、後者のアプローチを実装していきます。実