扩展欧几里得算法 学习笔记

概述

扩展欧几里得算法(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\),解得:

\[\begin{aligned}ax+by&=bx'+(a\bmod b)y'\\&=bx'+(a-b\times\lfloor\frac{a}{b}\rfloor)y'\\&=ay'+b(x'-\lfloor\frac{a}{b}\rfloor\times y')\end{aligned} \]

所以 \(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\) 取模就是最小整数解。要注意负数取模。

[[数学]]

posted @ 2024-03-01 09:35  lgh_2009  阅读(11)  评论(0)    收藏  举报