Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Extended Euclidean algorithm

poyo
November 24, 2018
170

Extended Euclidean algorithm

poyo

November 24, 2018
Tweet

Transcript

  1. ふつうの互除法をするとおまけで解が手に入る a を b で割った商を q 、余りを r とする。つまり、a =

    bq + r これらを ax + by = 1 に代入して整理すると となる。もとの式と似てる。a := b, b := r, x := qx + y, y := x とおくと a x + b y = g なのでもうほぼ一緒。a を b で割って...として a や b を定めていけ る。b < b だからいつか b = 0 になる。そしてそのときの a が g = gcd(a, b) だった(互除法) b(qx + y) + rx = g 1 1 1 1 1 1 1 1 1 1 i i i+1 i n n
  2. このとき、あきらかに x = 1, y = 0 が解になる i回式変形をしたあとの方程式の解 x

    , y から i − 1回したときの解 x , y を復元?するには とすればいい(割り算は切り捨て)。a や x などはそれぞれ a, x と考 える。もっと正確には q とか r にも添え字を振らないといけない? n n i i i−1 i−1 xi−1 yi−1 = yi = x − qx = x − qy = x − (a /b )y i i−1 i i i i i i 0 0
  3. 実装例 (ruby) def ext_gcd(a, b) if b == 0 [1,

    0, a] else x, y, g = ext_gcd(b, a % b) [y, x - a / b * y, g] end end 初回の関数呼び出しの時点で a < b だとしても a%b = a なので a と b がswapされてちゃんと動く 参考:https://qiita.com/drken/items/b97ff231e43bce50199a#1-3-ユ ークリッドの互除法のプログラム