exgcd

programmingysx發表於2024-06-29

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\) 即可。