擴展歐幾里得算法

首先引入貝祖定理:

即如果a、b是整數,那麼任意一定存在整數x、y使得ax+by爲gcd(a,b)的倍數,且一定存在整數x,y使得ax+by=gcd(a,b)。

它的一個重要推論是:a,b互質的充要條件是存在整數x,y使ax+by=1.

如果ax+by=m有解,那麼m一定是gcd(a,b)的若干倍,這樣可以來判斷一個這樣的式子有沒有整數解。

例如,6x+15y = 8,兩邊同時除以gcd(6,15)=3,得到2x+5y = 8/3,因此沒有整數解。

擴展歐幾里得算法歐幾里得算法(又叫輾轉相除法)的擴展。已知整數a、b,擴展歐幾里得算法可以在求得a、b的最大公約數的同時,能找到整數x、y(其中一個很可能是負數),使它們滿足貝祖等式

void gcd(int a,int b,int& d,int& x,int& y) {
    if(!b) { d = a; x = 1; y = 0; }
    else{ gcd(b, a%b, d, y, x); y -= x*(a/b); }
}

如此遞歸可以求出一組解,另外的解則與這組解、a與b和gcd(a,b)有關。經過數學推導就可以輕易得出下面的結論。

設a,b,c爲任意整數。若方程ax+by=-c的一組整數解是(x0,y0),則它的任意整數解都可以寫成(x0+kb', y0-ka'),其中a' = a/gcd(a,b),b' = b/gcd(a,b),k取任意整數。因此,通過這個結論,只要求出一組解,就可以得到全部的解了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章