扩展欧几里得学习笔记
简述Exgcd
要求关于\(x,y\)的方程\(ax+by=c\)的一组解。
假装显然我们要先求出\(ax+by=\mathrm{gcd}(a,b)\)的一组解,然后就可以找出所有的解\(x,y\)。
设\(bx'+(a\%b)y'=\mathrm{gcd}(b,a\%b)=\mathrm{gcd}(a,b)\)
\(\because a \% b = a - \left\lfloor\frac{a}{b}\right\rfloor \times b\)
\(\therefore bx' + (a \% b) y' = bx' + (a - \left\lfloor\frac{a}{b}\right\rfloor \times b) y’\)
\(\quad = bx' + ay' - \left\lfloor\frac{a}{b}\right\rfloor \times by’ = ay' + b (x' - \left\lfloor\frac{a}{b}\right\rfloor \times y')\)
故有:
\[\mathrm{Exgcd}(a,b)=\left\{
\begin{array}{}
x = 1,\; y = 1 & \mathrm{if}\;b=0\\
\mathrm{Exgcd}(b,a \% b),\; y = x - \left\lfloor\frac{a}{b}\right\rfloor\times y
& \mathrm{if} \; b \not = 0
\end{array}
\right.
\]
代码
void exgcd(int a, int b, int &d, int &x, int &y) {
if(b == 0) {
d = a, x = 1, y = 0;
} else {
exgcd(b, a % b, d, x, y);
int t = x;
x = y, y = t - (a / b) * y;
}
}