【数学】【模板】扩展欧几里得算法
扩展欧几里得算法
思想
首先回忆一下裴蜀定理:对于任意一对不全为 \(0\) 的整数 \(a, b\),存在 \(x, y\) 使得 \(ax + by = \gcd(a, b)\)。
扩展欧几里得算法就是求出一组解满足 \(ax + by = \gcd(a, b)\),这里用到了欧几里得算法,不会的,可以看看我的博客。
我们看看怎么求:
- 当 \(b = 0\) 的时候,\(ax = \gcd(a, b) = a\),那么 \(x = 1\)。
- 当 \(a \ne 0\) 且 \(b \ne 0\) 时,我们递归求解出 \((a\bmod b)x_1 + by_1 = \gcd(a, b)\) 后再计算 \(ax + by = \gcd(a, b)\)。
从 \(x_1, y_1\) 推出 \(x, y\):
\[\begin{aligned}
(a\bmod b)x_1 + by_1 &= \gcd(a, b)\\
(a - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot b)x_1+by_1&= \gcd(a, b)\\
ax_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot bx_1+by_1&= \gcd(a, b)\\
ax_1+b(y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1) &= \gcd(a, b)
\end{aligned}
\]
所以 \(x = x_1, y = y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1\)。
然后就在欧几里得算法的时候顺便求出来了。
代码
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int g = exgcd(b, a % b, y, x);
y -= a / b * x;
return g;
}