前問題を一般化して自然数
a≧b を与えた際に、a x + b y = gcd(a,b) となる整数の組 (x,y) を出力するプログラムを作成する。
========拡張ユークリッドの互除法のアルゴリズム========
-----------------
入力 : a,b
出力 : gcd(a,b),
a*x+b*y = gcd(a,b) となる整数の組 (x,y)
-----------------
[1] (a(0),x(0),y(0))=(a,1,0), (a(1),x(1),y(1))=(b,0,1)
[2] i=1,2,...について以下を繰り返す
q(i+1) := a(i-1)をa(i)で割った整数の商 (<-商の整数部分)
a(i+1) := a(i-1) - q(i+1)*a(i)
x(i+1) := x(i-1) - q(i+1)*x(i)
y(i+1) := y(i-1) - q(i+1)*y(i)
ただし、a(i+1)=0ならばループを終了する。
[3] [2]のループを出た後に
gcd(a,b)=a(i)
x = x(i)
y = y(i)
として出力する。
このとき、以下の命題を証明することにより、
プログラムが正しく動作することが分かる。それぞれ証明せよ。
(解答)
------------------------
命題1: a(i-1) を a(i) で割ったときの整数の商がq(i+1)で余りが a(i+1)となる。
すなわち、a(i-1)=a(i)*q(i+1)+a(i+1)が任意のi≧1について成立する(ほぼ自明)。
------------------------
------------------------
命題2: 任意のi≧1で a(i+1) = a*x(i+1)+b*y(i+1) が成立する(帰納法)
------------------------
さらに、プログラムを作成して 35x + 22 y = 1 となる x,yをみつけよ。
その際、命題2が正しいことをプログラムを用いて確かめよ。
(解答)