欧几里得, 扩展欧几里得 Gcd, Exgcd

欧几里得算法:(辗转相除法)

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

扩展欧几里得:ax + by = gcd(a, b)
gcd(a, b) 是ax + by 的最小正整数解。

怎样求一个x和y满足这个解呢:

inline int Ex_gcd(int a, int b, int &x, int &y)
{
    
    
    if (b == 0) {
    
    
        x = 1, y = 0;
        return a;
    }
    int d = Ex_gcd(b, a % b, y, x);
    y -= a / b * x;

    return d;
}

另一种写法:
inline int Ex_gcd(int a, int b, int &x, int &y)
{
    
    
    if (b == 0) {
    
    
        x = 1, y = 0;
        return a;
    }
    int d = Ex_gcd(b, a % b, x, y); 
    int t = x;
    x = y;
    y = t - a / b * y;

    return d;
}



解释: Ex_gcd(b, a % b, x, y) = d;
x 和 y 是答案, 只是引用
将这个式子写成扩展欧几里得的形式:
bx + (a % b) y = d = gcd(b, a % b)
将式子拆开 : a % b = a - floor(a / b) * b
bx + (a - floor(a / b) * b) * y = d
a y + b * (x - floor(a / b) * y) = d
则,现在的x和y变成了 y 和 (x - floor(a / b) * y), 将其更新 ***** 第二种

**************************************************************************************************/
b y + (a % b) * x = d 跟上边类似
a * x + b * (y - floor(a / b) * x) = d
更新x, y ***************************** 第一种

扩展欧几里得的性质:解 x = x0 + b / gcd(a, b)
y = y0 - a / gcd(a, b)
看一看大佬的:https://blog.csdn.net/niiick/article/details/80119121

猜你喜欢

转载自blog.csdn.net/YingShen_xyz/article/details/112859015