ユークリッドの互除法とは
ユークリッドの互
除法は、二つの
自然数の
最大公約数を求めるための
アルゴリズムの一つです。
紀元前300年頃にユークリッドによって記述されたとされ、最も古い
アルゴリズムの一つとしても知られています。この手法は、二つの数に対して繰り返し割り算を行い、その剰余を利用することで
最大公約数を効率的に見つけ出すことができます。
基本的な考え方
二つの
自然数 a と b (a ≧ b) が与えられたとき、a を b で割った余りを r とします。この時、a と b の
最大公約数は、b と r の
最大公約数と等しいという性質を利用します。つまり、gcd(a, b) = gcd(b, r) が成り立ちます。
この性質を利用し、b を r で割った余り、次に r をその余りで割った余り、というように、余りを求める計算を繰り返していきます。この過程を続けていくと、最終的に余りが 0 になります。この時、最後に割る数となったものが、元の二つの数の
最大公約数となります。
具体例
例えば、1071 と 1029 の
最大公約数を求める場合を考えます。
1. 1071 ÷ 1029 = 1 余り 42
2. 1029 ÷ 42 = 24 余り 21
3. 42 ÷ 21 = 2 余り 0
余りが0になった時の割る数である21が、1071と1029の
最大公約数となります。
数学的な証明
ユークリッドの互
除法の正しさは、以下の様に証明できます。
自然数 a, b (a ≠ 0) において、b を a で割ったときの商を q、余りを r とします。このとき、b = qa + r が成り立ちます。
ここで、d₀ を a と r の両方を割り切る
自然数とします。このとき、d₀ は積 qa も割り切るため、和 qa + r、つまり b も割り切ります。したがって、a と r の公約数はすべて b と a の公約数となります。
逆に、d₁ を b と a の両方を割り切る
自然数とします。このとき、d₁ は積 qa を割り切るため、差 b - qa、つまり r も割り切ります。したがって、b と a の公約数はすべて a と r の公約数となります。
これらのことから、b と a の公約数全体の集合は、a と r の公約数全体の集合と等しいことが分かります。特に、b と a の
最大公約数は、a と r の
最大公約数と一致します。
手続き的な記述
ユークリッドの互
除法を
アルゴリズムとして記述すると、以下のようになります。
1. 入力として m, n (m ≧ n) を受け取ります。
2. もし n = 0 なら、m を出力して終了します。
3. m を n で割った余りを新たな n とし、元の n を新たな m とします。
4. ステップ 2 に戻ります。
この手順は、剰余演算が定義されている環境であれば、
整数環だけでなく、ユークリッド整域でも同様に適用できます。
拡張されたユークリッドの互除法
拡張されたユークリッドの互
除法では、二つの
整数 m, n の
最大公約数をgcd(m, n) と表すとき、mx + ny = gcd(m, n) を満たす
整数 x, y の組を求めることができます。
例えば、先ほどの 1071 と 1029 の例では、gcd(1071, 1029) = 21 ですが、この21は、
21 = 1029 - 24 × 42
= 1029 - 24 × (1071 - 1 × 1029)
= -24 × 1071 + 25 × 1029
と変形できるため、x = -24, y = 25 が解の一つとなります。
特に、m と n が互いに素である場合(
最大公約数が1の場合)、mx + ny = 1 の
整数解 (x, y) が存在すれば、任意の
整数 c に対して、mx + ny = c の
整数解 (cx, cy) を見つけることができます。
一般的な表現
m = r₀, n = r₁ とするとき、ユークリッドの互
除法の各ステップを繰り返すと、以下のような関係式が得られます。
r₀ = k₀r₁ + r₂ (0 < r₂ < r₁)
r₁ = k₁r₂ + r₃ (0 < r₃ < r₂)
r₂ = k₂r₃ + r₄ (0 < r₄ < r₃)
...
rₕ₋₁ = kₕ₋₁rₕ + 0
この過程は、行列を用いて表現することもでき、最終的に gcd(m, n) = rₕ となります。
計算量
ユークリッドの互
除法の計算量は非常に効率的です。最悪の場合でも、小さい方の数の桁数の約5倍程度の割り算を繰り返すだけで、
最大公約数に到達します(ラメの定理)。
この
アルゴリズムは、
素因数分解よりも遥かに高速に
最大公約数を求めることができます。
素因数分解は「困難な問題」と考えられていますが、
最大公約数を求めることは「容易な問題」として知られています。
入力された二つの
整数のうち、小さい方の
整数 n の桁数を d とすると、ユークリッドの互
除法では O(d) 回の除算で
最大公約数が求められます。桁数 d は O(log n) であるため、計算量は O(log n) となります。
連分数との関係
ユークリッドの互
除法の計算過程は、連分数展開と密接に関係しています。例えば、1071 と 1029 の
最大公約数を求める過程は、
1071 = 1029 × 1 + 42,
1029 = 42 × 24 + 21,
42 = 21 × 2
と表せます。これを分数で表すと、
1071/1029 = 1 + 42/1029,
1029/42 = 24 + 21/42,
42/21 = 2
となり、最終的に 1071/1029 = 1 + 1/(24 + 1/2) という連分数で表現できます。このように、ユークリッドの互
除法で得られた商は、有理数の連分数展開と一致します。
まとめ
ユークリッドの互
除法は、古代から伝わるにも関わらず、現代でも非常に有効な
アルゴリズムです。そのシンプルさと効率性から、さまざまな分野で応用されています。