首页 > 编程语言 >扩展欧几里得算法 exgcd

扩展欧几里得算法 exgcd

时间:2023-01-23 14:33:42浏览次数:58  
标签:le bmod dfrac 欧几里得 exgcd times 算法 tt

凌:前言

\(\tt \# include~"\)\(\tt{\small\texttt{扩展欧几里得算法 - }}OI~Wiki\)\(\tt "\)
\(\tt \# include~"\)\(\tt{\small\texttt{关于}}~exgcd~{\small\texttt{求得特解的数值范围 - }}ycx's~blog\)\(\tt "\)

\({\tt \# define}~~a/b~~\left\lfloor\dfrac ab\right\rfloor\)
\({\tt \# define}~~d~~\gcd(a,b)\)
\({\tt \# define}~~a'~~a/d\)
\({\tt \# define}~~b'~~b/d\)


依:扩展欧几里得算法

\(a,b\) 为非负整数,且不同时为 \(0\) ,解关于 \(x,y\) 的不定方程 \(ax+by=d\) 。

使用辗转相除法求解。

假设我们已知

\[bx+(a\bmod b)y=\gcd(b,a\bmod b) \]

的一组解为 \(x_1,y_1\) ,那么

\[bx_1+(a\bmod b)y_1=d \]

\[bx_1+(a-(a/b)\times b)y_1=d \]

\[ay_1+b(x_1-(a/b)\times y_1)=d \]

所以 \(\begin{cases}x_0=y_1\\y_0=x_1-(a/b)\times y_1\end{cases}\) 是 \(ax+by=d\) 的一组解。

边界条件为 \(b=0\) ,此时方程为 \(ax=a\) ,取 \(x=1,y=0\) 即可。

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

exgcd 得出的 \(x_0,y_0\) 是原方程的一组特解。而通解形式为

\[\begin{cases}x=x_0+b'k\\y=y_0-a'k\end{cases}~(k\in\bf Z) \]

证明略。


二:值域分析

\(x_0,y_0\) 一定是所有解中 \(|x|+|y|\) 最小的(之一)。并且:

  1. 若 \(a=0\) ,则 \(x_0=0,y_0=1\) ;

  2. 若 \(b=0\) ,则 \(x_0=1,y_0=0\) ;

  3. 若 \(ab\ne 0,a=b\) ,则 \(x_0=0,y_0=1\) ;

  4. 若 \(ab\ne 0,a\ne b\) ,则 \(|x_0|\le \dfrac b2,|y_0|\le \dfrac a2\) 。

第 1~3 条没啥好说的。下面给出第 4 条的证明。

不难发现 \(\tt exgcd(a,b,x,y)\) 和 \(\tt exgcd(a',b',x,y)\) 得到的解是相同的。
所以不妨设 \(a,b\) 互质,原命题不会变弱。

考虑归纳。
设 exgcd 求解 \(bx+(a\bmod b)y=1\) 得到的是 \(x_1,y_1\) 。

若 \(b=1\) ,则 \(x_1=1,y_1=0\)(第 2 条)。
计算得 \(x_0=0,y_0=1\) ,显然满足第 4 条。

若 \(b\ne 1\) ,易证 \(b(a\bmod b)\ne 0\) 且 \(b\ne a\bmod b\) ,符合第 4 条的前提条件。
只需证明:由 \(|x_1|\le \dfrac{a\bmod b}2,|y_1|\le\dfrac b2\) 可以推出 \(|x_0|\le \dfrac b2,|y_0|\le \dfrac a2\) 。
这样就完成了一个完整的归纳证明。

最后,我们有

\[\begin{aligned} |x_0|&=|y_1|\\ &\le \dfrac b2\\ |y_0|&=|x_1-(a/b)\times y_1|\\ &\le |x_1|+|(a/b)\times y_1|\\ &\le \dfrac{a\bmod b}2+(a/b)\times\dfrac b2\\ &=\dfrac{(a\bmod b)+(a/b)\times b}2\\ &=\dfrac a2 \end{aligned}\]

证毕!

\(x_0,y_0\) 一定是所有解中 \(|x|+|y|\) 最小的一组(之一)。

至于最开始的这句话,其实已经是显然的了,考虑通解形式即可证明,不再赘述。

标签:le,bmod,dfrac,欧几里得,exgcd,times,算法,tt
From: https://www.cnblogs.com/REKonib/p/17065157.html

相关文章