欧几里得算法:(辗转相除法)
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