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
, 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
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-ユ ークリッドの互除法のプログラム