1.exgcd是什么?
exgcd大名擴展歐幾里得算法,用來求形如 \(\gcd(a,b) = ax + by\) 的方程的通解。
2.推導
引理:存在 \(x,y\in \mathbb Z\) 使得 \(\gcd(a,b) = ax + by\)(裴蜀定理,請自行百度)
當 \(b=0\) 時,\(\gcd(a,b)=a\),此時 \(x_1=1\), \(y_1=0\)
當 \(b\not=0\) 時,
由題,\(ax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx_2+(a\bmod b)y_2 ①\)
又因 \(a\bmod b=a-\lfloor \dfrac{a}{b}\rfloor b\)
則 \(ax+by=bx_2+(a-a\lfloor \dfrac{a}{b}\rfloor b)y_2\)
\(ax+by=bx_2+ay_2-\lfloor \dfrac{a}{b} \rfloor by_2\)
\(ax+by=ay_2+bx_2-b\lfloor \dfrac{a}{b} \rfloor y_2\)
\(ax+by=ay_2+b(x_2-\lfloor \dfrac{a}{b} \rfloor y_2) ②\)
將 \(②\) 式對比 \(①\) 式,得出:
方程 \(\gcd(a,b) = ax + by\) 的通解為 \(x=y_2\) , \(y=x_2-\lfloor \dfrac{a}{b} \rfloor y_2\)
//公式是我一個字一個字手敲的,要敲斷了……
3.代碼實現
void exgcd(int &x,int &y,int a,int b)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(x,y,b,a%b);
int t=x;
x=y;
y=t-a/b*y;
}