扩展欧几里得算法(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;
} 
posted @ 2023-10-20 13:04  xzhiflow  阅读(53)  评论(0)    收藏  举报