扩展欧几里得推导

欧几里得算法用来求a, b 的最大公约数,还称辗转相除法;
它的递归实现是:

int gcd(int a, int b) { 
    if (b == 0) return a;
    return gcd(b, a%b);
}

现在我们假设有一个二元一次方程组;
ax + by = gcd(a, b);(那么这个二元一次方程的解一定存在)
我们知道,根据欧几里得算法,下一个状态的a, b 是对应的b, a%b;
也就是

ax + by = d;//(1)
bx1 + (a%b)y1 = d;因为a%b = a - a/b*b;
那么有: bx1 + (a - a/b*b)y1 = d;
d = ay1 + b(x1 - a/b*y1);
原来的式子: d = ax + by;
那么有
x = y1; 
y = x1 - a/b*y1;
在b == 0的情况在gcd(a, b) = a; 那么可以根据(1)求得 x = 1;

以下就是代码的递归的实现:

int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int r = exgcd(b, a%b, x, y);
    int t = x; x = y; y = t - a/b*y;
    return r;
}

你可能感兴趣的:(数论中国剩余定理&欧几里得)