中国剩余定理(Chinese remainder theorem(CRT))
中国剩余定理的起源
什么是中国剩余定理呢?讲一个故事吧
秦末时期,楚汉相争,汉初三杰之一的韩信有一次带1500名兵士打仗,战死四五百人。为了统计剩余士兵的个数,韩信令士兵3人一排,多出2人;5人一排,多出4人;7人一排,多出6人。韩信据此很快说出人数:1049人。汉军本来就十分信服韩信大将军,经此之后就更加相信韩信是“天神下凡,神机妙算",于是士气大振,鼓声喧天,在接下来的战役中汉军步步紧逼,楚军乱作一团,大败而逃。韩信由此名扬天下,被后世誉为“兵仙“,“神帅”。
是不是觉得韩信很厉害?学完这一课,你也可以是神帅
上面的故事设计到的数学原理可以由一下公式表示:
1049
≡
2
(
m
o
d
3
)
1049 ≡ 2(mod 3)
1049≡2(mod3)
1049
≡
5
(
m
o
d
4
)
1049 ≡ 5(mod 4)
1049≡5(mod4)
1049
≡
7
(
m
o
d
6
)
1049 ≡ 7(mod 6)
1049≡7(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
x≡r1(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
x≡r2(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
x≡r3(modb3),r3=7,b3=6
韩信就是用中国剩余定理来解上述方程组来求得的x
中国剩余定理(互质版)
什么是互质版呢?
x
≡
r
1
x ≡ r{1}
x≡r1(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}
x≡r2(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}
x≡r3(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}
x≡rn(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)=1,iϵ(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,bj∗bk)=1,这个结论可以由质因数分解来证明,于是通过这个性质我们就可以得到下面这个公式
我们令
M
i
=
∑
j
=
1
n
b
j
b
i
Mi = \frac{\sum_{j=1}^{n}bj}{bi}
Mi=bi∑j=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),a1M1≡gcd(M1,b1)(modb1),因为M1与b1互质,所以
a
1
M
1
≡
1
(
m
o
d
b
1
)
a1M1 ≡ 1(mod b1)
a1M1≡1(modb1),注意这里的a1,y1是未知系数,需要扩展欧几里得解方程求取的,如果不会解此类方程,请出门左转,先去学扩展欧几里得算法
同理可以得到:
a
2
M
2
≡
1
(
m
o
d
b
2
)
a2M2 ≡ 1(mod b2)
a2M2≡1(modb2)
a
3
M
3
≡
1
(
m
o
d
b
3
)
a3M3 ≡ 1(mod b3)
a3M3≡1(modb3)
a
4
M
4
≡
1
(
m
o
d
b
4
)
a4M4 ≡ 1(mod b4)
a4M4≡1(modb4)
.
.
.
a
n
M
n
≡
1
(
m
o
d
b
n
)
anMn ≡ 1(mod bn)
anMn≡1(modbn)
归纳一下也就等同于,
a
i
M
i
≡
1
(
m
o
d
b
i
)
,
i
ϵ
(
1
,
n
)
aiMi ≡ 1(mod bi),i\epsilon(1,n)
aiMi≡1(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)
aiMiri≡ri(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,满足所有方程组,也即x≡ri(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=1naiMiri,也即x=∑i=1naiMiri,想必到了这里,你可能有点百思不得其解,下面我们来证明!
证明:
因为我们知道
M
i
=
∑
j
=
1
n
b
j
b
i
Mi= \frac{\sum_{j=1}^{n}bj}{bi}
Mi=bi∑j=1nbj与bi互质,那么
M
k
=
∑
j
=
1
n
b
j
b
k
Mk= \frac{\sum_{j=1}^{n}bj}{bk}
Mk=bk∑j=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,换言之Mk能整除bi
所以我们得到 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)
akMkrk≡0(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)
an∗Mn∗rn+an−1∗Mn−1∗rn−1+an−2∗Mn−2∗rn−2+....+a1∗M1∗r1≡ri(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}
x≡r1(mod
b
1
b{1}
b1)
x
≡
r
2
x ≡ r{2}
x≡r2(mod
b
2
b{2}
b2)
x
≡
r
3
x ≡ r{3}
x≡r3(mod
b
3
b{3}
b3)
.
.
.
x
≡
r
n
x ≡ r{n}
x≡rn(mod
b
n
b{n}
bn)
仔细看一看,如果不互质的话,这道题不就是一道解一元同余线性方程组的问题吗?
如果不会解一元线性同余方程组的伙老铁们,请出门右转,解一元线性同余方程组
这里我就不再过多解释,只要学会了解一元线性同余方程组,就会解中国剩余定理的非互质版,其实中国剩余定理互质版就是特殊的一元线性同余方程组,特殊在于,方程组的模,
b
1
,
b
2
,
b
3......
b
n
b1,b2,b3......bn
b1,b2,b3......bn两两互质。
请关注我看更多数论分支知识体系讲解,也别忘点个赞额!