next up previous
Next: About this document ... Up: 計算機数学 No.15 Previous: 今日すること

ヒントと問題

◎ 今回は ruby で行列を用いる。 require "matrix" と書くことで行列が使えるようになる。

◎ ユークリッドの互除法(初級)

$\displaystyle v_0=
\begin{pmatrix}
a
\\
b
\end{pmatrix}$

に対して、$ b$$ a$ で割った商を % latex2html id marker 823
$ q$ , 余りを $ r$ とおく。

% latex2html id marker 827
$\displaystyle A(q)=
\begin{pmatrix}
-q & 1 \\
1 & 0
\end{pmatrix}$

とおくと、

% latex2html id marker 829
$\displaystyle v_1=A(q)v_0=
\begin{pmatrix}
r
\\
a
\end{pmatrix}$

$ v_1$ に対して同様な操作を行なう。これを繰り返すことにより、 ベクトル $ v_0,v_1,\dots,$ を得る。これが互除法の操作と一致することを確かめよ。

○ ruby による % latex2html id marker 835
$ A(q)$ の実装例(ruby では大文字小文字を 区別する。ここでは小文字の変数や関数しか扱わないことにする 。)

def amatrix(q)
  return(Matrix[[-q,1],[1,0]])
end

◎ 拡張されたユークリッドの互除法

$\displaystyle v_0=
\begin{pmatrix}
a
\\
b
\end{pmatrix}$

から出発して、% latex2html id marker 839
$ A(q)$ の形の行列をどんどん掛けることで、 最終的に

$\displaystyle \begin{pmatrix}
0
\\
d
\end{pmatrix}$

の形のベクトルを得るのが前の問題の趣旨であった。

今度は $ v_0$ の他にもうひとつ単位行列 $ E$ をならべる。

$\displaystyle B_0=(v_0 \vert E)
=
\begin{pmatrix}
a \vert & 1 & 0 \\
b \vert & 0 & 1
\end{pmatrix}$

$ a,b$% latex2html id marker 851
$ A(q)$ の形の行列を掛ける際に、後ろの行列にも同じ行列を 掛ける。

これを何度か繰り返せば、

% latex2html id marker 853
$\displaystyle \begin{pmatrix}
0 \vert & p & q \\
d \vert & r & s
\end{pmatrix}$

という行列を得る。これをうまく利用せよ。
## $B%W%m%0%i%`Nc(B
require "matrix"
def amatrix(q)
  return(Matrix[[-q,1],[1,0]])
end

def gojoho(a,b)
  v=Vector[a,b]
  m=Matrix.I(2)            ###m$B$N=i4|CM$OC10L9TNs(B
  while (true)             ###$BL58B%k!<%W(B
    if (v[0]==0) then      ### == $B$KCm0U!#(B
      return([v[1],m])     ### v[0]=0 $B$J$iC&=P(B 
    end
    q1=v[1].div(v[0])
    m1=amatrix(q1)
    v=m1*v
    m=m1*m
  end
end

### $B<B9TNc(B
p gojoho(113,25)

最終問題: $ a=10^8-1$$ b=30^7$ とおくとき、$ m,n$ の最大公約数 $ d$ と、 $ ax+by=d$ を満たす整数の組 $ (x,y)$ の例をあげよ。



2017-08-07