数学A / 整数の性質
ユークリッドの互除法
問題
ユークリッドの互除法を用いて、 と の最大公約数を求めよ。
ヒントを見る
大きい数を小さい数で割って余りを出す。次は『さっき割った数』を『余り』で割る、をくり返す。余りが になったときの割る数が答え。
解答・解説
方針
大きいほうを小さいほうで割り、余りが出たら『割る数と余り』で同じことを繰り返す。余りが になったときの『割る数』が最大公約数だ。
解答
⓪ 発想 — どう考え始めるか。 と の最大公約数。素因数分解しようとしても、手が止まるはずだ( を割り切る素数がすぐには見えない)。
こういうときのための道具がユークリッドの互除法である。手順は機械的だ。
大きいほうを小さいほうで割り、余りを出す。次は「割る数」と「余り」で同じことを繰り返す。余りが になったら、そのときの割る数が答え。
余りが になった。そのとき割っていた数 が最大公約数。
最後の余り()ではなく、その手前の「割る数」が答え。 ここを取り違えないこと。
互除法は『割って余りを出す』をくり返すだけだ。 を で割ることから始める。
余りが になった。そのときの割る数 が最大公約数だ。
(なぜこれで求まるのか。『 と の公約数』は『 と余り の公約数』とぴったり同じ — 余りを取っても公約数は変わらない。だから数をどんどん小さくしていって、最後に残る数が最大公約数になる。素因数分解しにくい大きな数でも使えるのが強みだ。)
発展 — 一歩先へ。 互除法には、逆に読むという使い方がある。計算の跡を逆走すると、次の形の式が作れるのだ。
実際、互除法の式を下から順に代入していくと
、 が見つかった。 確かめると ✓。
一般に、次の定理が成り立つ。
これは強力だ。 特に と が互いに素()なら
を満たす整数が存在する。これが 次不定方程式が解ける理由であり(次の問題で使う)、暗号理論で「逆元を求める」操作の正体でもある。
互除法は、gcd を求めるだけの道具ではない。 割り算の跡を逆にたどることで、方程式の解までもたらしてくれる。
年前のアルゴリズムが、なぜ今も現役なのか — 速いだけでなく、副産物として深い情報を吐き出すからだ。数学の道具は、しばしば作った人の意図を超えて働く。
別解
互除法が本当に正しいのか、素因数分解で答え合わせをしよう。そして互除法を図形として見ると、この 年前のアルゴリズムの美しさが分かる。
答え合わせ: 素因数分解でも求めてみる。
共通の素因数は だけ( と は互いに素)。
互除法の答えと一致した。
しかし、この分解を見つけるのは大変だったはずだ。 を で割っても割り切れず、 でようやく割れる。 も まで試す必要がある。互除法なら、割り算 回で終わった。
互除法を、図形で見る。
の長方形を、正方形のタイルで敷き詰めることを考えよう。できるだけ大きな正方形で、余りなく敷き詰めたい。
手順1: いちばん大きく取れるのは の正方形。 個切り取ると、 の長方形が残る。
手順2: 残った長方形から、 の正方形を切り取る。 個取れて、 が残る。
手順3: の正方形がちょうど 個で、余りなく埋まった。
最後にぴったり埋まった正方形の 辺が 。これが最大公約数である。
互除法とは「長方形を、できるだけ大きな正方形で敷き詰める手続き」だったのだ。ユークリッドが『原論』でこれを幾何の言葉で書いたのは、偶然ではない。 つの数の共通の"ものさし"を探す — それが最大公約数の意味である。
互除法の速さ。 この方法は、驚くほど速い。 数がどんなに大きくても、割り算の回数は桁数の 倍程度にしかならない(フィボナッチ数列を使って証明できる)。
桁の数どうしでも、 回程度の割り算で gcd が出る — 一瞬だ。一方、同じ数を素因数分解しようとすれば、宇宙の年齢でも足りない。
「割り算を繰り返す」という原始的な操作が、素因数分解という難問を迂回して、答えにたどり着く。 アルゴリズムの勝利である。
ポイント
- 『割る数を余りで割る』をくり返す
- 余りが になったときの割る数が最大公約数
- 大きな数でも素因数分解せずに最大公約数が出せる
よくある間違い
- 最後の『余り 』の1つ手前の余りを答えにしてしまう(割る数が答え)
- 割る数と余りの役割を取り違えて次の割り算に進む
- 途中で余りが大きくなったと勘違いして手順を止める(余りは必ず割る数より小さいので、必ず終わる)