int gcd(int a, int b){ if (!b){ return a; } return gcd(b, a % b); }
设递归函数void exgcd(int a, int b, int &x, int &y)
能够使找到满足上述条件的x,y。
边界 : 当b = 0时,显然x = 1, y = 0.
当b != 0时,我们计算了exgcd(b, a % b, y, x)
\[即得到满足方程\ by + (a \ mod \ b)x = d 的x和y, d为a,b的最大公约数 \\ 将上式变形即 \ ax + (y - \lfloor \frac{a}{b} \rfloor)b = d \]由上式可得
\[设ax + by = d的解为x', y' \\ 则x' = x, y' = y -\lfloor \frac{a}{b} \rfloor \]也就是说,有了exgcd(b, a % b, y, x),我们就可以计算出exgcd(a, b, x, y),在计算的过程中就会不断更新x和y,代码如下
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 -= a / b * x; return d; }
由欧几里得算法可以得到
\[ax_1 + my_1 = d,d = (a, m) \\ 显然 x = \frac{b}{d} x_1, y = - y' = \frac{b}{d}y_1 \]此方程有解的条件是:\((a, m) |b\)
这是\(b\)为\(1\)的线性同余方程,\(m\)不一定是质数