exgcd 学习笔记

问题

给定 \(a,b(0\le a,b\le10^{18})\),求 \(ax+by=\gcd(a,b)\) 的合法整数解。

特解

解法

显然,当 \(b=0\) 时,有一组特解 \(x=1,y=0\)
可以先求出一组 \(a'=b,b'=a \bmod b\) 时的一组解 \(x',y'\) 来推出当前的解。
\(\gcd(a,b)=\gcd(b,a \bmod b)\) 带入原式可得 \(bx+(a \bmod b)y=\gcd(b,a \bmod b)\),递归求出一组特解 \(\begin{equation*} \begin{cases} x_0=x \\ y_0=y \end{cases} \end{equation*}\),再带入原式:

\[\begin{align*} ax+by&=\gcd(a,b)\\ &=\gcd(b,a \bmod b)\\ &=bx_0+(a \bmod b)y_0 \end{align*}\]

又因为 \(a \bmod b=a-\lfloor \frac{a}{b}\rfloor b\),所以:

\[\begin{align*} ax+by&=bx_0+(a-\lfloor \frac{a}{b}\rfloor b)y_0\\ &=bx_0+ay_0-\lfloor \frac{a}{b}\rfloor by_0\\ &=ay_0+b(x_0-\lfloor \frac{a}{b}\rfloor y_0) \end{align*}\]

即原方程的一组特解为 \(\begin{equation*} \begin{cases} x=y_0\\ y=x_0-\lfloor \frac{a}{b}\rfloor y_0 \end{cases} \end{equation*}\)

实现

int x,y;
int exgcd(int a,int b)
{
	if (!b)
	{
		x=1; y=0;
		return a;
	}
	int g=exgcd(b,a%b);
	int t=x; x=y; y=t-a/b*y;
	return g;
}

通解

前置

裴蜀定理:对于不定方程 \(ax+by=c\),有整数解的充要条件是 \(\gcd(a,b) \mid c\)
因为 \(\gcd(a,b) \mid (ax+by)\),所以必要性显然。

解法

\(c=\gcd(a,b)k\),可以通过把 \(ax+by=\gcd(a,b)\) 的解 \(x,y\) 都乘上 \(k\) 来得到一组特解 \(x_0,y_0\)
\(g=\gcd(a,b)\)
通解为 \(x=x_0+\frac{b}{g}\times k,y=y_0-\frac{a}{g}\times k\)
带入得 \(a(x_0+\frac{b}{g}\times k)+b(y_0-\frac{a}{g}\times k)=c\),即 \(ax_0+by_0=c\)

posted @ 2022-01-21 11:08  dd_d  阅读(72)  评论(0)    收藏  举报