擴充套件歐幾里得演算法的學習
阿新 • • 發佈:2019-02-04
擴充套件歐幾里得演算法基本公式
ax + by = gcd(a , b)
這個公式我們不用證明,就假設它是對的。要注意幾點,對於這個公式我們這麼去理解,存在一對(x,y)使得ax + by = gcd(a , b)成立;
那麼肯定也存在一對(x1, y1)使得b * x1 + a % b * y1 = gcd(b, a%b)成立 其中a % b我們看成一個整體。
關鍵的時候來了, 一個簡單的事實是gcd(a, b) = gcd(b, a%b) 於是乎ax + by = b * x1 + a % b * y1 化簡等式我們可以得到
- x = y1;
- y = x1 - y1(a / b)
其中(a/b)是整除
這也是一個遞推的關係知道xn和yn後可以求出xn-1和yn-1,但是最注意邊界條件是x=1, y=0;
程式碼
#include <iostream>
using namespace std;
int gcdEx(int a, int b, int &x, int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r = gcdEx(b, a%b, x, y);
int x1 = x, y1 = y;
x = y1;
y = x1 - (a / b) * y1;
return r;
}
int main()
{
int x, y;
cout<<gcdEx(47, 30, x, y)<<"\n";
cout<<x<<" "<<y;
return 0;
}