扩展欧几里得算法是用来求一个线性方程 ax+by==gcd(a,b) 的解的算法,当然这个解并不一定唯一,但是当你算出一组解之后你就可以算出这个方程的通解,下面来证明
ax+by == gcd(a,b) ——1方程
bx'+(a%b)y' == gcd(b,a%b) ——2方程
因为 a%b==a-a/b*b
带入第二个方程就可以得到 ay' + b(x' - a/b*y') == gcd(b,a%b)
与第一个方程构成恒等式 x==y' y==x'-a\b*y'
这样我们就可以递归下去直到边界, 边界条件就是 a==0 ,b==1 gcd(a,b)==a 此时x==1,y==0;
void Exgcd(int a,int b,int &d,int &x,int &y){
if(!b){d=a;x=1;y=0;return;}
Exgcd(b,a%b,d,y,x),y-=a*x/b;
}
通解 (x0+k*b',y0-k*a') ,其中b'=b/gcd a'=a/gcd
这样我们就可以得到一组解 (x0,y0) 接下来就可以用 (x0+k*b',y0-k*a') ,其中b'=b/gcd a'=a/gcd
至于为什么成立,将通解代入 ax+by=gcd 当中,你会发现 会被抵消掉,最后还是变形成 ax0+by0=gcd
另 我们可以使用阔欧算法求解某个数的逆元 即当 a与MOD互素时 ax+MOD*y=1 用扩展欧几里得求出的x即为a在摸MOD意义下的逆元
(需要注意的是 x可能为负数 将其转化为整数即可)