同余问题之中国剩余定理 _(:з」∠)_

本文介绍了中国剩余定理(孙子定理),包括其在解决同余问题时的基本形式和证明,以及非互质情况下如何处理。通过证明唯一解的存在性和给出模板,阐述了解决线性同余方程组的方法。此外,还推荐了几道ACM竞赛中的基础练习题,用于巩固理解和应用中国剩余定理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.中国剩余定理又指孙子定理。叙述如下:

令m1,…,mr两两互素, b1,…,br为整数, x≡b1(mod m1),x≡b2(mod m2)……x≡br(mod mr);有唯一正整数解x,其形式为:x=∑biMi’Mi(mod M)(1<=i<=r)

M=∏mi(1<=i<=r) ;Mi=M(mod mi);MiMi’ ≡1(mod mi);

符号定义完了。下面开始证明。

我们需要证明两个问题。

  (1)x是方程组的解(负数+M取模为正就好)。

  (2)x是唯一解。

先看第一个问题。

定理的前提是m1~mr均是质数,所以gcd(mi,mj)=1(i≠j)。gcd(Mi,mi)=1;

bjMj’Mj≡0(mod mi)(i≠j)   【gcd(Mj,mi)=mi;】

b1M1’M1+b2M2’M2+b3M3’M3+…+brMr’Mr≡biMi’Mi≡bi(mod mi)

可推出x是方程组的解。(1)得证。

再来证明第二个问题。

设y也是方程组的解。

则x≡y(mod mi) 即x-y≡0(mi);=>x≡y (M)

模M下x=y。

即x是唯一解。(2)得证。

附上模板:

============ _(:з」∠)_===我是模板=======================================================================

intChi_r()
{
   for(int i=0;i<n;i++)
      M*=m[i];
   int x,y;
   for(int i=0;i<n;i++)
   {
      Mi=M/m[i];
exgcd(Mi,m[i],x,y);
      Mi1=x;
      ans+=(b[i]*Mi*Mi1)%M;
      ans%=M;
   }
   return ans;
}

==============_(:з」∠)_====模板债见=====================================================================

2.下面写中国剩余定理的非互质版(我们再来证明一下 _(:з」∠)_)

给定 n个方程

X≡b1(mod m1) ,X≡b2(mod m2)…………X≡bn(mod mn).

m1,m2,……,mn可以任意取,不一定是互质的。。

这时候,我们需要利用方程合并的思想,将两个方程合并成一个。

取两个方程:

X≡b1(mod m1)

X≡b2(mod m2)

容易得到:

X=b1+m1*k1;

X=b2+m2*k2;

我们要找1、2方程的通解。就要让 b1+m1k1符合第二个方程。

此时 b1+m1*k1=b2+m2*k2=>m1k1=b2-b1+m2k2

m1k1≡b2-b1(mod m2) 要想使方程有解,g=gcd(m1,m2),则(b2-b1)|g(整除)

将方程化简得 m1k1/g≡(b2-b1)/g  (mod m2/g);

k1=K+C*(m2/g);(K为最小非负整数)

则X=b1+m1(K+C*(m2/g));此时的X是1,2方程的通解。

X≡b1+m1*K   (mod m1*m2/g) =>合并后的方程。

令b1=b1+m1*K,m1=m1*m2/g =>X≡b1(mod m1) 再与下面的方程继续合并。

附上模板:

============ _(:з」∠)_===我是模板========================================================================

boolChi_r()//方程组是否有解
{
   int m1=m[0],b1=b[0],k1,y;
   for(int i=1;i<n;i++)
   {
      int m2=m[i],b2=b[i];
      int g=exgcd(m1,m2,k1,y);
      if((b2-b1)%g!=0)
      {
         return 0;
      }
      k1=(k1*((b2-b1)/g)%m2+m2)%m2;
      int t=m2/d;
      int K=(k1%t+t)%t;
      b1+=K*m1;m1=m1/g*m2;
   }
    return   1;//b1%m1为最小非负整数解
}

============ _(:з」∠)_===模板债见======================================================================

Showing time:

附上几道基础的练习题:

poj 1006   Biorhythms简单 

poj 2891 Strange Way to Express Integers(互质)

hdu 1788  Chineseremainder theorem again(最小公倍数)也可以用中国剩余定理练习下

hdu 1573  X问题(非互质基础)

hdu 3579  Hello Kiki(非互质基础)

都是很基础的模板题,主要是练习模板的使用和解方程组的流程。

有空再总结下通用的线性方程组模板^O^   

_(:з」∠)_ 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值