在上一次总结过后鸽了没多久其实是快要开学赶紧来肝上两篇
今日内容——同余方程和扩展欧几里得算法
同余
同余的定义:若存在两个整数a,b,使得(a - b) MOD P为0,则称作a与b在MOD P的情况下同余
换种通俗的说法,就是,a MOD P与b MOD P相等
记作 ( aequiv b (mod P) )
对于整数a,b,c和自然数m,n
同余具有以下性质:
- 自反性:( aequiv a (mod P) )
- 对称性:若存在( aequiv b (mod P) ) ,则 ( bequiv a (mod P) )
- 传递性:若存在( aequiv b (mod P) ) ,( bequiv c (mod P) ), 则 ( aequiv b (mod P) )
- 同加性:若( aequiv b (mod P) ),则 ( (a+c)equiv (b+c) (mod P) )
- 同乘性1:若( aequiv b (mod P) ),则 ( (a*c)equiv (b*c) (mod P) )
- 同乘性2:若( aequiv b (mod P) ) , ( cequiv d (mod P) ),则 ( (a*c)equiv (b*d) (mod P) )
- 同幂性:若( aequiv b (mod P) ),则 ( (a^c)equiv (b^c) (mod P) )
由此,我们可以得到两条推论
- ( (a*b)mod k = (a mod k)*(b mod k) mod k )
- 若( a mod p = x ,a mod q = x,p、q互质,则a mod p*q =x )
但是,相信像我一样睿智的你也发现了一个问题,没错,同余不满足同除性,即不满足若( aequiv b (mod P) ),则 ( (a/c)equiv (b/c) (mod P) )
那么除法取模要如何解决呢,秃顶聪明绝顶的数学家也发现了这个问题,利用逆元的知识,我们就可以解决这个问题啦!
但是逆元,我决定下次再讲,其实就是鸽了(咕咕咕)
扩展欧几里得算法
欧几里得算法相信大家都已经知道了QwQ
就是求gcd的辗转相除法
不知道的可以去看我的上一篇文章(理直气壮的骗访问量QwQ)
那么扩展欧几里得算法是啥?(黑人问号.jpg)
扩展欧几里得算法就是利用了欧几里得算法中迭代的过程,使其能够求出形如( ax + by = gcd(a , b) ) 的方程的应用
我们可以简单的证明和感性理解一下扩展欧几里得算法的正确性:
首先,当欧几里得算法停止迭代时
有此情况 ( a=1,b=0,此时,gcd(a,b)=x,ax+by = gcd(a,b)显然成立 )
在迭代的过程中
有 ( b{x}' + (a mod b) {y}' = gcd(b, a%b) )与 ( ax + by = gcd(a, b) )
则由上一层推出
( x= {y}' ),( y={x}'-a/b*{y}' )
于是可推至初始情况,得出解
下面给出代码的实现
int exgcd (int a, int b, int &x, int &y){ if(b == 0){ x = 1; y = 0; return a; } int ans = exgcd ( b , a % b , x ,y ); int t = x; x = y; y= t - a / b * y; return ans; }
就是这样喵
对扩展欧几里得定理的应用
利用扩展欧几里得定理,我们能够求解形如( ax+by = c )的问题
当 (c mid gcd(a,b) )时,有( ax+by = c )的不定方程有整数解
所以,把原式变形为 ( ax+by = d (d = gcd(a,b) ) )的形式,利用扩展欧几里得定理可解出方程的一组解( (x,y) ),再将其乘以 ( frac{c} {gcd(a,b)} )
就能解出原方程的解啦!(快夸我.jpg)
对扩展欧几里得定理求出解的处理
由于形如 ( ax+by = c ) 的线性不定方程有无穷多解,扩展欧几里得定理进行求解的过程中,不一定保证求出的是最小正整数解,为得到最小正整数解,我们有如下的方式
易推出,对于线性不定方程 ( ax+by = c ),有一组解(x,y) 与另一组解 ( a*(x + frac {a*t} {gcd(a,b)}) ,b*(y- frac {b*t} {gcd(a,b)} | (tin mathbb{Z})) )都为原方程的解
则可得出方法:对于线性不定方程 (ax+by = c ) ,其最小正整数解为( ( x= ( (x\%t)+t)\%t) ,(t=b/gcd(a,b))),( y=(((y\%t)+t)\%t) ,(t=a/gcd(a,b)) ) )
至此,问题得到了解决