【數學】EXGCD
阿新 • • 發佈:2021-10-27
\(\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;
}