扩展欧几里得算法(exgcd)推导
给定 \(a\),\(b\),求解 \(ax+by=gcd(a,b)\) 的整数解。
考虑递归求解:
边界:
当 \(b=0\) 时,\(gcd(a,b)=a\),即 \(ax+by=a\),容易找到一组特殊解 \(x=1,y=0\)。
考虑一般情况:
\(ax+by=gcd(a,b)\)
\(ax+by=gcd(b,a\%b)\),
\(ax+by=bx_0+(a\%b)y_0\),
\(ax+by=bx_0+(a-⌊\frac{a}{b}⌋b)y_0\),
\(ax+by=ay_0+bx_0-⌊\frac{a}{b}⌋by_0\),
\(ax+by=ay_0+b(x_0-⌊\frac{a}{b}⌋y_0)\)。
所以得到一组特殊解: \(x_0,y_0\),考虑求通解:
\(ax_0+by_0=gcd(a,b)\),
\(\frac{a}{gcd(a,b)}x_0+\frac{b}{gcd(a,b)}y_0=1\),
\(\frac{a}{gcd(a,b)}x_0+k\frac{a}{gcd(a,b)}\frac{b}{gcd(a,b)}+\frac{b}{gcd(a,b)}y_0-k\frac{a}{gcd(a,b)}\frac{b}{gcd(a,b)}=1\),
\(\frac{a}{gcd(a,b)}(x_0+k\frac{b}{gcd(a,b)})+\frac{b}{gcd(a,b)}(y_0-k\frac{a}{gcd(a,b)})=1\),
所以 \(x=x_0+k\frac{b}{gcd(a,b)},y=y_0-k\frac{a}{gcd(a,b)}\)。
又有 \(x\) 的最小非负整数解 \(x=(x_0\%\frac{b}{gcd(a,b)}+\frac{b}{gcd(a,b)})\%\frac{b}{gcd(a,b)}\),\(y\) 类似。
int exgcd(int a,int b,int &x,int &y){//ax+by=gcd(a,b);
if(!b){x=1,y=0;return a;}
int d=exgcd(b,a%b,x,y),tmp=x;
x=y,y=tmp-a/b*y;
return d;
}

浙公网安备 33010602011771号