exgcd:
\(Bézout\): 對於任意整數 \(a,b\) 存在一堆整數 \(x,y\) 滿足 \(ax+by=\gcd(a,b)\) 。
在 \(\gcd\) 最後當 \(b=0\) 時,顯然 \(x=1,y=0\) 滿足 \(a\times1+0\times 0=\gcd(a,0)\) 。
若 \(b>0\) ,則 \(\gcd(a,b)=\gcd(b,a\ {\rm mod}\ b)\) 假設有 \(x,y\) 滿足 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\)
\(bx+(a\bmod b)y=bx+(a-b\lfloor\frac{a}{b}\rfloor)y=ay+b(x-\lfloor\frac{a}{b}\rfloor y)\)
\(\therefore x'=y,y'=x-\lfloor\frac{a}{b}\rfloor y\) 可得 \(ax'+by'=\gcd(a,b)\) 成立。
$\therefore $ 其通解可表示為 \(x=x_0+kb,y=y_0-ka\) 。
模板:
程式碼
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a%b, x, y);
int z = x;
x = y;
y = z - (a/b)*y;
return d; // 返回值是 gcd(a, b);
}
對於一般的方程 \(ax+by=c\) ,當且僅當 \(d\mid c\ (d=\gcd(a,b)\ )\) 時有解。
可以先求出 \(ax+by=d\) 的解 \(x_0,y_0\) 易得 \(ax+by=c\) 的解為 \((c/d)x_0,(c/d)y_0\) 。
$\therefore $ 其通解可表示為 \(x=\frac{c}{d}x_0+k\frac{b}{d},y=\frac{c}{d}y_0-k\frac{a}{d}\)
求逆元: 即 \(ax\equiv 1(\bmod p)\) 求 \(x\)
\(\because ax\equiv 1(\bmod p),\gcd(a,p)=1\)
\(\therefore ax=1+py\)
\(\therefore ax+p(-y)=1\)
使用 \(exgcd\) 求得 \(x\) 即可。