擴充套件歐幾里德演算法 遞迴和非遞迴實現及證明
關於歐幾里得演算法,貝祖等式,擴充套件歐幾里得演算法,Wikipedia的解釋非常非常詳細了。
另外,看了好多別人優秀的總結,我認為最詳盡的就是ACM之家的總結。
這裡自己再總結一次…實際上就是把別人總結的,我認為有助於自己理解的內容copy過來,再加上幾句自己的理解。
本文包括:
- 歐幾里德演算法 遞迴實現
- 歐幾里德演算法 非遞迴實現
- 貝祖等式
- 擴充套件歐幾里德演算法 遞迴實現
- 擴充套件歐幾里德演算法 非遞迴實現
歐幾里得演算法
歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數 gcd(a,b)。基本演算法:設 a = qb + r,其中a,b,q,r都是整數,則 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd(b,a%b)。
證明:
a = qb + r
如果 r = 0,那麼 a 是 b 的倍數,此時顯然 b 是 a 和 b 的最大公約數。
如果 r ≠ 0,任何整除 a 和 b 的數必定整除 a - qb = r,而且任何同時整除 b 和 r 的數必定整除 qb + r = a,所以 a 和 b 的公約數集合與 b 和r 的公約數集合是相同的。特別的,a 和 b 的最大公約數是相同的。
遞迴實現:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a%b);
}
非遞迴實現:
int gcd(int a, int b)
{
while (b)
{
int t = b;
b = a % b;
a = t;
}
return a;
}
貝祖等式
在數論中,裴蜀等式(英語:Bézout’s identity)或貝祖定理(Bézout’s lemma)是一個關於最大公約數(或最大公約式)的定理。裴蜀定理得名於法國數學家艾蒂安·裴蜀,說明了對任何整數a、b和它們的最大公約數d,關於未知數x和y的線性丟番圖方程(稱為裴蜀等式):
ax + by = m 有整數解時當且僅當m是d的倍數。
裴蜀等式有解時必然有無窮多個整數解,每組解x、y都稱為裴蜀數,可用擴充套件歐幾里得演算法(Extended Euclidean algorithm)求得。
例如,12和42的最大公因數是6,則方程12x+42y=6有解。事實上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。
特別來說,方程 ax+by=1 有整數解當且僅當整數a和b互素。
裴蜀等式也可以用來給最大公約數定義: d其實就是最小的可以寫成ax+by形式的正整數。(這個定義的本質是整環中“理想”的概念。因此對於多項式整環也有相應的裴蜀定理。)
證明:
如果
以下設 a和 b 都不為0。
設
首先,
而
因此
另一方面,對 a 和 b 的任意正公約數
在方程
相反的,如果