数论-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 $
又因为:
所以:
所以可得 $ \text{\textcircled 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 $ 为任意整数
则所有的整数解为:
题目:
先来一道模板:
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;
}