§A4.1整除・余りとユークリッドの互除法

最終更新

整数aaが整数bbを割り切るとは、b=acb = acとなる整数ccが存在することです。このときa∣ba \mid bと書き、aaをbbの約数、bbをaaの倍数と呼びます。4∣124 \mid 12ですが(12=4×312 = 4 \times 3)、5∤125 \nmid 12です(12÷512 \div 5が整数にならない)。

1 除法の原理:商と余りはただ一通り

割り切れないときも、商と余りを使えば必ず整数どうしの関係に書き直せます。

整数aaと正の整数bbに対して、a=qb+ra = qb + r、0≤r<b0 \le r < bを満たす整数q,rq, rがただ一組だけ存在します。 これを除法の原理と呼び、rrを「aaをbbで割った余り」と言います。存在することは、aaからbbを引けるだけ引いていけば0≤r<b0 \le r < bの範囲に必ず落ち着くことから分かり、一意性は、もし2通りの表し方があったとすると差を取ってbbの倍数どうしの差がbb未満になり矛盾する、という議論から出ます。

2 最大公約数と互除法

2つの整数a,ba, b(少なくとも一方は00でない)に共通する約数のうち最大のものを最大公約数と呼び、gcd⁡(a,b)\gcd(a, b)と書きます。

素朴には両方を素因数分解して共通部分を取ればよいのですが、大きな数では素因数分解自体が重い作業です。もっと速い方法があります。rrをaaをbbで割った余りとすると、

gcd⁡(a,b)=gcd⁡(b,r)\gcd(a, b) = \gcd(b, r)

が成り立ちます。これがユークリッドの互除法です。成り立つ理由は難しくありません。a=qb+ra = qb + rなので、ddがaaとbbの両方を割り切るならr=a−qbr = a - qbも割り切りますし、逆にddがbbとrrの両方を割り切るならa=qb+ra = qb + rも割り切ります。つまり「a,ba, bの公約数の集合」と「b,rb, rの公約数の集合」はぴったり一致するので、最大値も当然一致するわけです。

この置き換えを、余りが00になるまで繰り返すだけで最大公約数が求まります。gcd⁡(1071,1029)\gcd(1071, 1029)を計算してみます。

  1. 1071=1×1029+421071 = 1 \times 1029 + 42
  2. 1029=24×42+211029 = 24 \times 42 + 21
  3. 42=2×21+042 = 2 \times 21 + 0

余りが00になった時点の割る数が答えなので、gcd⁡(1071,1029)=21\gcd(1071, 1029) = 21です。

素因数分解しようとすると1071=3×3×7×171071 = 3 \times 3 \times 7 \times 17、1029=3×731029 = 3 \times 7^3と手間がかかりますが、互除法なら3回の割り算で終わります。素因数分解を経由しないというのが互除法の最大の強みで、数百桁の数でも一瞬で最大公約数が求まる理由はここにあります。

閑話休題:現役最古のアルゴリズム ユークリッドの互除法は、名前の通りユークリッドの『原論』(紀元前300年頃)第7巻に載っている手続きです。計算機科学者ドナルド・クヌースは著書『The Art of Computer Programming』で、これを「今なお使われている最古の非自明なアルゴリズム」と呼びました。 2300年前に書かれた手順が、今日も皆さんの電卓やコンピュータの中で(分数の約分から暗号処理まで)現役で動き続けているのです。

では、この手順は最悪どれくらい時間がかかるのでしょうか。1844年、フランスの数学者ガブリエル・ラメは「互除法のステップ数が最も多くなるのは、隣り合うフィボナッチ数の組を入力したときである」ことを証明しました。これは、ある具体的なアルゴリズムの実行時間を数学的に解析した最初期の成果とされ、しばしば「アルゴリズム解析という分野の誕生」の一つに数えられます。直感的にも納得できる話で、フィボナッチ数列は隣り合う項の商がすべて11(21÷13=121 \div 13 = 1余り88、13÷8=113 \div 8 = 1余り55、…)になるため、商が大きく余りが一気に縮む「速い」ケースとは正反対に、毎回わずかしか縮まない「一番ゆっくり進む」最悪ケースになるわけです。

例題

条件と何を求めるかを確認してから、式と答えの対応を見比べてください。

次の2数の最大公約数を、ユークリッドの互除法で求めよ。

解法の型大きい方を小さい方で割り、余りで割る……を繰り返す

  1. 例題 1

    gcd⁡(594, 154)\gcd(594,\ 154)
  2. 例題 2

    gcd⁡(322, 196)\gcd(322,\ 196)
  3. 例題 3

    gcd⁡(1155, 528)\gcd(1155,\ 528)
  4. 例題 4

    gcd⁡(1295, 805)\gcd(1295,\ 805)
  5. 例題 5

    gcd⁡(138, 114)\gcd(138,\ 114)
  6. 例題 6

    gcd⁡(165, 105)\gcd(165,\ 105)
  7. 例題 7

    gcd⁡(399, 273)\gcd(399,\ 273)
  8. 例題 8

    gcd⁡(1225, 595)\gcd(1225,\ 595)
  9. 例題 9

    gcd⁡(338, 312)\gcd(338,\ 312)
  10. 例題 10

    gcd⁡(54, 48)\gcd(54,\ 48)

演習

問題を解いてから「解答・解説」を開けます。

次の2数の最大公約数を、ユークリッドの互除法で求めよ。

演習を読み込み中…

前提記事