扩展欧几里得算法 学习笔记
概述
扩展欧几里得算法(exgcd)可以得到二元一次不定方程的可行解,过程比较像 \(\gcd\) 的欧几里得算法,是辗转相减的形式。
过程
对于关于 \(x,y\) 的不定方程 \(ax+by=\gcd(a,b)\):
设 \(bx'+(a\bmod b)y'=\gcd(b,a\bmod b)\),这是一个与上面方程形式相同的方程。则 \(bx'+(a\bmod b)y'=\gcd(b,a\bmod b)=\gcd(a,b)=ax+by\),解得:
所以 \(x=y',y=x'-\lfloor\frac{a}{b}\rfloor\times y'\),对于方程 \(bx'+(a\bmod b)y'\) 继续递归求解即可。
当 \(b=0\) 时 \(\gcd(a,b)=a\),此时 \(x=1,y=0\) 为一个解,此时往上回溯得到 \(ax+by=\gcd(a,b)\) 的一组特解。
一个性质:这组特解是 \(ax+by=\gcd(a,b)\) 的所有解中 \(|x|+|y|\) 最小的,若 \(b\ne 0\) 则满足 \(|x|\leq b,|y|\leq a\)。
显然当递归到 \(a\bmod b=0\) 时 \(x=1,y=0\) 满足。按回溯的顺序使用数学归纳法。若 \(x',y'\) 满足 \(|x'|\leq a\bmod b,|y'|\leq b\),则: $$\begin{aligned}|x|&=|y'|\leq b\
|y|&=|x'-\lfloor\frac{a}{b}\rfloor\times y'|\
&\leq |x'|+|\lfloor\frac{a}{b}\rfloor\times y'|\
&\leq a\bmod b+\lfloor\frac{a}{b}\rfloor|y'|\
&=a-b\times\lfloor\frac{a}{b}\rfloor+\lfloor\frac{a}{b}\rfloor|y'|\
&=a-(b-|y'|)\lfloor\frac{a}{b}\rfloor\leq a
\end{aligned}$$
template<typename T>void exgcd(T a,T b,T &x,T &y){
b?(exgcd(b,a%b,y,x),y-=a/b*x):(x=1,y=0);
}
对于一般的二元一次不定方程 \(ax+by=c\),\(\gcd(a,b)\mid ax+by\)。因此当 \(\gcd(a,b)\nmid c\) 时无整数解。
否则,将方程 \(ax+by=\gcd(a,b)\) 的解乘 \(\frac{c}{\gcd(a,b)}\) 即可得到一组可行整数解。
实际应用中往往要求的是 \(x\) 的最小整数解。对于任意整数 \(t\),有 \(ax+by=a(x+bt)+b(y-at)\),所以将 \(x\) 对 \(b\) 取模就是最小整数解。要注意负数取模。
[[数学]]

浙公网安备 33010602011771号