Pythonで複数の数値や配列の最大公約数(GCD)を求める方法
本記事では、以下の問題に対する解決策について詳しく解説します。
問題の概要
与えられた数値の配列から、それらすべての最大公約数(GCD)を求める必要があります。
アプローチ
2つより多い数値の最大公約数を求める場合、GCDは引数として渡されたすべての数値に共通する素因数の積と等しくなります。これは数学的な定義に基づく方法ですが、実装がやや複雑になります。
もう一つの方法として、2つの数値ずつペアでGCDを繰り返し計算するという手法があります。具体的には、最初の2つの数値のGCDを求め、その結果と次の数値のGCDを計算し、これを配列の最後まで繰り返します。
本記事では、後者のアプローチを実装していきます。
実装例
def findgcd(x, y):
while(y):
x, y = y, x % y
return x
l = [22, 44, 66, 88, 99]
num1 = l[0]
num2 = l[1]
gcd = findgcd(num1, num2)
for i in range(2, len(l)):
gcd = findgcd(gcd, l[i])
print("gcd is: ", gcd)実行結果
gcd is: 11
コードの解説
このプログラムのポイントを順番に見ていきましょう。
GCD計算関数「findgcd」
関数 findgcd(x, y) では、ユークリッドの互除法を使用しています。x % y の剰余を繰り返し計算することで、効率的に最大公約数を導き出せます。ループは y が0になった時点で終了し、その時点の x がGCDとなります。
配列への適用
まず、リスト l の先頭2要素(22と44)のGCDを初期値として計算します。その後、for ループを使って、残りの要素(66、88、99)を1つずつ順に処理し、直前のGCDと新たな要素のGCDを繰り返し求めていきます。
最終的に得られる結果は11です。実際、22、44、66、88、99のすべてに共通する最大の約数は11であるため、正しい結果が得られていることが確認できます。
なお、このプログラムでは変数や関数はすべてグローバルスコープで宣言されています。
まとめ
本記事では、ユークリッドの互除法をベースに、ペアごとのGCD計算を繰り返し適用することで、任意の個数の数値や配列全体の最大公約数を効率的に求める方法を学びました。この手法はシンプルでありながら計算量も少なく、実用的な場面で広く活用できます。
-
Pythonでフィボナッチ数を求める方法:再帰と動的計画法の2つのアプローチを徹底解説
本記事では、「n番目のフィボナッチ数を計算する」という問題に対する解決策と考え方を、2つの異なるアプローチ(再帰的手法と動的計画法)のコード例とともにわかりやすく解説します。 問題の概要 今回の課題は、n番目のフィボナッチ数を求めることです。 フィボナッチ数列 Fn は、次の漸化式によって定義されます。 Fn = Fn-1 + Fn-2 初期値(シード値)は以下の通りです。 F0 = 0、F1 = 1 この問題を解くには、主に次の2つの方法があります。 再帰的なアプローチ 動的計画法によるアプローチ アプローチ1:再帰的な手法 まずは、定義そのものをそのままコードに反映させた再帰的な実
-
Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法
この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要