数论-exgcd

年年背,年年忘,必须来记一下了

$ 拓展欧几里得-Exgcd $

即为辗转相除法的运用

这是一个常用的求 $ gcd(a,b) $ 的东西,然后由于其性质,还可以用来求诸如 $ ax+by=c $ 的二元一次不定方程,在\(gcd(a,b)=1\) 时就变成了求 $ ax+by=1 $ 即 $ a $ 在 $ mod \ b $ 意义下的逆元: $ ax \equiv 1(mod \ b) $

性质及其原理:

1. $ gcd(a,b) \mid c $

首先,对于拓展欧几里得,它是用来求诸如 $ ax+by=c $ 的二元一次不定方程,如果想让这个方程在整数范围内有解,就必有:$ gcd(a,b) \mid c $ :

证明1:

在整数范围内:

$ gcd(a,b)\mid a $ 且 $ gcd(a,b)\mid b $

所以 $ gcd(a,b) \mid (ax+by) $ 即 $ gcd(a,b) \mid c$

2. 辗转相除法的依据

$ gcd(b,(a\ \ mod \ \ b)) = gcd(a,b) $

证明2.

我们不妨设 $ a>b $

则 $ a $ 可以表示为 $ kb+r $ 且 $ a\ \ mod \ \ b = r $

所以 $ r = a-kb $

再设 $ g $ 为 $ a,b $ 的约数,则有 $ g \mid a $ 和 $ g \mid b $

所以 $ g \mid r $

所以 $ (a,b) $ 与 $ (b,(a\ \ mod \ \ b)) $ 的约数相等

又由于 $ r = a\ \ mod \ \ b <a $

所以 $ gcd(b,r) \le gcd(a,b) $

所以 $ gcd(b,(a\ \ mod \ \ b)) = gcd(a,b) $

3. 辗转相除法的运用

关于如何运用辗转相除求 $ ax+by=c \ \ (\ gcd(a,b) \mid c\ )$ 和正确性。

证明3:

求 $ ax+by=c \ \ (\ gcd(a,b) \mid c\ )$

可以转化成 :

$ ax'+by'=gcd(a,b) $

$ x' = \frac{x\times c}{gcd(a,b)} \ \ \ \ y' = \frac{y\times c}{gcd(a,b)}$

那么,现在我们要求 $ ax+by=gcd(a,b) \ \ \text{\textcircled 1} $

我们先设 $ G = gcd(a,b) $

然后,如果我们已经找到了一个有一个特解的式子:

$ bx_1 + (a \ \ mod \ \ b)y_1 = G \ \ \text{\textcircled 2} $

(意思是若已知 $ x_1 $ 和 $ y_1 $ )

(这个式子必然存在,原理见2.)

那么,我们就将问题变成了通过 $ \text{\textcircled 2} $ 来得到 $ \text{\textcircled 1} $ 的一组特解:

具体如下:

由 $ \text{\textcircled 1} \text{\textcircled 2} $ 得:

$ ax+by= bx_1 + (a \ \ mod \ \ b)y_1 $

又因为:

\[a \ \ mod \ \ b = a - \lfloor \frac{a}{b} \rfloor \times b \]

所以:

\[ax+by= bx_1 + ( a - \lfloor \frac{a}{b} \rfloor \times b )y_1 \]

\[ax+by= ay_1 + b(x_1 - \lfloor \frac{a}{b} \rfloor \times y_1) \]

所以可得 $ \text{\textcircled 1} $ 的一组特解:

\[x=y_1 \ \ , \ \ y = (x_1 - \lfloor \frac{a}{b} \rfloor \times y_1) \]

然后,既然已知可由 $ \text{\textcircled 2} $ 的一组特解求 $ \text{\textcircled 1} $ 那现在就变成了求 $ \text{\textcircled 2} $ 的一组特解。

你会发现 $ \text{\textcircled 2} $ 也是类似于:$ a_1x_1+ b_1y_1 = G $ 的形式

那么我们就可以递归:

$ a_kx_k+b_ky_k = G $

$ b_kx_{k+1} + (a_k \ \ mod \ \ b_k)y_{k+1} = G $

然后设: $ a_{k+1} = b_k \ \ ,\ \ b_{k+1} = (a_k \ \ mod \ \ b_k) $

就可以进行下一层了。

到最后一定有某一层 $ b_i =0 $

此时 $ a_i=G $

所以我们就有了一组特解:

$ \begin{cases} x_i=1\ y_i=0\end{cases} $

(此时 $ y_i $ 的值可以任取)

然后一层层回溯就可以求解原式子的 $ x_0 , y_0 $

注意此时求出来的 $ x_0 $ 和 $ y_0 $ 是 $ ax_0+by_0=gcd(a,b) $ 的解, 最后还要乘上 $ \frac{c}{gcd(a,b)} $ 才是原式子 $ ax+by=c $ 的解

即 $ x=\frac{x_0 \times c}{gcd(a,b)} \ \ ,\ \ y=\frac{y_0 \times c}{gcd(a,b)} $

4. 求通解

证明4:

既然已经知道了如何求某一组 $ x,y $ ,那么我们如何求出所有我们需要的 $ x,y $ 呢?

我们设一个数 $ d $ ,则有:

$ a(x_1+db) + b(y_1-da)=c $

(请自行拆括号)

为方便下文的理解,我们也可以写成:

$ a(x_1+ \frac{b}{d} ) + b(y_1 - \frac{a}{d} )=c $

(同理)

因为我们一直都是在整数范围内研究,所以 $ \frac{b}{d},\frac{a}{d} $ 都为整数。

并且我们希望可以通过这个式子来递推求出所有的解,所以我们希望它们最小。

综合以上两点,就意味着:

$ d \mid a , d \mid b $ ,且 $ d $ 最大

所以 $ d=gcd(a,b) $

那么,可以设 $ d_x=\frac{b}{gcd(a,b)}\ \ ,\ \ d_y=\frac{a}{gcd(a,b)} $

$ s $ 为任意整数

则所有的整数解为:

\[\begin{cases} x=x_1+s \times d_x\\ y=y_1+s \times d_y\\ \end{cases}\]

题目:

先来一道模板:

1. 模板:P1082同余方程

那么,上代码:

Code:

ll ls;
inline void exgcd(ll a,ll b,ll& x,ll & y)
{
	if(b==0){x=1;y=0;return;}
	exgcd(b,a%b,x,y);
	ls=x;	x=y;
	y=ls-(a/b)*y;
}

2. 升级运用:P5656二元一次不定方程

posted @ 2024-07-11 14:59  YT0104  阅读(2)  评论(0编辑  收藏  举报