一松信の「暗号の数理」を読んでいたら「ユークリッドの互除法」というものがでてきた。二つの正の整数m、nの最大公約数を求めるアルゴリズムである。下記のような手順だ。
- mとnを比較し、必要なら入れかえてm≧nとせよ。
- mをnで割り、商をq、余りをrとせよ。
- 余りrが0(割り切れた)なら、そのときの除数nが最大公約数である。これで完了。
- 余りrが0でなければ、除数nと余りrとをm、n,と置き直して、2.へ戻れ、
この操作を反復すれば、いつか必ず3.に逹っして、完了するであろう。
——一松信「暗号の数理」より
で、なんで、これで最大公約数が求まるのだろう……。
ピンとこなくて考えこんでしまった。
うーむ。
n自身が最大公約数のとき、求まるのはわかる。では2周目はどうだろう。一回目のrが最大公約数の場合。もちろんそのときはrでnが割り切れるはずだ。もちろん、mも割り切れる(mはnとrに分解できるのだから)。
あ、なるほど。そういうことか。
あとは以下同文。
(defun Euclid(m n)
"ユークリッドの互除法。m、nの最大公約数を求める。"
(if (< m n)
(Euclid n m)
(progn
(let ((q (/ m n))
(r (mod m n)))
(if (= r 0)
n
(Euclid n r))))))
(Euclid 25 5) 5 (Euclid 7 5) 1