拡張ユークリッド互除法

算術およびコンピュータプログラミングにおいて拡張ユークリッド互除法はユークリッド互除法の拡張であり、整数abの最大公約数(gcd)に加えて、ベズーの恒等式の係数、つまり整数xyを計算します。

これは証明アルゴリズムです。なぜなら、最大公約数はこの式を満たし、かつ入力を割り切れる唯一の数だからです。[1]また、ほとんど追加コストをかけずに、 abを最大公約数で割る商を計算することもできます。

拡張ユークリッドの互除法は、多項式の最大公約数と 2 つの単変数多項式のベズー恒等式の係数を計算する非常によく似たアルゴリズムを指します

拡張ユークリッドの互除法は、 abが互いに素である場合に特に有用である。この条件において、xはbを法とするaモジュラー逆数でありyはaを法とするbのモジュラー逆数である。同様に、多項式拡張ユークリッドの互除法は、代数体拡大、特に非素数位数の有限体における逆数を計算できる。したがって、両方の拡張ユークリッドの互除法は暗号学において広く用いられている。特に、モジュラー逆数の計算は、 RSA公開鍵暗号方式における鍵ペア導出の重要なステップである。

説明

標準ユークリッドアルゴリズムは、商を用いないユークリッド除算を連続して行う。剰余のみが保存される。拡張アルゴリズムでは、連続する商が用いられる。より正確には、abを入力とする標準ユークリッドアルゴリズムは、商の列と剰余の を計算する。

ユークリッドの除法の主な性質は、右辺の不等式が一意に定義

計算は余りがゼロになった時点で停止し、最大公約数は最後の非ゼロの余りとなる。

拡張ユークリッド互除法も同様に進行するが、次の2つのシーケンスが追加される。

計算は、次の 場合にも停止し、

  • 入力の最大公約数であり
  • ベズー係数
  • abを最大公約数で割った商は次のように与えられ、

さらに、abが両方とも正で

ここで、 はx整数部、つまりx以下の最大の整数を表します

これは、拡張ユークリッドアルゴリズムによって提供されるベズー係数のペアが、上記の不等式の両方を満たす唯一のペアであるため、ベズー係数の最小ペアであることを意味します。

また、これは、 abよりも大きい固定サイズの整数を使用するコンピュータ プログラムによって、整数オーバーフローなしでアルゴリズムを実行できることも意味します

次の表は、拡張ユークリッド互除法が入力値24046に対してどのように進むかを示しています。最大公約数は、列「剰余」の最後の非ゼロのエントリ2です。計算は行 6 で停止します。行 6 の剰余が0であるためです。ベズー係数は、最後から2番目の行の最後の2列に現れます。実際、−9 × 240 + 47 × 46 = 2であることは簡単に確認できます。最後に、最後の行の最後の2つのエントリ 23−120は、符号を除けば、入力値46240を最大公約数2で割った商です。

インデックスiq i −1 剰余r is i t i
024010
14601
2240 ÷ 4652405 × 46 = 1015 × 0 = 10 − 5 × 1 = −5
346 ÷ 104464 × 10 = 604 × 1 = −41 − 4 × −5 = 21
410 ÷ 61101 × 6 = 411 × −4 = 5−5 − 1 × 21 = −26
56 ÷ 4161 × 4 = 2−41 × 5 = −921 − 1 × −26 = 47
64 ÷ 2242 × 2 = 052 × −9 = 23−26 − 2 × 47 = −120

証拠

のシーケンスは非負整数の減少シーケンスであるため( i = 2以降)、何らかの値で停止する必要があります。これは、アルゴリズムが最終的に停止することを証明しています。

最大公約数は と で同じなのでこれは入力の最大公約数が の最大公約数と同じであることを示しています。これは がabの最大公約数であることを証明します。(ここまでの証明は、古典的なユークリッドの互除法の証明と同じです。)

およびのとき、i = 0 および 1に対して関係が成り立ちます。 のすべての場合において、関係は帰納的に導かれます

したがって、はベズー係数です。

マトリックスを考えてみましょう

再帰関係は行列形式で書き直すことができる。

行列 は単位行列であり、その行列式は 1 です。前の式で右端の行列の行列式は -1 です。したがって、 の行列式は となります。特に、 の場合、これをベズーの恒等式として見ると、 と は互いに素であることがわかります証明した関係とユークリッドの補題から、 はbを割り切ることがわかります。つまり、ある整数dに対してとなります関係で割ると となります。したがって、と は互いに素な整数であり、ab を共通因数で割った商です。つまり、共通因数は またはその反意語です。

最後の主張を証明するために、ab がともに正で であると仮定します。すると、となり、 であれば、 EEA における( a , b ) のs列とt列は、最初の 0 と 1 を除けば、 ( b , a ) のt列とs列と同じであることがわかります。定義から、( a , b ) の場合が ( b , a ) の場合に帰着することが分かります。したがって、一般性を失うことなく であると仮定します。

は1であり、( によって存在する)は負の整数であることがわかる。その後、 の符号が交互に変化し、 の大きさが厳密に増加する。これは定義と の場合、 が成り立つという事実から帰納的に導かれる。なぜならであるからである。最初の数項以降についても、同じ理由で同じことが成り立つ。さらに、 ( abがともに正で の場合)であることは容易にわかる。したがって、であることに注目すると、

これには、これまでのどの値よりも絶対値​​が大きいか等しいという事実が伴い、証明はそれぞれ完了しています。

多項式拡張ユークリッド互除法

体 の係数を持つ一変数多項式の場合、ユークリッド除算、ベズーの恒等式、拡張ユークリッド互除法など、すべて同様に機能します。最初の違いは、ユークリッド除算とアルゴリズムにおいて、不等式を次数に関する不等式に置き換える必要があることです。それ以外は、この記事で前述した内容はすべて同じで、整数を多項式に置き換えるだけです。

2 番目の違いは、拡張ユークリッドアルゴリズムによって提供されるベズー係数のサイズの制限にあります。これは多項式の場合により正確であり、次の定理が導かれます。

aとbが2つの非零多項式である場合、拡張ユークリッドアルゴリズムは、次の式で表される一意の多項式ペアst)を生成する。

そして

3つ目の違いは、多項式の場合、最大公約数は非ゼロの定数を乗じた部分までしか定義されないことです。最大公約数を明確に定義する方法はいくつかあります。

数学では、最大公約数は単項多項式であることが一般的に求められます。これを得るには、出力の各要素を の主係数で割るだけで十分です。これによりabが互いに素であれば、ベズーの不等式の右辺は1になります。そうでない場合は、任意の非ゼロ定数が得られます。コンピュータ代数では、多項式は一般に整数係数を持ち、最大公約数を正規化するこの方法は分数が多すぎて不便です。

整数係数を持つ多項式の場合、最大公約数を正規化する2つ目の方法は、すべての出力を の内容で割って原始最大公約数を得ることです。入力多項式が互いに素である場合、この正規化によって最大公約数は1になります。この方法の欠点は、計算中に多くの分数を計算し、簡約する必要があることです。

3つ目のアプローチは、ユークリッド互除法を拡張ユークリッド互除法に拡張するのと同様に、部分終止擬似剰余列のアルゴリズムを拡張することです。これにより、整数係数の多項式から開始する場合、計算されるすべての多項式が整数係数を持つようになります。さらに、計算されるすべての剰余は部分終止多項式です。特に、入力多項式が互いに素である場合、ベズーの恒等式は次のようになります。

ここで、 はab終値を表す。この形式のベズー恒等式では、式に分母は存在しない。全ての値を終値で割ると、そこに現れる有理数に共通の分母が明示的に存在する、古典的なベズー恒等式が得られる。

擬似コード

上記のアルゴリズムを実装するには、まず各ステップで必要なのはインデックス付き変数の最後の2つの値だけであることに注意する必要があります。したがって、メモリを節約するために、各インデックス付き変数を2つの変数に置き換える必要があります。

簡潔にするために、以下のアルゴリズム(およびこの記事の他のアルゴリズム)では並列代入を使用しています。この機能を持たないプログラミング言語では、並列代入は補助変数を用いてシミュレートする必要があります。例えば、最初のアルゴリズムは、

(old_r, r) := (r, old_r - 商 × r)

は以下と同等である

prov := r;r := old_r - 商 × prov;old_r := prov;

他の並列割り当てについても同様です。これにより、次のコードが生成されます。

関数extended_gcd(a, b) (old_r, r) := (a, b) (古いs, s) := (1, 0) (古いt, t) := (0, 1) r ≠ 0の場合 、商 := old_r div rを実行します。 (old_r, r) := (r, old_r − 商 × r) (old_s, s) := (s, old_s − 商 × s) (old_t, t) := (t, old_t − 商 × t) 出力「ベズー係数:」、(old_s, old_t) 出力「最大公約数:」、old_r 出力「最大公約数による商:」、(t, s)

ab を最大公約数で割った値(出力)は、符号が誤っている可能性があります。これは計算の最後に簡単に修正できますが、ここではコードを簡略化するために修正していません。同様に、 aまたはbのいずれかがゼロで、もう一方が負の場合、出力される最大公約数は負となり、出力の符号をすべて変更する必要があります。

最後に、ベズーの恒等式 において、が与えられた場合、 を解くことができることに注意してください。したがって、上記のアルゴリズムを最適化するには、ベズー係数 を生成するシーケンスのみを計算し最後に を計算します。

関数extended_gcd(a, b) s := 0; old_s := 1 r := b; old_r := a r ≠ 0の場合 、商 := old_r div rを実行します。 (old_r, r) := (r, old_r − 商 × r) (old_s, s) := (s, old_s − 商 × s) b ≠ 0 の場合 bezout_t := (old_r − old_s × a) div b それ以外の場合 ベズアウト_t := 0 出力「ベズー係数:」、(old_s、bezout_t) 出力「最大公約数:」、old_r

しかし、多くの場合、これは真の最適化とは言えません。前者のアルゴリズムはマシン整数(つまり、桁数の上限が固定された整数)ではオーバーフローが発生しにくいのに対し、bezout_tの計算におけるold_s × aの乗算はオーバーフローする可能性があるため、この最適化は最大サイズの半分未満で表現できる入力に限定されます。無制限のサイズの整数を使用する場合、乗算と除算に必要な時間は整数のサイズの2乗に比例して増加します。これは、「最適化」によって、小さな整数の乗算/除算のシーケンスが単一の乗算/除算に置き換えられることを意味します。これにより、置き換えられる演算全体よりも多くの計算時間が必要になります。

分数の簡略化

分数1つの/b⁠は、 ab互いに素bが正のとき、標準的な簡略形になります。この標準的な簡略形は、前述の擬似コードの出力行3行を次のように置き換えることで得られます。

 s = 0 の場合、 「ゼロ除算」を出力します。s < 0の場合、s  :  = − s ; t  := − t負の分母を避けるためs = 1の場合、 t (分母が1にならないようにするため)を出力します。 ⁠      t/s

このアルゴリズムの証明は、 stが互いに素な整数であり、+ bt = 0、したがってなるという事実に基づいています。標準的な簡略形を得るには、分母が正になるようにマイナス符号を移動するだけで十分です。

b がa を割り切る場合、アルゴリズムは1回の反復のみを実行し、アルゴリズムの最後にs = 1となります。これは、出力が整数となる唯一のケースです。

モジュラー構造における逆数の計算

拡張ユークリッド互除法は、モジュラー構造、特にモジュラー整数代数体拡大における乗法逆数を計算するための必須のツールです。後者の注目すべき例としては、素数でない位数の有限体があります。

モジュラー整数

nが正の整数である場合、 Z / n Z は、 nによるユークリッド除算、加算、および整数の加算と乗算の結果のnによる剰余をとる乗算の剰余の集合{0, 1, ..., n -1}と同一視される。 Z / n Za は、 nと互いに素である場合、逆元(つまり、単位元を持つ。特に、n が素数である場合a はゼロでない場合( nを法として)、逆元を持つ。したがって、 Z / n Z が体である場合、かつその場合のみ、 n が素数である

ベズーの恒等式は、anが互いに素であるのは、次 の整数stが存在する場合のみであると主張する。

この恒等式をnで割る と

したがってt 、またはより正確にはtをn割った余りは、 nを法としたaの逆数です

この問題に拡張ユークリッド互除法を適用する場合、 nのベズー係数は必要ないため、計算する必要がないことに注意する必要があります。また、nより小さい正の値を得るには、アルゴリズムによって得られる整数t が| t | < nを満たすという事実を利用できます。つまり、t < 0の場合、最後にnを加算する必要があります。この結果、疑似コード が生成されます。このコードでは、入力nは1より大きい整数です。

関数inverse(a, n) t := 0; newt := 1 r := n; 新しいr := a while newr ≠ 0 do 商 := r div newr (t, newt) := (newt, t − 商 × newt) (r, newr) := (newr, r − 商 × newr) r > 1 の場合 「aは逆でない」 を返し、 t < 0の場合 t := t + n tを返す

単純な代数体の拡張

拡張ユークリッド互除法は、単純な代数体拡大における乗法逆数を計算するための主要なツールでもあります。暗号学符号理論で広く用いられている重要な例として、非素数位数の有限体があります。実際、p が素数でq = p dとすると、位数qの体は、次数dの既約多項式の根によって生成される、p元の素体の単純な代数拡大です

Kの単純代数拡大Lは、次数dの既約多項式pの根によって生成され、商環と同一視することができ、その元は次数d未満の多項式と全単射に対応する。 Lにおける加算は多項式の加算である。Lにおける乗算は、多項式の積をpユークリッド除算した剰余である。したがって、 Lにおける演算を完了するには、乗法逆元を計算する方法を定義するだけでよい。これは拡張ユークリッド互除法によって行われる。

このアルゴリズムは、モジュラー逆乗法を計算するための上記アルゴリズムと非常によく似ています。主な違いは2つあります。まず、最後から2番目の行は不要です。これは、提供されるベズー係数の次数が常にd未満であるためです。次に、入力多項式が互いに素である場合、提供される最大公約数はKの任意の非ゼロ元になる可能性があるということです。したがって、このベズー係数(一般に正の次数を持つ多項式)は、 Kのこの元の逆数と乗算される必要があります。以下の擬似コードでは、pは次数が1より大きい多項式であり、aは多項式です。

関数inverse(a, p) t := 0; newt := 1 r := p; 新しいr := a while newr ≠ 0 do 商 := r div newr (r, newr) := (newr, r − 商 × newr) (t, newt) := (newt, t − 商 × newt) 度数(r) > 0の場合 「p は既約ではないか、a は p の倍数です」を返します。 リターン(1/r)×t

例えば、有限体 GF(2 8 )を定義するために使用される多項式がp = x 8 + x 4 + x 3 + x + 1であり、a = x 6 + x 4 + x + 1がその逆元である場合、アルゴリズムを実行すると次の表に示す計算が行われます。 2 n位の体では、体内のすべての元zに対してz = zおよびz + z = 0 が成り立つことを思い出してください。 1 は GF(2) の唯一の非ゼロ元であるため、擬似コードの最後の行の調整は必要ありません。

ステップr、新しいs、ニュースt、イモリ
p = x 8 + x 4 + x 3 + x + 110
a = x 6 + x 4 + x + 101
1× 2 + 1x 2 = pa ( x 2 + 1 )1x 2 + 1 = 0 − 1 · ( x 2 + 1 )
2× 4 + × 2x + 1 = ax 2 ( x 4 + x 2 )x 4 + x 2 = 0 − 1( x 4 + x 2 )x 6 + x 2 + 1 = 1 − ( x 4 + x 2 ) ( x 2 + 1)
3x + 11 = x 2 − ( x + 1) ( x + 1)x 5 + x 4 + x 3 + x 2 + 1 = 1 − ( x + 1)( x 4 + x 2 )x 7 + x 6 + x 3 + x = ( x 2 + 1) − ( x + 1) ( x 6 + x 2 + 1)
4x + 10 = ( x + 1) − 1 × ( x + 1)x 6 + x 4 + x + 1 = ( x 4 + x 2 ) − ( x +1)( x 5 + x 4 + x 3 + x 2 +1)

したがって、逆数はx 7 + x 6 + x 3 + xであり、 2 つの要素を掛け合わせて、その結果のpによる余りを取ることで確認できます。

2つ以上の数字の場合

2つ以上の数の場合も反復的に処理できます。まず、 であることを示します。これを証明するには、 とします。gcd の定義により、はおよび の約数です。したがって、については となります。同様に、 はの約数であるため、については となります。 とします。 の構築により、が最大約数であるため、は単位約数です。また、 であるため、結果は証明されています。

となるので、最終的方程式は

そこでn個の数に適用するには帰納法を使う。

次の方程式が直接続きます。

参照

参考文献

  1. ^ McConnell, Ross; Mehlhorn, Kurt; Näher, Stefan; Schweitzer, Pascal. 「Certifying Algorithms」(PDF) . 2024年9月29日閲覧
  • GF(2^8)の逆数を求めるアルゴリズムの形式の出典
Retrieved from "https://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&oldid=1317083323"