今日は最後に、拡張ユークリッドアルゴリズムを理解し、自分の理解を持って、それがブログを書いて考えるのが素晴らしいです。
拡張ユークリッドアルゴリズムを導入する前に、まずユークリッドのアルゴリズムを思い出します。
ユークリッドアルゴリズム(ユークリッド):
ユークリッドの最大公約数、高校の学校が、その時点では、大学まで、本当にそれの本質を理解していない理由を、知っています。
理解除去分割、キーはGCD(A、B)== GCD(B、%のB)ことを理解すべきです
それでは、どのようにそれを理解するには?ここに私の理解では、次のとおりです。
最初の非負整数、Bは、= k個*のB +フォームR(R <B)のを書き込むことができるようになります
その結果G = GCD(a、b)は、そこG |、すなわち、G(| k個*のB + R)
そしてG | B、そうグラム| R
もちろん、唯一の同じ時間に達しBおよびG rは依然としてグラムを描くことができない分割== GCD(B、R)、また(B、R)> GをGCDことができます。
だから我々は想定しているが、G「> G(Gそう」のBの除数をすることはできません)
そのようなそのG '| b、およびG' | R
そこG '|(k個*のB + R)、即ち、G' | A
→g「は矛盾の、Bの除数です。
したがって、GCD(A、B)== GCD(B、R)(R ==%b)は証明されています。
次の再帰と非再帰的なコードは、ユークリッドのアルゴリズムを掲載されます。
1 // 再帰ユークリッドの互除法 2 INT GCD(INT A、INTのB) 。3 { 4 リターン Bの== 0 A:GCD(B、%?B); 5。 }
1 // 非再帰ユークリッドアルゴリズム 2 INT GCD(INT A、int型B) 3。 { 4。 INT T; 5 ながら(B){ 6。 T = B; 7 B =%のB; 8 A = T; 9 } 10 リターンA; 11 }
それは注目に値します。
1、最大公約数任意の正の整数であり、0自身の正の整数です。
声明; 2は、たとえパラメータ<B、または再帰ループの後、A、Bは、自動的に(<b)のスワップ(a、b)があれば最初にそれを追加する必要が交換されていません。
拡張ユークリッドアルゴリズム:
実際には、拡張ユークリッドアルゴリズムは=により整数解のGCDを斧+を決定する(A、B)の(X 0、Y 0)、(xの整数解の全てとに来ることができ0 + K * B、 Y 0 -k * A)。
リカーシブ
それは再帰関数は、GCD段階的、整数解(x、y)を返し完了したとき、再帰的な拡張ユークリッドアルゴリズムは、GCDプロセスの再帰的評価に基づいています。
のは、簡単なシミュレーションプロセスの最大公約数を見てみましょう(a、b)は再帰的なリターン(数学的帰納法によって得られた漸化式)
①場合、すなわち、ケースB(第一層に接触)最深再帰GCDは0 == 0、式を導出することができる0 X + B 0 Y = GCD(A、B)(GCD(A、B)をGCD ==(0、B 0)== GCD(1、B 1)... == == 0)溶液は、整数Xの集合である0 = 1、Y 0 = 0。
②式は最後から二番目の層kに戻ることが想定される場合にはk個のX B + K Y = GCD(A、B)X整数の集合の溶液K、Y kは
そして提供さK + 1は、第1の層に戻される往復式のk + 1 X + B K + 1 Y = GCD(B)整数の集合の溶液X K + 1 、YとK + 1
あるK X K + B K Y K = A K + 1 X K + 1 + B K. 1 + Y K + 1 、請求K == B K + 1、B K = A K + 1%のBのK + 1
XなるかもしれないK +を1 = Y K Y K + 1 = X K -a K + 1 / B K + 1 * Y Kを
再帰的なコーディングは以下の投稿します:
1 // 再帰拡張ユークリッドアルゴリズム 2 INT exgcd(INT A、INTの B、INT&X、INT&Y) 3。 { 4。 IF(Bの== 0 ){ 5。 X = 1、Y = 0 ; 6 戻りA ; 7 } 8。 INT R&LT exgcd =(B、%のB、Y、X) 。9 Y- = A / B * X; 10 リターンR&LT; 11 }
非再帰
個人的な感情はヨーロッパに拡張理解することは、いくつかの非再帰的なアルゴリズムレイドが道に簡単。
我々はそれの具体例から始めます。
= 30、B = 47、次いでGCDは(A、B)= 1の場合、解決すべき整数は不定方程式の30X + 47Y = 1つの溶液である場合。
知られているから、我々は持っています
マトリックスの観察は、3列の変換処理の要素は、分割処理のユークリッド最大公約数起こります。
それらの各ステップ、下記一般式で表される(行変換)の変換:
第2の素子列3が0である場合、三つの要素の最初の行は、GCD(A、B)です。
したがって、最終的な溶液は、整数の組(X、Y)=(11、-7)を満たす30X + 47Y = 1を得ることができます。
だから我々は、非ユークリッド再帰的なアルゴリズムに基づいて非再帰的拡張ユークリッドアルゴリズムを書くことができ、次のように、コードは次のとおりです。
1 // 非再帰拡張ユークリッドアルゴリズム 2 のint exgcd(int型 A、int型 B、INT&X、INT&Y) 3。 { 4。 INT、M = 0、= N- 1 、T; 5 X = 1、Y = 0 ; 6 ながら(B){ 7。 T = M、M = XA / B×m個、X = T、 8 T = N、N- =雅/ Bの*のN-、Y = T; 9 T = B、Bは、重量%= B、A = T; 10 } 11。 リターンA、 12です }
私は最終的に終了されるように記述します。
これは、もともと記述するための最も簡単な言語との考え方の中核を目的とした私が書いた最初のブログ、ですが、...... ...... ......予想と一致しない場合がありますように、それはおそらく、少しで...に見えます
私はあなたが一目で確認することができます忘れてしまった場合でも、ブログを書くことによって、あなた自身のアイデアを記録することを願っています。あなたは他の人が深さを理解するのに役立ちます場合はもちろん、それは大丈夫です。
最後に、あなたはエラーのテキストは、任意の提案を持っているか、自分のアイデアのいくつかは、コメント領域に歓迎されていることを発見した場合。