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;
}