拡張ユークリッドの互除法の前にユークリッドの互除法を理解する
拡張ユークリッド互除法について、わかりやすかったページなどを紹介しつつ、まとめていきます。
何も見ないで書けるくらい理解するのが目標です。
まず拡張ユークリッド互除法の前にユークリッド互除法を説明します。
整数a, bが与えられた時に、最大公倍数(greatest common divisor)を求めるアルゴリズムがユークリッド互除法です。
まずは一般的な形でユークリッドの互除法を見てから、具体的な数字を当てはめて考えていきます。
こちらのサイトから引用しつつ、説明します。
0より大きい整数があってはより大きいとします。この時以下の操作を繰り返します。
(0) とおいて、ステップ(1)へ進む
(1) なるを取る(はそれぞれをで割った時の商と余り)。のときここで終了し、のとき、とおいて、ステップ(2)へ進む
(2) なるを取る(はそれぞれをで割った時の商と余り)。のときここで終了し、のとき、とおいて、ステップ(3)へ進む
(k) なるを取る(はそれぞれをで割った時の商と余り)。のときここで終了し、のとき、とおいて、ステップ()へ進む
この時、この操作は必ずあるステップで終了し、ステップで終了したとき、である。
少しだけコードにすると、
# 商 q1 = a // b # 余り r1 = a % b
ステップ1からステップ2にいくときのポイントとしては、
ステップ2ではbの値をステップ1の余りで割って、また商と余りを求めているところです。
具体的な数字でやってみます。
gcd(1444, 32)の場合、余りは1444 % 32 = 4、1444 / 32の商は4
次のステップで32を4で割ると余りは0になるので、答えは4になります。
gcd(1414, 154)の場合、余りは1414 % 154 = 28、1414 / 154の商は9
次のステップで、154を28で割ると余りは154 % 28 = 14、商は5になります。
さらに次のステップで、28を14で割ると余りは0になるので、答えは14になります。
この繰り返し操作をコードに落とし込むと、以下のようになります。
def gcd(a: int, b: int) -> int: if b == 0: return a return gcd(b, a % b)
拡張ユークリッド互助法は整数a, bが与えられた時に、最大公約数だけでなく、 を満たすとを求めることができます。
長くなったので拡張ユークリッド互除法は次の機会にまわします。