1.3:ユークリッド互除法
例えば$\gcd(2,3)=1$であるので,系 1.10から$2x+3y=1$は整数解をもつ. 実際,$2 \cdot 2 + 3 \cdot (-1)=1$である. しかし,系 1.10は解の存在は保証するが,具体的に解を求めることはできない.この解をユークリッド互除法を用いることで具体的に見つけることができる.まずはユークリッド互除法を紹介する.これは以下の定理を基本としたアルゴリズムである.定理 1.13 (互除法の基本)
整数$a$を整数$b (\neq 0)$で割ったときの商と余りをそれぞれ$q$と$r$とする.つまり$a=bq+r$で$0 \leq r \lt |b|$である.このとき,
\[
\gcd(a,b)=\gcd(b,r)
\]
である.
証明
$\gcd(a,b)=d_1,\gcd(b,r)=d_2$とする.定義から$d_2 | b$かつ$d_2| r$である.これと$a=bq+r$から$d_2 | a$も従う.よって$d_2$は$a$と$b$の公約数であるから,最大公約数の定義より$d_2 \leq d_1$が成り立つ.同様に$d_1 \leq d_2$も示すことができるので,$d_1=d_2$である.
互除法の基本を繰り返して使うことで最大公約数を求めるアルゴリズムがユークリッド互除法である.
定理 1.14 (ユークリッド互除法)
$0$でない整数$a,b$に対し,$\gcd(a,b)$は,次のアルゴリズムによって,有限回のステップで計算することができる. \begin{eqnarray*}
&&\hbox{INPUT} : a,b\\
&&\hbox{OUTPUT} : d=\gcd(a,b)\\[-4pt]
\\[-4pt]
&&\mbox{$(n,d):=(a,b)$}\\
&&\mbox{$r:=n$を$d$で割ったときの余り}\\
&&\hbox{WHILE}\ \mbox{$r\neq 0$}\ \hbox{DO}\\
&&\qquad\qquad\mbox{$n:=d$}\\
&&\qquad\qquad\mbox{$d:=r$}\\
&&\qquad\qquad\mbox{$r:=n$を$d$で割ったときの余り}\\
&&\hbox{RETURN}\ d
\end{eqnarray*}
証明
証明すべきことはこのアルゴリズム有限回のステップで停止することと,停止したときに出力される$d$が$\gcd(a,b)$となることである.今,WHILEが始まる前の$(n,d,r)$を$(n_0,d_0,r_0)$とし,WHILEが始まって$i$回目の繰り返しが終わったときの$(n,d,r)$を$(n_i,d_i,r_i)$と書くことにする.
$r_0$は$n_0=a$を$d_0=b$で割った余りなので,$0 \leq r_0 \lt |b|$が成り立つ.もし$r_0 \neq 0$であれば,$r_1$は$n_1=d_0$を$d_1=r_0$で割った余りなので$0 \leq r_1 \lt r_0\lt |b|$である.もし$r_1 \neq 0$であれば,$r_2$は$n_2=d_1$を$d_2=r_1$で割った余りなので$0 \leq r_2 \lt r_1 \lt r_0\lt |b|$である.これを繰り返すと,もし任意の$k$に対して$r_k \neq 0$となると狭義単調減少する無限列
\[
0 \leq \cdots \lt r_i \lt r_{i-1} \lt \cdots \lt r_2 \lt r_1 \lt r_0 \lt |b|
\]
が構成できる.
しかし$|b|$より小さい自然数は有限個しか存在しないので,そのような無限列は存在しない.よってある$k$に対して$r_k=0$とならなければならない.したがって,アルゴリズムは有限回のステップで停止する.
今,定理 1.13より \[ \gcd(a,b)=\gcd(b,r_0) \] が成り立つ.$r_0 \neq 0$なら再び定理 1.13より \[ \gcd(a,b)=\gcd(b,r_0)=\gcd(r_0,r_1) \] である. アルゴリズムが$r_k=0$で停止したと仮定すると,同様の議論から等式 \[ \gcd(a,b)=\gcd(b,r_0)=\gcd(r_0,r_1)=\cdots=\gcd(r_{k-1},r_{k})=\gcd(d_{k},0)=d_{k} \] 出力される値が$\gcd(a,b)$であることがわかった.
具体例でユークリッド互除法を使ってみよう.さらにここでは$ax+by=\gcd(a,b)$の整数解$(x,y)$の見つけ方も紹介する.
今,定理 1.13より \[ \gcd(a,b)=\gcd(b,r_0) \] が成り立つ.$r_0 \neq 0$なら再び定理 1.13より \[ \gcd(a,b)=\gcd(b,r_0)=\gcd(r_0,r_1) \] である. アルゴリズムが$r_k=0$で停止したと仮定すると,同様の議論から等式 \[ \gcd(a,b)=\gcd(b,r_0)=\gcd(r_0,r_1)=\cdots=\gcd(r_{k-1},r_{k})=\gcd(d_{k},0)=d_{k} \] 出力される値が$\gcd(a,b)$であることがわかった.
例 1.15
$a=108,b=57$として$\gcd(a,b)$を求める.
\begin{align*}
\underline{108}_a \div \underline{57}_b &\to 108 =1 \times 57 + \underline{51}_{r_0}\\
\underline{57}_b \div \underline{51}_{r_0} &\to 57 =1 \times 51 + \underline{6}_{r_1}\\
\underline{51}_{r_0} \div \underline{6}_{r_1} & \to 51=8 \times 6+\underline{3}_{r_2}\\
\underline{6}_{r_1} \div \underline{3}_{r_2} & \to 6=2 \times 3 +\underline{0}_{r_3}
\end{align*}
から
\[
\gcd(108,57)=\gcd(57,51)=\gcd(51,6)=\gcd(6,3)=\gcd(3,0)=3
\]
が得られる.よって$\gcd(108,57)=3$である.
系1.10から$108x+57y=3$を満たす整数解$(x,y)$が存在することはわかっている. ユークリッド互除法の逆を辿ると少なくとも整数解を1つ見つけることができる. 実際,上の式から \begin{align*} \underline{51}_{r_0}=\underline{108}_a- 1 \times \underline{57}_b \\ \underline{6}_{r_1}=\underline{57}_b-1 \times \underline{51}_{r_0} \\ \underline{3}_{r_2}= \underline{51}_{r_0}-8 \times \underline{6}_{r_1}\\ \end{align*} が得られる. 2つ目の式を3つ目の式の右辺に代入すると \[ 3= \underline{51}_{r_0}-8 \times (\underline{57}_b-1 \times \underline{51}_{r_0} )=(-8) \times \underline{57}_b+ 9 \times \underline{51}_{r_0}. \] 1つ目の式をこの式の右辺に代入すると \[ 3=(-8) \times \underline{57}_b+ 9 \times (\underline{108}_a- 1 \times \underline{57}_b)= 9 \times \underline{108}_a+(-17) \times \underline{57}_b.\] したがって,$108x+57y=3$の整数解として$(x,y)=(9,-17)$が得られた.
1つ整数解を見つけることができれば解全体を求めることは可能である. 実際, \[ \begin{cases} 108x+57y=3\\ 108 \cdot 9 + 57 \cdot (-17)=3 \end{cases} \] に対し,上式から下式を引くと \[ 108(x-9)+57(y+17)=0 \] が得られる.$\gcd(108,57)=3$からこの方程式の両辺を$3$で割って \[ 36(x-9)+19(y+17)=0 \] つまり$36(x-9)=-19(y+17)$である.これより,$36 | (-19)(y+17)$がわかる.特に,命題 1.11から$36$と$-19$は互いに素なので,$36 | y+17$である.したがって,ある整数$k$を用いて$y+17=36k$と表せる. また \[ 36(x-9)=-19 \cdot 36k \] から$x=-19k+9$となる. よって$108x+57y=3$の整数解全体の集合は \[ \{(-19k+9, 36k-17): k \in \mathbb{Z}\} \] である.
系1.10から$108x+57y=3$を満たす整数解$(x,y)$が存在することはわかっている. ユークリッド互除法の逆を辿ると少なくとも整数解を1つ見つけることができる. 実際,上の式から \begin{align*} \underline{51}_{r_0}=\underline{108}_a- 1 \times \underline{57}_b \\ \underline{6}_{r_1}=\underline{57}_b-1 \times \underline{51}_{r_0} \\ \underline{3}_{r_2}= \underline{51}_{r_0}-8 \times \underline{6}_{r_1}\\ \end{align*} が得られる. 2つ目の式を3つ目の式の右辺に代入すると \[ 3= \underline{51}_{r_0}-8 \times (\underline{57}_b-1 \times \underline{51}_{r_0} )=(-8) \times \underline{57}_b+ 9 \times \underline{51}_{r_0}. \] 1つ目の式をこの式の右辺に代入すると \[ 3=(-8) \times \underline{57}_b+ 9 \times (\underline{108}_a- 1 \times \underline{57}_b)= 9 \times \underline{108}_a+(-17) \times \underline{57}_b.\] したがって,$108x+57y=3$の整数解として$(x,y)=(9,-17)$が得られた.
1つ整数解を見つけることができれば解全体を求めることは可能である. 実際, \[ \begin{cases} 108x+57y=3\\ 108 \cdot 9 + 57 \cdot (-17)=3 \end{cases} \] に対し,上式から下式を引くと \[ 108(x-9)+57(y+17)=0 \] が得られる.$\gcd(108,57)=3$からこの方程式の両辺を$3$で割って \[ 36(x-9)+19(y+17)=0 \] つまり$36(x-9)=-19(y+17)$である.これより,$36 | (-19)(y+17)$がわかる.特に,命題 1.11から$36$と$-19$は互いに素なので,$36 | y+17$である.したがって,ある整数$k$を用いて$y+17=36k$と表せる. また \[ 36(x-9)=-19 \cdot 36k \] から$x=-19k+9$となる. よって$108x+57y=3$の整数解全体の集合は \[ \{(-19k+9, 36k-17): k \in \mathbb{Z}\} \] である.