int exGcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int r = exGcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
把這個實現和Gcd的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德算法的精髓。
可以這樣思考:
對於a' = b, b' = a % b 而言,我們求得 x, y使得 a'x + b'y = Gcd(a', b')
由於b' = a % b = a - a / b * b (註:這裡的/是程式設計語言中的除法)
那么可以得到:
a'x + b'y = Gcd(a', b') ===>
bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b) ===>
ay +b(x - a / b*y) = Gcd(a, b)
因此對於a和b而言,他們的相對應的p,q分別是 y和(x-a/b*y)
補充:關於使用擴展歐幾里德算法解決不定方程的辦法
對於不定整數方程pa+qb=c,若 c mod Gcd(p, q)=0,則該方程存在整數解,否則不存在整數解。
上面已經列出找一個整數解的方法,在找到p * a+q * b = Gcd(p, q)的一組解p0,q0後,p * a+q * b = Gcd(p, q)的其他整數解滿足:
p = p0 + b/Gcd(p, q) * t
q = q0 - a/Gcd(p, q) * t(其中t為任意整數)
至於pa+qb=c的整數解,只需將p * a+q * b = Gcd(p, q)的每個解乘上 c/Gcd(p, q) 即可。
相關詞條
-
擴展歐幾里德算法
擴展歐幾里德算法是用來在已知a, b求解一組x,y,使它們滿足貝祖等式: ax+by = gcd(a, b) =d(解一定存在,根據數論中的相關定理)。...
歐幾里德算法 擴展算法 -
歐幾里德算法
歐幾里德算法又稱輾轉相除法,是指用於計算兩個正整數a,b的最大公約數。套用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mo...
算法簡介 計算證明 算法原理 程式設計 算法版本 -
擴展歐幾里德定理
由擴展歐幾里德定理,可以通過擴展歐幾里德算法求解線性同餘方程
擴展歐幾里德定理 c++語言實現 求解 x,y的方法的理解 -
主曲線算法
是Hastie[14]於1984年提出的。主曲線是通過數據分布“中央”並滿足“自相合”的光滑曲線,其目的是根據給定的數據集合求出一條曲線,使得這條曲線對...
概念 定義 主曲線算法研究 初始化工作 研究動機與意義 -
擴展歐幾里得算法
擴展歐幾里得算法是歐幾里得算法(又叫輾轉相除法)的擴展。除了計算a、b兩個整數的最大公約數,此算法還能找到整數x、y(其中一個很可能是負數)。通常談到最...
簡介 例子 實現 -
最大公約數
除法:輾轉相除法是求兩個自然數的最大公約數的一種方法,也叫歐幾里德算法...相減損術,是出自《九章算術》的一種求最大公約數的算法,它原本是為約分...。所以更相減損法也叫 等值算法。例1.用更相減損術求98與63的最大...
基本概念 求法 常用結論 歷史發展 性質 -
歐幾里得算法
(a,p) = d 所以d | 1 所以d只能為1 擴展歐幾里德算法 擴展...; return y3; } } 擴展歐幾里德算法對於最大公約數的計算和普通...,考察一組數(t1,t2,t3),用歸納法證明:當通過擴展歐幾里德算法計算...
歐幾里德算法 模P乘法逆元 擴展歐幾里德算法 計算乘法逆元 -
套用密碼學
模運算 (54) 4.1.3 歐幾里德算法(Euclidean Algorithm) (56) 4.1.4 擴展的歐幾里德算法...講解密碼學基本知識和闡述密碼理論的同時,還介紹了大量的算法,闡述了部分...
圖書信息 內容簡介 圖書目錄 基本信息 簡介 -
《上帝擲骰子嗎》
《上帝擲骰子嗎》 摘要 愛因斯坦:「一個人的價值,應該看他貢獻了什麼,而不是他取得了什麼。」 愛因斯坦說:「我不相信上帝是靠擲骰...
《上帝擲骰子嗎》 序 第一章 黃金時代 第二章 烏雲 第三章 火流星