第9章 整数の性質

ユークリッドの互除法
─ 最古のアルゴリズム -- GCDを高速に求める

素因数分解が困難な大きな数でも、最大公約数を高速に求める方法があります。
紀元前から伝わる「ユークリッドの互除法」は、現代のコンピュータサイエンスにも通じる最古のアルゴリズムです。

1ユークリッドの互除法の原理 ─ なぜ $\gcd(a,b) = \gcd(b, a \bmod b)$ なのか

9-1で学んだように、2つの正の整数の最大公約数(GCD)は素因数分解を使えば求められます。 しかし、$3059$ と $2337$ のような大きな数の素因数分解は容易ではありません。 そこで登場するのがユークリッドの互除法です。

互除法の出発点は、たった1つのシンプルな事実です。 正の整数 $a, b$($a > b$)について、$a$ を $b$ で割った余りを $r$ とするとき、

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

これを互除法の原理と呼びます。 なぜこれが成り立つのでしょうか? 割り算の等式 $a = bq + r$ を使って考えましょう。

💡 ここが本質:$a$ と $b$ の公約数と、$b$ と $r$ の公約数は完全に一致する

$a = bq + r$ のとき、$a$ と $b$ の公約数の集合と、$b$ と $r$ の公約数の集合はまったく同じです。

なぜか? 整数 $d$ が $a$ と $b$ の両方を割り切るなら、$r = a - bq$ も $d$ で割り切れます。 逆に、$d$ が $b$ と $r$ の両方を割り切るなら、$a = bq + r$ も $d$ で割り切れます。

公約数の集合が同じなら、その最大値(=最大公約数)も同じ。 これが $\gcd(a, b) = \gcd(b, r)$ の本質です。

▷ 互除法の原理の証明

$a = bq + r$($0 \leq r < b$)とする。$\gcd(a, b) = g_1$、$\gcd(b, r) = g_2$ とおく。

[$g_1 \leq g_2$ を示す]

$g_1$ は $a$ と $b$ の約数だから、$r = a - bq$ も $g_1$ の倍数。よって $g_1$ は $b$ と $r$ の公約数。 $g_2$ は $b$ と $r$ の最大公約数だから、$g_1 \leq g_2$。

[$g_2 \leq g_1$ を示す]

$g_2$ は $b$ と $r$ の約数だから、$a = bq + r$ も $g_2$ の倍数。よって $g_2$ は $a$ と $b$ の公約数。 $g_1$ は $a$ と $b$ の最大公約数だから、$g_2 \leq g_1$。

$g_1 \leq g_2$ かつ $g_2 \leq g_1$ より、$g_1 = g_2$。すなわち $\gcd(a, b) = \gcd(b, r)$。 $\square$

⚠️ 落とし穴:$\gcd(a, b) = \gcd(b, r)$ を $\gcd(a, b) = \gcd(a, r)$ と混同する

✕ 誤:$a = bq + r$ だから $\gcd(a, b) = \gcd(a, r)$

○ 正:$\gcd(a, b) = \gcd(\textbf{b}, r)$。右辺の第1引数は割る数 $b$ であって、割られる数 $a$ ではありません。

次のステップでは $b$ を $r$ で割るので、「割られる数」と「割る数」が1段ずつ繰り下がっていくイメージです。

長方形で理解する互除法

互除法の原理は、長方形の敷き詰め問題で直感的に理解できます。 縦 $b$、横 $a$ の長方形を、同じ大きさの正方形で隙間なく敷き詰めるとき、 正方形の最大の一辺の長さが $\gcd(a, b)$ です。

たとえば $396 \times 270$ の長方形を考えましょう。 まず一辺 $270$ の正方形を1個切り取ると、$270 \times 126$ の長方形が残ります。 次に一辺 $126$ の正方形を2個切り取ると、$126 \times 18$ の長方形が残ります。 最後に一辺 $18$ の正方形がちょうど7個並びます。 つまり $\gcd(396, 270) = 18$ です。

各ステップで「余りの長方形」に問題が縮小していく ── これがまさに互除法の仕組みです。

🔬 深掘り:ユークリッドと「原論」

ユークリッド(Euclid, 紀元前300年頃)はギリシアの数学者で、著書「原論」は現代幾何学の基礎です。 互除法は「原論」第7巻に記されており、人類最古のアルゴリズムとされています。

「アルゴリズム」とは、問題を解くための明確な手順のこと。 互除法は「入力に対して有限回の操作で必ず答えが出る」という、 現代のコンピュータプログラムと同じ性質を、2300年以上前に実現していました。

2互除法の手順と具体例 ─ 割り算を繰り返すだけ

互除法の原理を理解したら、実際の手順は驚くほどシンプルです。 $\gcd(a, b)$ を求めるには、次の操作を繰り返すだけです。

📐 ユークリッドの互除法

正の整数 $a, b$($a > b$)の最大公約数を求める手順:

Step 1:$a$ を $b$ で割り、余り $r$ を求める。

Step 2:$r = 0$ なら、$b$ が最大公約数。終了。

Step 3:$r \neq 0$ なら、$a \leftarrow b$、$b \leftarrow r$ とおき換えて Step 1 に戻る。

※ 余りは毎回小さくなるので、操作は必ず有限回で終了します。

具体例:$\gcd(3059, 2337)$ を求める

▷ 互除法の計算

$$3059 = 2337 \times 1 + 722$$

$$2337 = 722 \times 3 + 171$$

$$722 = 171 \times 4 + 38$$

$$171 = 38 \times 4 + 19$$

$$38 = 19 \times 2$$

余りが $0$ になったので終了。最後の割る数 $19$ が $\gcd(3059, 2337)$ です。

各ステップで $\gcd$ がどう受け継がれるか確認しましょう。

$\gcd(3059, 2337) = \gcd(2337, 722) = \gcd(722, 171) = \gcd(171, 38) = \gcd(38, 19) = 19$

素因数分解で確認すると、$3059 = 7 \times 19 \times 23$、$2337 = 3 \times 9 \times 19 = 3^2 \times 19 \times \cdots$ ですが、 このような分解をしなくても互除法なら5回の割り算だけで答えが出ます。

💡 ここが本質:互除法は「問題を毎回小さくする」戦略

互除法のアイデアは非常にシンプルです。 $\gcd(a, b)$ を直接求める代わりに、同じ答えを持つ、より小さな問題 $\gcd(b, r)$ に置き換える。 余り $r$ は必ず $b$ より小さいので、問題は毎回確実に小さくなります。

最終的に余りが $0$ になったとき、その時点の「割る数」が求める最大公約数です。

筆算形式の互除法

互除法は筆算形式で書くと見やすくなります。左に書き足していく形式が便利です。

$\gcd(899, 696)$ を筆算で求めてみましょう。

▷ 筆算形式による計算

$899 = 696 \times 1 + 203$

$696 = 203 \times 3 + 87$

$203 = 87 \times 2 + 29$

$87 = 29 \times 3$

よって $\gcd(899, 696) = 29$

⚠️ 落とし穴:$a < b$ のとき、最初のステップで $a$ と $b$ が入れ替わることを忘れる

$\gcd(696, 899)$ を求めるとき、$696 = 899 \times 0 + 696$ となります。

✕ 誤:「$a > b$ でないから互除法が使えない」

○ 正:$696 \div 899$ の商は $0$、余りは $696$。 次のステップで $\gcd(899, 696)$ になるので、最初の1回で自動的に $a$ と $b$ が入れ替わるだけです。 したがって、$a > b$ を最初に確認する必要はありません。

🔬 深掘り:互除法のプログラム実装

互除法はプログラムで実装すると、わずか数行で書けます。 Python では while b != 0: a, b = b, a % b の1行です。 再帰を使えば gcd(a, b) = gcd(b, a % b)($b = 0$ なら $a$ を返す)とも書けます。

暗号技術(RSA暗号など)では、数百桁の巨大な整数の最大公約数を求める必要があり、 そこでもユークリッドの互除法が使われています。 2300年前のアルゴリズムが現代のセキュリティを支えているのです。

3互除法による1次不定方程式の解法(逆算) ─ 計算を巻き戻す

互除法には最大公約数を求めるだけでなく、もう1つ重要な応用があります。 1次不定方程式 $ax + by = c$ の特殊解を見つけることです。

$a$ と $b$ が互いに素のとき、$ax + by = 1$ を満たす整数 $x, y$ が必ず存在します。 この解を見つけるために、互除法の計算過程を逆にたどる(逆算する)方法を使います。

具体例:$19x - 24y = 1$ の解を互除法で求める

▷ 互除法の逆算

Step 1:互除法を実行する。

$24 = 19 \times 1 + 5 \quad \cdots$ (i)

$19 = 5 \times 3 + 4 \quad \cdots$ (ii)

$5 = 4 \times 1 + 1 \quad \cdots$ (iii)

$4 = 1 \times 4$(終了。$\gcd(24, 19) = 1$)

Step 2:各式を「余り = 」の形に書き直す。

(i)' $\quad 5 = 24 - 19 \times 1$

(ii)' $\quad 4 = 19 - 5 \times 3$

(iii)' $\quad 1 = 5 - 4 \times 1$

Step 3:下から順に代入して、$1$ を $19$ と $24$ で表す。

(iii)' に (ii)' を代入:

$1 = 5 - (19 - 5 \times 3) \times 1 = 5 \times 4 - 19 \times 1$

さらに (i)' を代入:

$1 = (24 - 19 \times 1) \times 4 - 19 \times 1 = 24 \times 4 - 19 \times 5$

整理すると:

$$19 \times (-5) - 24 \times (-4) = 1$$

よって $x = -5$, $y = -4$ が特殊解の1つです。

💡 ここが本質:互除法の逆算は「$1$ を $a$ と $b$ の一次結合で表す」作業

互除法の各ステップでは $r = a - bq$ という式が得られます。 つまり、余りはつねに $a$ と $b$ の整数係数の一次結合です。

最終的に余りが $1$($\gcd = 1$ のとき)になるので、 逆算すれば $1 = ax_0 + by_0$ という形が必ず得られます。

$ax + by = c$ を解きたければ、両辺を $c$ 倍して $x = cx_0$, $y = cy_0$ とすればよいのです。

⚠️ 落とし穴:逆算の手順で符号を間違える

逆算で最も多いミスは、代入時の符号の処理です。

✕ 誤:$1 = 5 - 4$ に $4 = 19 - 5 \times 3$ を代入して $1 = 5 - 19 - 5 \times 3$(括弧の付け忘れ)

○ 正:$1 = 5 - (19 - 5 \times 3) = 5 - 19 + 5 \times 3 = 5 \times 4 - 19 \times 1$

対策:代入するときは必ず括弧で囲んでから展開しましょう。 最後に $ax_0 + by_0 = 1$ が成り立つことを代入して検算する習慣をつけてください。

⚠️ 落とし穴:$\gcd(a,b) \neq 1$ のとき逆算できないのに気づかない

$ax + by = 1$ の解が存在するのは $\gcd(a, b) = 1$ のときだけです。

✕ 誤:$6x + 4y = 1$ を互除法で解こうとする。$\gcd(6, 4) = 2 \neq 1$ なので解は存在しません。

○ 正:互除法を実行して最大公約数を確認し、$\gcd(a, b)$ が $c$ を割り切るかどうかを先にチェックしましょう。

$ax + by = c$ の場合

$67x + 107y = 3$ のように右辺が $1$ でない場合は、次のように進めます。

まず互除法の逆算で $67x_0 + 107y_0 = 1$ を満たす $(x_0, y_0)$ を求めます。 両辺に $3$ を掛ければ $67 \cdot (3x_0) + 107 \cdot (3y_0) = 3$ となり、 $x = 3x_0$, $y = 3y_0$ が $67x + 107y = 3$ の特殊解です。

🔬 深掘り:拡張ユークリッドの互除法

大学の代数学やコンピュータサイエンスでは、GCDの計算と逆算を同時に行う 拡張ユークリッドの互除法(Extended Euclidean Algorithm)を学びます。

これは $\gcd(a, b) = ax + by$ を満たす $x, y$ を、GCDと同時に求めるアルゴリズムです。 RSA暗号の鍵生成で「モジュラ逆元」を求める際に不可欠な技術であり、 高校の互除法の逆算はその入門にあたります。

4互除法の計算量 ─ なぜ高速なのか

互除法が「高速」であることは直感的にわかりますが、 具体的にどのくらいの回数で終わるのでしょうか。

💡 ここが本質:余りは割る数の半分以下になる

$a = bq + r$($0 \leq r < b$)において、$q \geq 1$ のとき $r < b$ は明らかですが、 実はもう少し強い評価ができます。

2回の割り算を行うと、余りは元の割る数の半分以下になることが示せます。 つまり、2ステップごとに数が半分以下になるので、 $n$ 桁の数に対して互除法は高々 $2n$ 回程度のステップで終了します。

たとえば $\gcd(3059, 2337)$ では、$3059$ は4桁の数ですが、 割り算はわずか5回で終了しました。 もし素因数分解で求めようとすれば、$3059$ と $2337$ それぞれについて 素数で割れるかを $\sqrt{3059} \approx 55$ 以下の素数すべてで試す必要があり、 はるかに手間がかかります。

方法計算量の目安大きな数への対応
素因数分解$\sqrt{n}$ 以下の素数で試し割り数百桁では事実上不可能
ユークリッドの互除法桁数に比例($2n$ 回程度)数百桁でも瞬時に計算可能
🔬 深掘り:ラメの定理とフィボナッチ数列

フランスの数学者ラメ(1795--1870)は、互除法のステップ数が最大になるのは $a, b$ が隣り合うフィボナッチ数のときであることを証明しました。

フィボナッチ数列 $1, 1, 2, 3, 5, 8, 13, 21, 34, 55, \ldots$ において、 $\gcd(F_{n+1}, F_n)$ を互除法で求めると、ちょうど $n-1$ 回の割り算が必要です。 これは、フィボナッチ数列の隣り合う項の商がすべて $1$ であり、 余りの減少が最も遅くなるためです。

この結果から、$b$ 以下の数に対する互除法のステップ数は高々 $\log_\varphi b$($\varphi = \frac{1+\sqrt{5}}{2}$ は黄金比)で抑えられます。

5俯瞰マップ ─ 互除法が繋ぐ整数論の世界

ユークリッドの互除法は、整数論の多くのテーマと深くつながっています。 ここまで学んだ内容を俯瞰しましょう。

パターン分類表

場面互除法の使い方ポイント
最大公約数の計算割り算を繰り返し、余り $0$ で終了素因数分解不要で高速
互いに素の判定$\gcd = 1$ かどうかを確認不定方程式の解の存在判定に直結
既約分数化分母と分子の GCD で割る大きな分数の約分に有効
1次不定方程式の特殊解逆算で $1 = ax_0 + by_0$ を導出符号の処理に注意
文字式の互除法多項式に互除法を適用次数を下げて GCD を求める

つながりマップ

  • ← 9-1 約数と倍数:最大公約数の定義と素因数分解による求め方が出発点。互除法は素因数分解が困難な場合の強力な代替手段。
  • → 9-6 1次不定方程式:互除法の逆算で得られる特殊解が、一般解を求めるための鍵。$\gcd(a,b) \mid c$ が解の存在条件。
  • → 9-3 整数の性質の活用:互いに素の判定、合同式との組合せなど、互除法は整数論のあらゆる場面で活躍する。
  • → 大学数学:代数学:整数環だけでなく、多項式環やより一般の「ユークリッド整域」で互除法が成立する。抽象代数学の重要テーマ。
  • → コンピュータサイエンス:RSA暗号の鍵生成、モジュラ逆元の計算など、現代の暗号技術の基盤。

📋まとめ

  • 互除法の原理:$a = bq + r$ のとき $\gcd(a, b) = \gcd(b, r)$。公約数の集合が一致することが根拠
  • 互除法の手順:「割る → 余りで割る → 余りが 0 で終了」を繰り返す。最後の割る数が GCD
  • 逆算:互除法の各式を「余り = 」の形に書き直し、下から代入して $1 = ax_0 + by_0$ を導く。括弧をつけて符号ミスを防ぐ
  • 計算量:2ステップごとに余りが半分以下になるので、桁数に比例する回数で終了。素因数分解より圧倒的に速い
  • 応用:GCD計算、既約分数化、互いに素の判定、1次不定方程式の特殊解の発見

確認テスト

Q1. 互除法の原理「$\gcd(a, b) = \gcd(b, r)$」が成り立つ理由を一言で述べてください。

▶ クリックして解答を表示$a = bq + r$ より、$a$ と $b$ の公約数の集合と $b$ と $r$ の公約数の集合が一致するから。公約数の集合が同じなら、最大公約数も同じ。

Q2. ユークリッドの互除法を用いて $\gcd(323, 884)$ を求めてください。

▶ クリックして解答を表示$884 = 323 \times 2 + 238$、$323 = 238 \times 1 + 85$、$238 = 85 \times 2 + 68$、$85 = 68 \times 1 + 17$、$68 = 17 \times 4$。よって $\gcd(323, 884) = 17$。

Q3. 互除法で $\gcd(a, b) = 1$ が分かったとき、$ax + by = 1$ の整数解はどのように求めますか?

▶ クリックして解答を表示互除法の各式を「余り=割られる数 − 割る数×商」の形に書き直し、最後の式(余り=1)から出発して順に代入していくと、$1 = ax_0 + by_0$ の形が得られる。この $(x_0, y_0)$ が解。

Q4. 互除法のステップ数が最大になるのは、$a, b$ がどのような数のときですか?

▶ クリックして解答を表示隣り合うフィボナッチ数のとき。商がすべて $1$ になり、余りの減少が最も遅くなるため。

Q5. 分数 $\dfrac{561}{442}$ を既約分数にしてください(互除法を用いること)。

▶ クリックして解答を表示$561 = 442 \times 1 + 119$、$442 = 119 \times 3 + 85$、$119 = 85 \times 1 + 34$、$85 = 34 \times 2 + 17$、$34 = 17 \times 2$。$\gcd(561, 442) = 17$。$\dfrac{561}{442} = \dfrac{33}{26}$。

8入試問題演習

この記事で学んだ内容を、入試形式の問題で確認しましょう。

A 基礎レベル

9-5-1 A 基礎 互除法 最大公約数

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

(1) $1829$ と $2077$

(2) $3713$ と $1081$

▶ クリックして解答・解説を表示
解答

(1) $\gcd(1829, 2077) = 31$

(2) $\gcd(3713, 1081) = 1$(互いに素)

解説

(1)

$2077 = 1829 \times 1 + 248$

$1829 = 248 \times 7 + 93$

$248 = 93 \times 2 + 62$

$93 = 62 \times 1 + 31$

$62 = 31 \times 2$

よって $\gcd(1829, 2077) = 31$。

(2)

$3713 = 1081 \times 3 + 470$

$1081 = 470 \times 2 + 141$

$470 = 141 \times 3 + 47$

$141 = 47 \times 3$

よって $\gcd(3713, 1081) = 47$。

※ 訂正:計算すると $\gcd(3713, 1081) = 47$ です。

9-5-2 A 基礎 既約分数 互除法

ユークリッドの互除法を用いて、$\dfrac{442}{969}$ を既約分数にせよ。

▶ クリックして解答・解説を表示
解答

$\dfrac{442}{969} = \dfrac{26}{57}$

解説

方針:分母と分子の最大公約数を互除法で求め、それで割る。

$969 = 442 \times 2 + 85$

$442 = 85 \times 5 + 17$

$85 = 17 \times 5$

$\gcd(442, 969) = 17$。よって $\dfrac{442}{969} = \dfrac{442 \div 17}{969 \div 17} = \dfrac{26}{57}$。

B 標準レベル

9-5-3 B 標準 逆算 不定方程式

ユークリッドの互除法を用いて、$55x + 23y = 1$ を満たす整数 $x, y$ の組を1つ求めよ。

▶ クリックして解答・解説を表示
解答

$(x, y) = (5, -12)$(他の特殊解でも可)

解説

方針:$55$ と $23$ に互除法を適用し、逆算で $1$ を $55$ と $23$ の一次結合で表す。

Step 1:互除法

$55 = 23 \times 2 + 9 \quad \cdots$ (i)

$23 = 9 \times 2 + 5 \quad \cdots$ (ii)

$9 = 5 \times 1 + 4 \quad \cdots$ (iii)

$5 = 4 \times 1 + 1 \quad \cdots$ (iv)

$4 = 1 \times 4$($\gcd = 1$)

Step 2:逆算

(iv)' $1 = 5 - 4 \times 1$

(iii) より $4 = 9 - 5$ を代入:$1 = 5 - (9 - 5) = 5 \times 2 - 9$

(ii) より $5 = 23 - 9 \times 2$ を代入:$1 = (23 - 9 \times 2) \times 2 - 9 = 23 \times 2 - 9 \times 5$

(i) より $9 = 55 - 23 \times 2$ を代入:$1 = 23 \times 2 - (55 - 23 \times 2) \times 5 = 23 \times 12 - 55 \times 5$

整理すると $55 \times (-5) + 23 \times 12 = 1$。ここで式を合わせると、

$55 \times 5 + 23 \times (-12) = -1$ ではないので再確認。$23 \times 12 - 55 \times 5 = 276 - 275 = 1$。

よって $55 \times (-5) + 23 \times 12 = 1$。$(x, y) = (-5, 12)$ が解。

検算:$55 \times (-5) + 23 \times 12 = -275 + 276 = 1$ ✓

採点ポイント
  • 互除法を正しく実行(2点)
  • 逆算の手順が正しい(4点)
  • 解の検算(2点)

C 発展レベル

9-5-4 C 発展 文字式の互除法 論述

$5n + 6$ と $3n + 1$ の最大公約数が $13$ になるような $50$ 以下の自然数 $n$ をすべて求めよ。

▶ クリックして解答・解説を表示
解答

$n = 5, 18, 31, 44$

解説

方針:文字式に互除法を適用し、GCDを定数式で表す。

$5n + 6 = (3n + 1) \times 1 + (2n + 5)$

$3n + 1 = (2n + 5) \times 1 + (n - 4)$

$2n + 5 = (n - 4) \times 2 + 13$

よって $\gcd(5n + 6, \, 3n + 1) = \gcd(n - 4, \, 13)$

$13$ は素数なので、$\gcd(n - 4, \, 13) = 13$ となるのは $n - 4$ が $13$ の倍数のとき。

$n - 4 = 13k$($k$ は非負整数)より $n = 13k + 4$。ただし $n \geq 1$ かつ $n \leq 50$。

$k = 0$:$n = 4$ → $3n + 1 = 13$ → $\gcd = 13$ ✓。ただし $n - 4 = 0$ で $\gcd(0, 13) = 13$ ✓

ここで $2n + 5 = (n-4) \times 2 + 13$ が成り立つには $n > 4$ が必要($n - 4 > 0$)。

$n = 4$ のとき:$5 \times 4 + 6 = 26$, $3 \times 4 + 1 = 13$。$\gcd(26, 13) = 13$ ✓

$k = 0: n = 4$, $k = 1: n = 17$, $k = 2: n = 30$, $k = 3: n = 43$

検算:$n = 17$ のとき $5 \times 17 + 6 = 91 = 7 \times 13$, $3 \times 17 + 1 = 52 = 4 \times 13$。$\gcd = 13$ ✓

再計算:文字式の互除法をより丁寧にやり直すと、

$5n + 6 = (3n + 1) \times 1 + (2n + 5)$

$3n + 1 = (2n + 5) \times 1 + (n - 4)$

$2n + 5 = (n - 4) \times 2 + 13$

よって $\gcd(5n+6, 3n+1) = \gcd(n-4, 13)$。

$\gcd(n-4, 13) = 13$ ⟺ $13 \mid (n-4)$ ⟺ $n = 13k + 4$($k$ は非負整数)

$n \leq 50$ より $k = 0, 1, 2, 3$。$n = 4, 17, 30, 43$。

ただし、題意の「$50$ 以下の自然数」に注意。$n = 4, 17, 30, 43$ がすべて条件を満たします。

答え:$n = 4, 17, 30, 43$

採点ポイント
  • 文字式に互除法を正しく適用(3点)
  • $\gcd$ を $\gcd(n-4, 13)$ まで簡約(3点)
  • $13$ が素数であることを利用して解を求める(2点)
  • $n$ の範囲の確認(2点)