◎ 今回は ruby で行列を用いる。 require "matrix" と書くことで行列が使えるようになる。
◎ ユークリッドの互除法(初級)
に対して、 を で割った商を , 余りを とおく。
とおくと、
に対して同様な操作を行なう。これを繰り返すことにより、 ベクトル を得る。これが互除法の操作と一致することを確かめよ。
○ ruby による の実装例(ruby では大文字小文字を 区別する。ここでは小文字の変数や関数しか扱わないことにする 。)
def amatrix(q) return(Matrix[[-q,1],[1,0]]) end
◎ 拡張されたユークリッドの互除法
から出発して、 の形の行列をどんどん掛けることで、 最終的に
の形のベクトルを得るのが前の問題の趣旨であった。
今度は の他にもうひとつ単位行列 をならべる。
に の形の行列を掛ける際に、後ろの行列にも同じ行列を 掛ける。
これを何度か繰り返せば、
という行列を得る。これをうまく利用せよ。
## $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)
最終問題: と とおくとき、 の最大公約数 と、 を満たす整数の組 の例をあげよ。