1. 程式人生 > 其它 >【數學】EXGCD

【數學】EXGCD

\(\rm EXGCD\),即 擴充套件歐幾里得演算法,簡稱 擴歐,是用來求出方程

\[ax+by=\gcd(a,b) \]

的整數解的,其中 \(a,b\) 均為整數.

前置芝士:輾轉相除法裴蜀定理

我們考慮輾轉相除法的最後一步,當 \(b=0\) 時,要使得

\[ax+0y=\gcd(a,0)=a \]

成立,那麼只要取 \(x=1\)\(y\) 取任意整數即可,不妨取 \(y=0\).

因為 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以可以考慮當整數 \(x,y\) 使得

\[bx+(a\bmod b)y=\gcd(b,a\bmod b) \]

成立時,如何推出使得

\[ax'+by'=\gcd(a,b) \]

成立的 \(x',y'\)

.

對於 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\)

\(\begin{aligned}等式左邊&=bx+(a-b\left\lfloor\frac{a}{b}\right\rfloor)y\\&=ay+b(x-\left\lfloor\frac{a}{b}\right\rfloor y)\end{aligned}\)

\(\begin{aligned}等式右邊&=\gcd(a,b)\end{aligned}\)

所以要使 \(ax'+by'=\gcd(a,b)\) 的話,取 \(x'=y,y'=x-\left\lfloor\frac{a}{b}\right\rfloor y\)

即可。

就這樣一直遞迴。

\(\text{Code}\)

int x, y;

void exgcd(int a, int b)
{
	if (!b)
	{
		x = 1, y = 0;
		return;
	}
	exgcd(b, a % b);
	ll tmp = x; //先將 x 存下來
	x = y;
	y = tmp - a / b * y;
}