print(knowledge)

アウトプット帳

ユークリッドの互除法

はじめに

競プロをやってると、2つの自然数の最大公約数を求める問題が出てくる。

その時に使うのがユークリッドの互除法という手法。

ユークリッドの互除法がなぜ成り立つのか考えたのをまとめる。

(厳密な証明ではなく、ユークリッドの互除法がなぜ成立するかがなんとなく分かることを目標に書いているので証明が知りたい方はブラウザバックを推奨します)

ユークリッドの互除法とは

自然数  a, b があるとき、

 b = a * q_1 + r_1 (q_1はbをaで割った商、r_1はその余り) (式1)

 a = r_1 * q_2 + r_2 (q_2はaをr_1で割った商、r_2はその余り) (式2)

 r_1 = r_2 * q_3 + r_3 (q_3はaをr_2で割った商、r_3はその余り) (式3)

という処理を余りが0になるまで繰り返した時の最後の商が最大公約数というものである。

(問題) 1071 と 1029 の最大公約数を求める。

1071 を 1029 で割った余りは 42

1029 を 42 で割った余りは 21

42 を 21 で割った余りは 0

よって、最大公約数は21である。

引用:Wikipedia: ユークリッドの互除法

考察

式1において考える。

 a,b の最大公約数を x とすると、式1は

 b_0 * x = a_0 * x * q_1 + r_0 * x (b_0, a_0, r_0は自然数)

と変換できる(これは自明)。

すなわち、全ての項は  x の倍数である。

上記の式1つ1つを1ステップとすると、 1ステップ毎に割る数と割られる数(式1におけるbとa)を小さくしてくと 最終的に余りが0になり、最小公倍数が求められる。

(考察の部分がかなりざっくりなのであとでちゃんと調べます。)