1. 程式人生 > >擴充套件歐幾里德演算法 遞迴和非遞迴實現及證明

擴充套件歐幾里德演算法 遞迴和非遞迴實現及證明

關於歐幾里得演算法,貝祖等式,擴充套件歐幾里得演算法,Wikipedia的解釋非常非常詳細了。
另外,看了好多別人優秀的總結,我認為最詳盡的就是ACM之家的總結。
這裡自己再總結一次…實際上就是把別人總結的,我認為有助於自己理解的內容copy過來,再加上幾句自己的理解。

本文包括:

  1. 歐幾里德演算法 遞迴實現
  2. 歐幾里德演算法 非遞迴實現
  3. 貝祖等式
  4. 擴充套件歐幾里德演算法 遞迴實現
  5. 擴充套件歐幾里德演算法 非遞迴實現

歐幾里得演算法

歐幾里德演算法又稱輾轉相除法,用於計算兩個整數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形式的正整數。(這個定義的本質是整環中“理想”的概念。因此對於多項式整環也有相應的裴蜀定理。)

證明:

如果 ab 中有一個是 0,比如 a=0,那麼它們兩個的最大公約數是 b。這時裴蜀等式變成 by=m,它有整數解 (x,y) 當且僅當 mb 的倍數,而且有解時必然有無窮多個解,因為 x 可以是任何整數。定理成立。
以下設 a和 b 都不為0。
A={xa+yb;(x;y)Z2} ,下面證明A中的最小正元素是 a 與 b 的最大公約數。
首先,AN 不是空集(至少包含|a||b|),因此由於自然數集合是良序的, A 中存在最小正元素d0=x0a+y0b。考慮A中任意一個元素p=x1a+y1bd0 的帶餘除法:設p=qd0+r,其中 q 為正整數,0r<d0。但是
r=pqd0=x1a+y1bq(x0a+y0b)A
d0 已經是集合 A 中最小的正元素了,又 0r<d0,所以 r=0
因此 d0|p。也就是說,A中任意一個正元素p都是 d0 的倍數,特別地:d0|ad0|b。因此 d0ab 的公約數。
另一方面,對 a 和 b 的任意正公約數d,設 a=kdb=ld,那麼
d0=x0a+y0b=(x0k+y0l)d
x0k+y0l1 ,因此 d|d0。所以 d0ab 的最大公約數。
在方程ax+by=m中,如果 m=m0d0,那麼方程顯然有無窮多個解:
這裡寫圖片描述
相反的,如果ax+by=m有整數解,那麼 |m|A,於是由前可知 d0|