扩展欧几里得算法
- 在计算最大公约数时,顺便求出一组整数解,使其满足
- 拓展:方程有解的充要条件是
- 可用于求同余方程,但注意,用ex_gcd(a, b, x, y)求得的x不是最终x,因为此时ex_gcd求出的x是满足的的,而不是满足的,二者相差倍
证明 对比和的系数得: 因此可根据递归得到的和计算和
代码
// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x); // 递归结束时,y = x',x = y'
y -= (a/b) * x; // y = x'-(a / b) * y' = y - (a / b) * x
return d;
}
// 详细版
// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int x_new, y_new;
int res = exgcd(b, a % b, x_new, y_new);
x = y_new; // x = y'
y = x_new - (a/b) * x; // y = x' - (a / b) * y'
return res;
}