ユークリッドの互除法とは
ユークリッドの互除法とは、2つの整数 \(a\) と \(b\) \((a>b)\) が与えられたとき、\(a\) を \(b\) で割った余り \(r\) とすることで、\(a\) と \(b\) の最大公約数を求める方法。除法の原理を利用し、割り算を繰り返すことによって最大公約数を求める。
ユークリッドの互除法のアルゴリズム
入力:整数\(a,b\)
出力:最大公約数 \(d\)
- \(a_0 = a\), \(a_1 = b\)
- \(a_i=0\)のとき,
\(d=a_{i-1}\)とし終了 - \(a_{i-1}=a_iq_i+a_{i+1}\)
として2に戻る
プログラム
def euclid(a,b):
a_list = []
if a < b:
a_list.append(b)
a_list.append(a)
if a >= b:
a_list.append(a)
a_list.append(b)
i = 0
while(a_list[-1]!=0):
a_list.append(a_list[i]%a_list[i+1])
i +=1
return a_list[-2]
拡張ユークリッドの互除法とは
拡張ユークリッドの互除法とは、一次不定方程式 \(ax+by=d\) の一つの解を求める方法。\(a_0=a\)、\(a_1=b\) とおくと、以下のように求めることができる。
\([\begin{array}{cc} a_{i-1} \\ a_i \end{array}]= [\begin{array}{cc} a_iq_i+a_{i+1} \\ a_i \end{array}]\) とすると, \([\begin{array}{cc} a_{i-1} \\ a_i \end{array}]= [\begin{array}{cc} q_i & 1 \\ 1 & 0 \end{array}] [\begin{array}{cc} a_i \\ a_{i+1} \end{array}] \) とかける. \([\begin{array}{cc} q_i & 1 \\ 1 & 0 \end{array}]\) の逆行列を,\(L_i\)とする. \([\begin{array}{cc} a_i \\ a_{i+1} \end{array}]=L_i [\begin{array}{cc} a_{i-1} \\ a_i \end{array}] \) これを繰り返すと, \([\begin{array}{cc} d \\ 0 \end{array}]=L_i,\dots,L_2 [\begin{array}{cc} a \\ b \end{array}] \) となる.
拡張ユークリッドの互除法のアルゴリズム
入力:整数\(a,b\)
出力:最大公約数\(d\) と \(ax+by=d\)となる整数\(x, y\)
- \(a_0 =a\), \(a_1 =b\)
- \(x_0 =1\), \(x_1 =0\),\(y_0 =0\), \(y_1 =1\)
- \(a_i=0\)のとき,
\(d=a_i−1\),\(x=x_{i−1}\),\(y=y_{i−1}\)とし終了. - \(a_{i−1} = a_iq_i + a_{i+1}\)により,\(a_{i+1}\)と\(q_i\)を定める.
\(x_{i+1} = x_{i−1} − q_ix_i\) \(y_i+1=y_i−1−q_iy_i\)
として3に戻る.
プログラム
def exEuclid(a,b):
a_list = []
if a < b:
a_list.append(b)
a_list.append(a)
if a >= b:
a_list.append(a)
a_list.append(b)
q = []
x = []
x.append(1)
x.append(0)
y = []
y.append(0)
y.append(1)
i = 0
while(a_list[-1]!=0):
a_list.append(a_list[i]%a_list[i+1])
q.append(a_list[i]//a_list[i+1])
x.append(x[-2]-q[-1]*x[-1])
y.append(y[-2]-q[-1]*y[-1])
i +=1
return x[-2],y[-2],a_list[-2]