1. 程式人生 > >擴充套件歐幾里得演算法的學習

擴充套件歐幾里得演算法的學習

擴充套件歐幾里得演算法基本公式

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; }