スナネコです。拡張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回以上になるケース、つまり のときを考えます。
このとき、帰納法の仮定を使いつつ示すべきことをまとめると
「 かつ
かつ
を満たす整数
が与えられる。
、
としたとき、
かつ
となることを示せ」です。
なので
は明らかです。
なので
になることに注意すると、「
かつ
かつ
かつ
」が成り立っているので補題★を使うことができて、
が成り立つことがわかります。
よって帰納法により証明できました。