重要な洞察は、再帰で、それぞれを見つけs
て、逆方向に作業できることです。だから私たちが持っていると言うと。、、、、およびここで、いくつかの値を使用して、各反復を処理する必要があります。まず、基本的なGCDアルゴリズムの各ステップについて考えてみましょう。t
a
b
a = 21
b = 15
a
b
b % a
c
a = c * b + a % b
21 = 1 * 15 + 6
15 = 2 * 6 + 3
6 = 2 * 3 + 0 -> end recursion
したがって、gcd(g
)は3です。これを取得したら、6と3を決定s
しt
ます。これを行うには、から始めてg
、次のように表現します(a, b, s, t = 3, 0, 1, -1)
。
3 = 1 * 3 + -1 * 0
ここで、0項を削除します。基本アルゴリズムの最後の行から、0 = 6-2 *3であることがわかります。
3 = 1 * 3 + -1 * (6 - 2 * 3)
単純化すると、
3 = 1 * 3 + -1 * 6 + 2 * 3
3 = 3 * 3 + -1 * 6
次に、用語を交換します。
3 = -1 * 6 + 3 * 3
だから私たちはs == -1
とt == 3
のためにa = 6
とを持っていb = 3
ます。したがって、a
との値が与えられた場合b
、gcd2
はを返す必要があり(3, -1, 3)
ます。
ここで、再帰をステップバックし、3つの項を削除します。基本アルゴリズムの最後から2番目の行から、3 = 15-2 * 6であることがわかります。単純化して再度交換します(ゆっくりと、手順がはっきりとわかるように...):
3 = -1 * 6 + 3 * (15 - 2 * 6)
3 = -1 * 6 + 3 * 15 - 6 * 6
3 = -7 * 6 + 3 * 15
3 = 3 * 15 + -7 * 6
したがって、このレベルの再帰では、を返し(3, 3, -7)
ます。ここで、6つの項を削除します。
3 = 3 * 15 + -7 * (21 - 1 * 15)
3 = 3 * 15 + 7 * 15 - 7 * 21
3 = 10 * 15 - 7 * 21
3 = -7 * 21 + 10 * 15
そして出来上がり、 21と15について計算s
しました。t
したがって、概略的には、再帰関数は次のようになります。
def gcd2(a, b):
if (0 == a % b):
# calculate s and t
return b, s, t
else:
g, s, t = gcd2(b, a % b)
# calculate new_s and new_t
return g, new_s, new_t
ここでの目的のために、わずかに異なるベースケースを使用すると、物事が単純化されることに注意してください。
def gcd2(a, b):
if (0 == b):
return a, 1, -1
else:
g, s, t = gcd2(b, a % b)
# calculate new_s and new_t
return g, new_s, new_t