スナネコです。拡張GCDについての質問に答えます。
問題:
以下のように実装された extgcd
がある。
整数 が を満たし、extgcd(a, b)
の返り値を としたとき、 が成り立つことを示せ。
def extgcd(a, b): # ax+by=gcd(x,y) を満たす (x,y) を返す if b == 0: return (1, 0) X, Y = extgcd(b, a % b) x = Y y = X - a // b * Y return (x, y)
extgcd(a, b)
が「 を満たす整数 を返すこと」の証明は省略します。
最初に補題を示しておきます。
補題★:
0 でない整数 と整数 について、 かつ かつ が成り立つならば、 である。
証明:
を変形すると、 となり、この両辺を で割ると となります。
ここで の仮定から なので であり です。
仮定から は整数で なので、小数部分を無視してよく が成り立つことがわかりました。
もとの問題の証明をします。
証明:
または のとき、extgcd(a,b)
の返り値は か になることが実際にアルゴリズムの挙動を追うことでわかるのでOKです。
かつ のときを考えます。
かつ が成り立つことを示します。このことが示せれば かつ となって が成り立つことが言えます。
再帰の深さに関する帰納法で証明します。
まず再帰の深さが1回で終わるケース、つまり のときを考えます。
このときは実際にアルゴリズムの挙動を追うことで が返されることがわかるのでOKです。
次に再帰の深さが2回以上になるケース、つまり のときを考えます。
このとき、帰納法の仮定を使いつつ示すべきことをまとめると
「 かつ かつ を満たす整数 が与えられる。 、 としたとき、 かつ となることを示せ」です。
なので は明らかです。
なので になることに注意すると、「 かつ かつ かつ 」が成り立っているので補題★を使うことができて、 が成り立つことがわかります。
よって帰納法により証明できました。