浅谈同余问题

同余问题学习笔记

1.同余符号

若任意两个整数 a,bm 的值是相同的,那么我们可以表示成以下形式

ab(modm)

读作: a 同余于 bm ,或读作 ab 对模 m 同余

2.同余符号的性质

1.反身性:aa(modm)

证明:am 一定等于 am

2.对称性:若ab(modm),则ba(modm)

证明:ab 同余,b 一定和 a 同余。

3.传递性:若ab(modm)bc(modm),则ac(modm)

证明:设 a,b,cm 取余分别为 x,y,z ,那么 x=y,y=z,x=z

4.同余式相加:若ab(modm)cd(modm),则 ,a±cb±d(modm)

5.同余式相乘:若ab(modm)cd(modm),则acbd(modm)

然后当 a,bm 同余的时候,那么 m|(ab)

那么我们 a 看成 km+r ,这里 ka/m 的商,ramodm ,同理,我们将 b 看成 lm+r

那么我们将 m 提出来,两数相减即为 (kl)m 所以 ab 即为 m 的倍数。

3.相关定理

1.裴蜀定理

a,b 是整数,且 gcd(a,b)=d,那么对于任意的整数 x,y,ax+by 都一定是 d 的倍数
特别地,一定存在整数 x,y,使 ax+by=d 成立

证明:

既然是求 gcd ,我们就可以模拟一下欧几里得算法(可以先看后面)

我们设 ab ,由辗转相除法的过程 gcd(x,y)=gcd(y,xmody),可以得到

b=ax1+r1,那么 bmodab=r1

重复过程,得到以下式子:

b=ax1+r1

a=ax2+r2

r1=r2x3+r3

......

rk3=rk2xk1+rk1(1)

rk2=rk1xk+rk(2)

rk1=rkxk+1+rk+1

因为辗转相除法最后得到的余数为 0,在这里,我们不妨设 rk+1=0 ,那么,rk 就是 a,b 的最大公约数,即 rk=d ,将这个东西带入 (2) 式子,那么这个时候我们得到以下式子

rk2=rk1xk+d

移项得到

d=rk2rk1xk(3)

(1) 式子移项

rk1=rk3rk2xk(4)

(4) 式带入 (3)

d=rk2(rk3rk2xk)xk

把式子展开

d=m1rk2+n1rk3

很明显,我们上面用的都是整数,所以 m1,n1 肯定也都是整数,那如果我们把原来的 (3) 式子转化成这种形式 d=mrk1+nrk2

我们将这个式子跟上面的一对比,是不是发现了什么规律?

d=mka+nkb

我们知道,mknk 都是整数,故 ax+by=d 一定有整数解。


推论1:对于方程 ax+by=1 , 只有当整数 a,b 互质时,方程才有整数解.

反证法:

a,b 不是互质的,那么 a,b 可以表示成 a=qgcd(a,b)b=pgcd(a,b), 带入上面的式子,易得

qgcd(a,b)x+pgcd(a,b)y=1

如果两边同时除以一个 gcd(a,b),得到:

qx+py=1gcd(a,b)

显然,如果 a,b 不是互质的话,那么等式右边就是一个小数,所以该方程不存在整数解,得证。

另外,可以得到 a,b 互质的充要条件就是 ax+by=1 要有整数解


推论2:对于方程 ax+by=z , 只有满足 gcd(a,b)|z ,方程才有整数解

证明:

d=gcd(a,b)z=dq

对于方程 ax+by=d ,我们有一组解 x1,y1,那么就有:

ax1+by1=d

两边同时乘上 q ,易得:

ax1q+by1q=dq

因为 z=dq

所以方程 ax+by=z ,一定存在一组整数解 x=x1q,y=y1q,得证。

2.欧几里得算法

欧几里得算法的目的是简单的求出两个正整数的最大公因数。

那么我们证明一下这个算法:

c=gcd(a,b),设a=mcb=nc
a÷b=k......r可得 r=akb=mcknc=(mkn)
第二步不难看出,c 也是 r 的因数;
列出 b=ncr=(mkn)c ,如果 nmkn 互质,即两者公约数只有 1 ,则表明 cbr 的最大公约数,后续证明 nmkn 互质;
假设 mknn 不是互质,两者有一非零的最大公约数 d ,且 d1
则有 mkn=xdn=yd,得 m=kn+xd=kyd+xd=(ky+x)d ,则 a=mc=(ky+x)dcb=nc=ycd,则 ab 的一个公约数 cdc,故 c 不是 ab 的最大公约数,这与前面提到的 cab 的最大公约数假设矛盾;
mknn 为互质,即 cbr 的最大公约数,且是 ab 的最大公约数,得证。

此算法实现流程图:

3.扩展欧几里得算法

对于求解方程 ax+by=gcd(a,b)

先考虑特殊情况,如果 b=0 ,那么 gcd(a,b)=a,显然存在一组解 x=1,y=0

设之前的方程为 ax1+by1=gcd(a,b) ,肯定存在式子 bx2+(amodb)y2=gcd(b,amodb)

根据刚刚讲的欧几里得算法,gcd(a,b)=gcd(b,amodb)

所以 ax1+by1=bx2+(amodb)

因为 amodb=aa/bb

所以 ax1+by1=bx2+(aa/bb)y2

ax1+by1=bx2+aa/bby2

ax1+by1=ay2+b(x2a/by2)

所以 x1=y2,y1=x2a/by2

code:

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

然后我们这个东西还能求逆元,怎么求呢?

xap 意义下的逆元,那么满足式子:

ax1(modm)

那么有 ax+my=1, 接着用扩展欧几里得定理来做即可。

4.中国剩余定理

假设正整数 m1,m2,·····,mn两两互素,则同余方程组:

{xa1(modm1)xa2(modm2)······xan(modmn)

有整数解,并且在模 M=i=1nmi的解是唯一的,解为:

x(a1M1M11+a2M2M21+···anMnMn1)modM

其中 Mi 表示 M/miMi1Mimi 的逆元。

证明:

我们要证明是上述同余方程的解,则需要对每个方程考察通解 x 中的每一项

对于 i1,2,···,n,证明

aai(modmi)

下面考察通解 x 中的每一项

j1,2,···,n,令 xj=ajMjMj1,则 i,j 可以分成两种情况。

  1. ij ,由于 Mj=M/mj ,所以 Mjmodmi=0 ,所以 xjmodmi=0
  2. i=j,由于 Mj=M/mj,且 m1,m2,···,mn 两两互素,所以 MjMj11(modmi),故 xjaj(modmi)

则:

x(a1M1M11+a2M2M21+···anMnMn1)modMmodmi

(x1+x2+···+xn)modmi

(aiji0)modmi

aimodmi

i1,2,,nx(a1M1M11+a2M2M21+···anMnMn1)modM,满足xai(modmi) ,可得 x 是方程通解,证毕。

5.线性求逆元

ax1(modb) ,且 a,b 互质,则称 xa 的逆元,记作 a1 ,在计算 (t/a)modb 时等价于 ta1modb ,那么显然可以转化为 ax+by=1 ,用我们刚刚讲的扩展欧几里得算法来求解,但相对来说,这种算法太慢了,这里还有线性的做法:

首先 111(modp)

p=ki+r ,那么可以推导出来 ki+r0(modp),将两边同乘 i1,r1,在 modp 意义下

kr1+i10

移项:

i1=kr1

然后我们 p 的定义,易得 k=p/i , r=pmodi

所以易得:

i1=p/i(pmodi)1

所以求第 i 个数的逆元的递推式子就出来了

xi=p/ixpmodi

for(int i=2;i<=n;i++) { inv[i]=(long long)(-p/i)*inv[p%i]%p; cout << inv[i] << "\n"; }

推荐博文

  1. 扩展欧几里得

  2. 裴蜀定理

3.中国剩余定理


__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/16562355.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(439)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示