1 拡張ユークリッドの互除法

計算機数学演習 A 2014.5.30. 拡張ユークリッドの互除法
この講義の資料は, http://www.sm.u-tokai.ac.jp/~nakayama/ より入手することができる.
1
拡張ユークリッドの互除法
例 1. 1 次方程式 41x + 29y = 1 の整数解 x, y を計算せよ. 41, 29 に対して, ユークリッドの互除法を行えば次のような
計算過程になる.
41 =1 · 29 + 12
12 =41 − 1 · 29
29 =2 · 12 + 5
5 =29 − 2 · 12 = 2 · 41 + 3 · 29
12 =2 · 5 + 2
2 =12 − 2 · 5 = 5 · 41 − 7 · 29
5 =2 · 2 + 1
1 =5 − 2 · 2 = −12 · 41 + 17 · 29
2 =2 · 1 + 0
よって x = −12, y = 17.
問題 2. 1 次方程式 17x + 13y = 1 の整数解 x, y を計算せよ.
一般に, 整数 a, b に対して, ax + by = GCD(a, b) を満たす整数 x, y を計算するアルゴリズムが 拡張ユークリッドの互
除法 である.
問題 3. 1 次方程式 40x + 28y = 4 の整数解 x, y を計算せよ.
整数 a, b に対して, ax + by = GCD(a, b) を満たす整数 x, y を計算する. a, b に対して, ユークリッドの互除法を適用.
r1 = a, r2 = b とおいておく. ri は ri−2 を ri−1 で割った余りとし, qi−1 をその商とおく. rn+1 = GCD(a, b) であるとす
る. 各 ri が ri = (整数) · a + (整数) · b の形で書けることを見ていく.
r1 =a
r1 =1 · a + 0 · b = x1 · a + y1 · b
r2 =b
r2 =0 · a + 1 · b = x2 · a + y2 · b
r1 =q2 r2 + r3
r3 =r1 − q2 · r2 = (x1 − q2 x2 ) · a + (y1 − q2 y2 ) · b = x3 · a + y3 · b
r2 =q2 r3 + r4
r4 =r2 − q3 · r3 = (x2 − q3 x3 ) · a + (y2 − q3 x3 ) · b = x4 · a + y4 · b
···
rn+1 =rn−1 − qn · rn = (xn−1 − qn xn ) · a + (yn−1 − qn yn ) · b
rn−1 =qn rn + rn+1
rn =qn+1 rn+1 + 0
これより,
GCD(a, b) = rn+1 = (xn−1 − qn xn ) · a + (yn−1 − qn yn ) · b
ここで, xi , yi は,
xi = xi−2 − qi−1 xi−1
(i ≥ 2),
x1 = 1,
x2 = 0,
yi = yi−2 − qi−1 yi−1
(i ≥ 2),
y1 = 0,
y2 = 1
で決まる整数である.
アルゴリズム 4 (拡張ユークリッドの互除法).
入力 : 整数 a, b, 出力 : GCD(a, b) と xa + yb = GCD(a, b) を満たす整数 x, y
1. r1 ← a,
x1 ← 1,
y1 ← 0
2. r2 ← b,
x2 ← 0,
y2 ← 1
3. r2 ̸= 0 である限り, 4, 5, 6, 7 を続ける.
1
4.
r3 ← (r1 を r2 で割った余り),
5.
x3 ← x1 − qx2 ,
6.
r1 ← r2 ,
7.
1 へ.
q ← (r1 を r2 で割った商)
y3 = y1 − qy2
r 2 ← r3 ,
x1 ← x2 ,
x2 ← x3 ,
y 1 ← y2 ,
y2 ← y3
8. r1 , x1 , y1 を出力.
プログラム 5 (拡張ユークリッドの互除法のプログラム). 拡張ユークリッドの互除法を Asir で実装する.
ex gcd.rr
def ex_gcd(A, B)
{
R1 = A;
X1 = 1;
X2 = 0;
R2 = B;
X2 = 0;
Y2 = 1;
while (R2 != 0) {
R3 = R1 % R2;
Q = idiv(R1, R2);
X3 = X1 - Q * X2;
Y3 = Y1 - Q * Y2;
R1 = R2;
R2 = R3;
X1 = X2;
X2 = X3;
Y1 = Y2;
Y2 = Y3;
}
return [R1, X1, Y1];
}
end$
問題 6. プログラムを利用して, 43091x + 40531y = 1 を満たす整数 x, y を求めよ.
問題 7. プログラムを利用して, 11111x + 1111111y = GCD(11111, 1111111) を満たす整数 x, y を求めよ.
問題 8. プログラムを利用して, 123456789x + 987654321y = GCD(123456789, 987654321) を満たす整数 x, y を求めよ.
問題 9. 計算の途中経過も表示するように ex gcd を書き換えよ.
2
多項式に対するユークリッドの互除法
1 変数の多項式についても, 整数と同様に割り算を行うことができた. 約元や公約元や最大公約元なども, 整数と同様
に定義することができる.
例 10. 多項式 f = x3 + x2 + x + 2 を多項式 g = x + 1 で割り算した時, 商は x2 + 1, 余りは 1 である. 割られる元と割
る元の関係式は, f = (x2 + 1)g + 1 となる.
例 11. 多項式 f = (x + 1)2 (x + 2) と g = (x + 1)(x + 2) について, h = (x + 1)(x + 2) は f, g を割り切るので, f と g
の公約元である. さらに, h は f と g の公約元の中で次数が最大のものなので, f と g の最大公約元 GCD(f, g) である.
問題 12. 多項式 f = x4 + x3 + x2 + x + 1 を g = x2 + 2 で割った商と余りを計算せよ.
2
Asir において, 多項式の割り算の商と余りを求める関数として, sdiv と srem がある.
Asir における多項式の割り算
[2010] F=x^4+x^3+x^2+x+1;
x^4+x^3+x^2+x+1
[2011] G=x^2+2;
x^2+2
[2012] sdiv(F, G);
F を G で割った商
x^2+x-1
[2013] srem(F, G);
F を G で割った余り
-x+3
定理 13 (ユークリッドの互除法の原理 (多項式)). 多項式 f, g について, f を g で割った商を q とし, 余りを r とする.
(deg r ≤ deg g) が成り立つ.)この時, GCD(f, g) = GCD(g, r) が成り立つ.
(すなわち, f = qg + r
例 14. GCD(x3 + 9x2 + 26x + 24, x3 + 7x2 + 14x + 8) を計算する.
x3 + 9x2 + 26x + 24 =1 · (x3 + 7x2 + 14x + 8) + (2x2 + 12x + 16)
(
)
1
1
3
2
x + 7x + 14x + 8 =
x+
· (2x2 + 12x + 16) + 0
2
2
だから,
GCD(x3 + 9x2 + 26x + 24, x3 + 7x2 + 14x + 8) = GCD(x3 + 7x2 + 14x + 8, 2x2 + 12x + 16) = 2x2 + 12x + 16
問題 15. GCD(x6 − 1, x4 − 1) を手で計算してみよ.
アルゴリズム 16 (ユークリッドの互除法 (多項式)).
入力 : 多項式 f, g, 出力 : GCD(f, g)
1. g ̸= 0 である限り, 2, 3, 4 を続ける.
2.
r ← (f を g で割った余り)
3.
f ← g,
4.
1 へ.
g←r
5. f を出力.
プログラム 17 (ユークリッドの互除法 (多項式) のプログラム). Asir で上のアルゴリズムを実装すると次のようになる.
p gcd.rr
def p_gcd(F, G)
{
while (G !=
R =
F =
G =
}
return F;
}
end$
0) {
srem(F, G);
G;
R;
問題 18. 上のプログラムを使って, GCD(x6 − 14x4 + 49x2 − 36, x6 − 6x5 + 11x4 − 5x3 − 6x2 + 11x − 6) を計算せよ.
3