中国剩余定理(互质+非互质版),每日一边,算法再见!

中国剩余定理(Chinese remainder theorem(CRT))

中国剩余定理的起源

什么是中国剩余定理呢?讲一个故事吧

秦末时期,楚汉相争,汉初三杰之一的韩信有一次带1500名兵士打仗,战死四五百人。为了统计剩余士兵的个数,韩信令士兵3人一排,多出2人;5人一排,多出4人;7人一排,多出6人。韩信据此很快说出人数:1049人。汉军本来就十分信服韩信大将军,经此之后就更加相信韩信是“天神下凡,神机妙算",于是士气大振,鼓声喧天,在接下来的战役中汉军步步紧逼,楚军乱作一团,大败而逃。韩信由此名扬天下,被后世誉为“兵仙“,“神帅”。

是不是觉得韩信很厉害?学完这一课,你也可以是神帅

上面的故事设计到的数学原理可以由一下公式表示:
1049 ≡ 2 ( m o d 3 ) 1049 ≡ 2(mod 3) 10492(mod3)
1049 ≡ 5 ( m o d 4 ) 1049 ≡ 5(mod 4) 10495(mod4)
1049 ≡ 7 ( m o d 6 ) 1049 ≡ 7(mod 6) 10497(mod6)
我们把等式左边设为 x x x,等式右边余数设为ri,模设为bi
所以上述式子可以写成
x ≡ r 1 ( m o d b 1 ) , r 1 = 2 , b 1 = 3 x ≡ r1(mod b1),r1 = 2,b1 = 3 xr1(modb1),r1=2,b1=3
x ≡ r 2 ( m o d b 2 ) , r 2 = 5 , b 2 = 4 x ≡ r2(mod b2),r2 = 5,b2 = 4 xr2(modb2),r2=5,b2=4
x ≡ r 3 ( m o d b 3 ) , r 3 = 7 , b 3 = 6 x ≡ r3(mod b3),r3 = 7,b3 = 6 xr3(modb3),r3=7,b3=6
韩信就是用中国剩余定理来解上述方程组来求得的x

中国剩余定理(互质版)

什么是互质版呢?
x ≡ r 1 x ≡ r{1} xr1(mod b 1 b{1} b1), r 1 = 2 , b 1 = 3 r{1} = 2,b{1} = 3 r1=2,b1=3
x ≡ r 2 x ≡ r{2} xr2(mod b 2 b{2} b2), r 2 = 5 , b 2 = 4 r{2} = 5,b{2} = 4 r2=5,b2=4
x ≡ r 3 x ≡ r{3} xr3(mod b 3 b{3} b3), r 3 = 7 , b 3 = 6 r{3} = 7,b{3} = 6 r3=7,b3=6
.
.
.
x ≡ r n x ≡ r{n} xrn(mod b n b{n} bn)

这个方程组中的任意两个的最大公约数(互质)为1,也即 g c d ( b i , b j ) = 1 , i ϵ ( 1 , n ) , j ϵ ( 1 , n ) , 且 i ≠ j gcd(bi,bj) = 1,i\epsilon(1,n),j\epsilon(1,n),且i≠j gcd(bi,bj)=1iϵ(1,n),jϵ(1,n),i=j
如果一个数与其他数互质,那么这个数一定与这些数的乘积也互质,也就是说, 若 g c d ( b i , b j ) = 1 , g c d ( b i , b k ) = 1 , 则 g c d ( b i , b j ∗ b k ) = 1 若gcd(bi,bj) = 1,gcd(bi,bk)=1,则gcd(bi,bj*bk) = 1 gcd(bi,bj)=1,gcd(bi,bk)=1,gcd(bi,bjbk)=1,这个结论可以由质因数分解来证明,于是通过这个性质我们就可以得到下面这个公式

我们令 M i = ∑ j = 1 n b j b i Mi = \frac{\sum_{j=1}^{n}bj}{bi} Mi=bij=1nbj
那么我们得到 a 1 M 1 + y 1 b 1 = g c d ( M 1 , b 1 ) , a 1 M 1 ≡ g c d ( M 1 , b 1 ) ( m o d b 1 ) a1M1 +y1b1 = gcd(M1,b1),a1M1 ≡ gcd(M1,b1)(mod b1) a1M1+y1b1=gcd(M1,b1),a1M1gcd(M1,b1)(modb1),因为M1与b1互质,所以 a 1 M 1 ≡ 1 ( m o d b 1 ) a1M1 ≡ 1(mod b1) a1M11(modb1),注意这里的a1,y1是未知系数,需要扩展欧几里得解方程求取的,如果不会解此类方程,请出门左转,先去学扩展欧几里得算法
同理可以得到:
a 2 M 2 ≡ 1 ( m o d b 2 ) a2M2 ≡ 1(mod b2) a2M21(modb2)
a 3 M 3 ≡ 1 ( m o d b 3 ) a3M3 ≡ 1(mod b3) a3M31(modb3)
a 4 M 4 ≡ 1 ( m o d b 4 ) a4M4 ≡ 1(mod b4) a4M41(modb4)
.
.
.
a n M n ≡ 1 ( m o d b n ) anMn ≡ 1(mod bn) anMn1(modbn)
归纳一下也就等同于, a i M i ≡ 1 ( m o d b i ) , i ϵ ( 1 , n ) aiMi ≡ 1(mod bi),i\epsilon(1,n) aiMi1(modbi),iϵ(1,n)
等式两边同乘以ri,得到 a i M i r i ≡ r i ( m o d b i ) , i ϵ ( 1 , n ) aiMiri ≡ ri(mod bi),i\epsilon(1,n) aiMiriri(modbi),iϵ(1,n)

那 么 我 们 需 要 找 到 一 个 解 x , 满 足 所 有 方 程 组 , 也 即 x ≡ r i ( m o d b i ) , i ϵ ( 1 , n ) 那么我们需要找到一个解x,满足所有方程组,也即x ≡ ri(mod bi),i\epsilon(1,n) x,xri(modbi),iϵ(1,n)

这个x就是 ∑ i = 1 n a i M i r i , 也 即 x = ∑ i = 1 n a i M i r i \sum_{i=1}^{n}aiMiri,也即x = \sum_{i=1}^{n}aiMiri i=1naiMirix=i=1naiMiri,想必到了这里,你可能有点百思不得其解,下面我们来证明!

证明:
因为我们知道 M i = ∑ j = 1 n b j b i Mi= \frac{\sum_{j=1}^{n}bj}{bi} Mi=bij=1nbj与bi互质,那么 M k = ∑ j = 1 n b j b k Mk= \frac{\sum_{j=1}^{n}bj}{bk} Mk=bkj=1nbj与bi一定不互质,因为Mk当中有bi这个因子没有被除掉,所以 g c d ( M k , b i ) = b i , 换 言 之 M k 能 整 除 b i gcd(Mk,bi) = bi,换言之Mk能整除bi gcd(Mk,bi)=bi,Mkbi

所以我们得到 Mk%bi = 0(k≠i)等价于Mk ≡ 0(mod bi),所以得出 a k M k r k ≡ 0 ( m o d b i ) , ( k ≠ i ) akMkrk ≡ 0(mod bi),(k≠i) akMkrk0(modbi),(k=i)
所以我们得出
a n ∗ M n ∗ r n + a n − 1 ∗ M n − 1 ∗ r n − 1 + a n − 2 ∗ M n − 2 ∗ r n − 2 + . . . . + a 1 ∗ M 1 ∗ r 1 ≡ r i ( m o d b i ) a{n}*M{n}*r{n} + a{n-1}*M{n-1}*r{n-1} + a{n-2}*M{n-2}*r{n-2} +....+ a{1}*M{1}*r{1}≡ ri(mod bi) anMnrn+an1Mn1rn1+an2Mn2rn2+....+a1M1r1ri(modbi)
也就是 ∑ i = 1 n a i M i r i \sum_{i=1}^{n}aiMiri i=1naiMiri满足所有式子,证毕!

下面来一道模板题练练手P1495 【模板】中国剩余定理(CRT)

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Maxn = 30;
ll a[Maxn],b[Maxn];
void exgcd(ll a, ll b, ll &g,ll &x,ll &y)
{
	if(b==0)
	{
		g=a;
		x=1;
		y=0;
		return ;
	}
	else
	{
		ll tempx,tempy;
		exgcd(b,a%b,g,x,y);
		tempx=y;
		tempy = x-(a/b)*y;
		x=tempx;
		y=tempy;
		return ;
	}
}
int main()
{
	ll n;
	cin>>n;
	ll M=1;
	for(ll i=1;i<=n;i++)
	{
	 cin>>a[i]>>b[i];
	 M*=a[i];
    }
    ll ans=0;
    for(ll i=1;i<=n;i++)
    {
    	ll x,y,g;
    	ll Mi = M/a[i];//xi*mi*bi = 1(mod  ai)->xi*mi*bi + yi*ai = bi;xi和yi对应未知数x,y 
    	Mi*=b[i];
    	exgcd(Mi,a[i],g,x,y);
    	x=x*b[i]/g;
    	ll s = a[i]/g;
		x=(x%s+s)%s;//注意我们这里为了防止x为负数 
    	ans+=x*Mi;
	}
	ans=(ans%M+M)%M;//如果不做这一步操作,答案可能不是最小正整数解 
	cout<<ans<<'\n';
}

中国剩余定理(非互质版)

非互质也就是说, b 1 , b 2 , b 3.... b n b1,b2,b3....bn b1,b2,b3....bn不互质的情况,那么此时我们就不能按照上面互质的情况来求解x。
x ≡ r 1 x ≡ r{1} xr1(mod b 1 b{1} b1)
x ≡ r 2 x ≡ r{2} xr2(mod b 2 b{2} b2)
x ≡ r 3 x ≡ r{3} xr3(mod b 3 b{3} b3)
.
.
.
x ≡ r n x ≡ r{n} xrn(mod b n b{n} bn)
仔细看一看,如果不互质的话,这道题不就是一道解一元同余线性方程组的问题吗?
如果不会解一元线性同余方程组的伙老铁们,请出门右转解一元线性同余方程组
这里我就不再过多解释,只要学会了解一元线性同余方程组,就会解中国剩余定理的非互质版,其实中国剩余定理互质版就是特殊的一元线性同余方程组,特殊在于,方程组的 b 1 , b 2 , b 3...... b n b1,b2,b3......bn b1,b2,b3......bn两两互质。

请关注我看更多数论分支知识体系讲解,也别忘点个赞额!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值