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*}\),再带入原式:
又因为 \(a \bmod b=a-\lfloor \frac{a}{b}\rfloor b\),所以:
即原方程的一组特解为 \(\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\)。

浙公网安备 33010602011771号