同余问题
一、同余概述
1.基本定义和定理
定义1:给定
m
∈
Z
m∈Z
m∈Z,若
a
m
o
d
m
=
b
m
o
d
m
(
a
,
b
∈
Z
)
a\mod m = b \mod m(a,b∈Z)
amodm=bmodm(a,b∈Z),
则称
a
a
a 和
b
b
b 对模
m
m
m 同余,记作
a
≡
b
(
m
o
d
m
)
a ≡ b(\mod m)
a≡b(modm) ,并称该式子为同余式;否则称
a
a
a 和
b
b
b 对模
m
m
m 不同余。
定义2: Z Z Z 被分为 m m m 个不同的集合 A 1... m A_{1...m} A1...m,这些集合被称为模 m m m 剩余类(同余类),如果 ∀ a , b ∈ A i , i ∈ [ 1 , m ] ∀a, b∈A_i, i ∈[1, m] ∀a,b∈Ai,i∈[1,m], 则 a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm)。
费马小定理(费小):若 p p p 是质数,则对于 ∀ a ∈ Z ∀a∈Z ∀a∈Z,有 a p ≡ a ( m o d p ) a^p ≡ a(\mod p) ap≡a(modp)
证明:对 a a a 使用数学归纳法。
Base step:当 a = 0 a = 0 a=0 时, 0 ≡ 0 ( m o d p ) 0≡0(\mod p) 0≡0(modp)。
Inductive step:假设 a p ≡ a ( m o d p ) a^p≡a(\mod p) ap≡a(modp),考虑 ( a + 1 ) p (a + 1)^p (a+1)p,根据二项 式定理展开, ( a + 1 ) p = ∑ k = 0 p C p k a k (a + 1)^p = \sum_{k=0}^p C_p^ka^k (a+1)p=∑k=0pCpkak。
由于 p p p 是质数, C p k = p ! k ! ( p − k ) ! C_p^k = \frac{p!}{k!(p-k)!} Cpk=k!(p−k)!p!,则 p ∣ C p k , k ∈ [ 1 , p − 1 ] p|C_p^k,k∈[1, p-1] p∣Cpk,k∈[1,p−1],则 ( a + 1 ) p ≡ a p + 1 ( m o d p ) (a + 1)^p≡a^p+1(\mod p) (a+1)p≡ap+1(modp)。
又因为 a p ≡ a ( m o d p ) a^p≡a(\mod p) ap≡a(modp),则 ( a + 1 ) p ≡ a p + 1 ≡ a + 1 ( m o d p ) (a+1)^p ≡ a ^p + 1 ≡a + 1(\mod p) (a+1)p≡ap+1≡a+1(modp)。
根据数学归纳法,对于 ∀ a ∈ Z ∀a∈Z ∀a∈Z,都成立 a p ≡ a ( m o d p ) a^p ≡ a(\mod p) ap≡a(modp),证毕。
欧拉定理:若
a
,
n
a, n
a,n 互质,
a
,
n
∈
N
∗
a,n ∈ N^*
a,n∈N∗,则
a
φ
(
n
)
≡
1
(
m
o
d
n
)
a^{φ(n)} ≡ 1 (\mod n)
aφ(n)≡1(modn),
其中
φ
(
n
)
φ(n)
φ(n) 为 欧拉函数。
欧拉定理的推论:若
a
,
n
a, n
a,n互质,
a
,
n
∈
N
∗
a,n ∈ N^*
a,n∈N∗,则对于
∀
b
∈
N
∗
∀b∈ N^*
∀b∈N∗,有
a
b
≡
a
b
m
o
d
φ
(
n
)
(
m
o
d
n
)
a^b≡a^{b \mod φ(n)} (\mod n)
ab≡abmodφ(n)(modn)。
证明:
设 b = q φ ( n ) + r b = qφ(n) + r b=qφ(n)+r, 其中 r ∈ [ 0 , φ ( n ) ) r ∈[0,φ(n)) r∈[0,φ(n)), q , r ∈ N q,r ∈ N q,r∈N,即 r = b m o d φ ( n ) r = b \mod φ(n) r=bmodφ(n)。
于是: a b ≡ a q φ ( n ) + r ≡ ( a φ ( n ) ) q a r ≡ 1 q a r ≡ a r ≡ a b m o d φ ( n ) ( m o d n ) a^b ≡ a^{qφ(n)+r} ≡ (a^{φ(n)})^q a^r ≡ 1^qa^r ≡ a^r ≡ a^{b \mod φ(n)}(\mod n) ab≡aqφ(n)+r≡(aφ(n))qar≡1qar≡ar≡abmodφ(n)(modn)。
证毕。
2.同余的性质
对于 a , b , c , d , m , n , x , p , q ( a , b , c , d , x ∈ Z , m , n , p , q ∈ N ) a,b,c,d,m,n,x,p,q(a,b,c,d,x∈Z, m,n,p,q∈N) a,b,c,d,m,n,x,p,q(a,b,c,d,x∈Z,m,n,p,q∈N),
对模 m m m 同余满足:
- 自反性: a ≡ a ( m o d m ) a≡a(\mod m) a≡a(modm);
- 对称性:若 a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm),则 b ≡ a ( m o d m ) b≡a(\mod m) b≡a(modm);
- 传递性:若 a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm), b ≡ c ( m o d m ) b≡c(\mod m) b≡c(modm),则 b ≡ c ( m o d m ) b≡c(\mod m) b≡c(modm);
- 同加性:若 a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm),则 a + c ≡ b + c ( m o d m ) a + c≡b + c(\mod m) a+c≡b+c(modm);
- 同乘性:若
a
≡
b
(
m
o
d
m
)
a≡b(\mod m)
a≡b(modm),则
a
c
≡
b
c
(
m
o
d
m
)
ac≡bc(\mod m)
ac≡bc(modm);
一般情况下, a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm), c ≡ d ( m o d m ) c≡d(\mod m) c≡d(modm),则 a c ≡ b d ( m o d m ) ac≡bd(\mod m) ac≡bd(modm); - 同幂性*:若 a ≡ b ( m o d m ) a≡b(\mod m) a≡b(modm),则 a n ≡ b n ( m o d m ) a^n≡b^n(\mod m) an≡bn(modm);
- 若 a ≡ x ( m o d p ) a≡x(\mod p) a≡x(modp), a ≡ x ( m o d q ) a≡x(\mod q) a≡x(modq),其中 p , q p,q p,q 互质,则 a ≡ x ( m o d p q ) a≡x(\mod pq) a≡x(modpq);
证明:因为 a ≡ x ( m o d p ) a≡x(\mod p) a≡x(modp), a ≡ x ( m o d q ) a≡x(\mod q) a≡x(modq),其中 p , q p,q p,q 互质, 则一定 ∃ s , t ∈ Z ∃s,t∈ Z ∃s,t∈Z,使 a = s p + x , a = t q + x a = sp+ x, a = tq + x a=sp+x,a=tq+x,所以 s p = t q , q ∣ s , p ∣ t sp=tq,q|s,p|t sp=tq,q∣s,p∣t, 则一定 ∃ r ∈ Z ∃r∈ Z ∃r∈Z,使 s = r q s = rq s=rq, 所以: a = r p q + x a = rpq+x a=rpq+x,得出 a ≡ x ( m o d p q ) a≡x(\mod pq) a≡x(modpq)。
- 但是,同余不满足同除性,及不满足 a / n ≡ b / n ( m o d m ) a/n≡b/n(\mod m) a/n≡b/n(modm)。
二、扩展欧几里得算法(扩欧)
1.欧几里得算法(辗转相除法)
∀ a , b ∈ N , b ≠ 0 ∀a,b∈N,b≠0 ∀a,b∈N,b=0,则 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a \mod b) gcd(a,b)=gcd(b,amodb)
2.推导与证明
定理一
设 a , b ∈ Z a, b∈Z a,b∈Z,则 ∃ x , y ∈ Z ∃x,y∈Z ∃x,y∈Z,使得 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)。
证明:因为 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\mod b) gcd(a,b)=gcd(b,amodb);
所以 a x + b y = b x ′ + ( a m o d b ) y ′ ax+by=bx'+(a \mod b)y' ax+by=bx′+(amodb)y′;
⇒ a x + b y = b x ′ + ( a − ⌊ a b ⌋ b ) y ′ ⇒ax+by=bx'+(a-\lfloor\frac{a}{b}\rfloor b)y' ⇒ax+by=bx′+(a−⌊ba⌋b)y′;⇒ a x + b y = b x ′ + a y ′ − ⌊ a b ⌋ b y ′ ⇒ax+by=bx'+ay'-\lfloor\frac{a}{b}\rfloor by' ⇒ax+by=bx′+ay′−⌊ba⌋by′;
⇒ a x + b y = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ⇒ax+by=ay'+b(x'-\lfloor\frac{a}{b}\rfloor y') ⇒ax+by=ay′+b(x′−⌊ba⌋y′);
⇒ x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ ⇒x=y',y=x'-\lfloor\frac{a}{b}\rfloor y' ⇒x=y′,y=x′−⌊ba⌋y′。
当欧几里得算法运行到最后一步时, b = 0 b=0 b=0, g c d ( a n , b n ) = a n gcd(a_n,b_n) = a_n gcd(an,bn)=an,
有 x = 1 , y = 0 x=1,y=0 x=1,y=0。
对递推过程使用数学归纳法,可知扩欧成立。
证毕。
定理二(贝祖定理)
对于不定方程 a x + b y = c ax+by=c ax+by=c,当且仅当 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c 时,方程有整数解。
证明:
已知 g c d ( a , b ) ∣ a gcd(a,b)|a gcd(a,b)∣a, g c d ( a , b ) ∣ b gcd(a,b)|b gcd(a,b)∣b,由整除的性质, ∀ a , b ∈ Z ∀a,b∈Z ∀a,b∈Z,则 g c d ( a , b ) ∣ a x + b y gcd(a,b)|ax+by gcd(a,b)∣ax+by,即
g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c。
3.求最小整数解
给出不定方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),已知一组特解 x 0 , y 0 x_0,y_0 x0,y0,求最小整数解 x x x。
推导:
因为 a x + b y = g c d ( a , b ) , a x 0 + b y 0 = g c d ( a , b ) ax +by = gcd(a,b),ax_0+by_0 = gcd(a,b) ax+by=gcd(a,b),ax0+by0=gcd(a,b),所以 a x + b y = a x 0 + b y 0 ax+by=ax_0+by_0 ax+by=ax0+by0。
上式转化为 a ( x 0 − x ) = − b ( y 0 − y ) a(x_0-x)=-b(y_0-y) a(x0−x)=−b(y0−y)。
两边同除以 g c d ( a , b ) gcd(a,b) gcd(a,b),得
a g c d ( a , b ) ( x 0 − x ) = − b g c d ( a , b ) ( y 0 − y ) \frac{a}{gcd(a,b)}(x_0-x)=-\frac{b}{gcd(a,b)}(y_0-y) gcd(a,b)a(x0−x)=−gcd(a,b)b(y0−y)易得 a g c d ( a , b ) \frac{a}{gcd(a,b)} gcd(a,b)a 与 b g c d ( a , b ) \frac{b}{gcd(a,b)} gcd(a,b)b 互质,则 b g c d ( a , b ) ∣ ( x 0 − x ) \frac{b}{gcd(a,b)}|(x_0-x) gcd(a,b)b∣(x0−x), a g c d ( a , b ) ∣ ( y 0 − y ) \frac{a}{gcd(a,b)}|(y_0-y) gcd(a,b)a∣(y0−y)。
则 x = x 0 − k b g c d ( a , b ) , k ∈ Z x=x_0-k\frac{b}{gcd(a,b)},k∈Z x=x0−kgcd(a,b)b,k∈Z,即 x = x 0 m o d b g c d ( a , b ) x = x_0 \mod \frac{b}{gcd(a,b)} x=x0modgcd(a,b)b。
而此时的 x x x 有可能是负数,所以还要再加上 b g c d ( a , b ) \frac{b}{gcd(a,b)} gcd(a,b)b 再 m o d b g c d ( a , b ) \mod \frac{b}{gcd(a,b)} modgcd(a,b)b。
则 x = ( x 0 m o d b g c d ( a , b ) + b g c d ( a , b ) ) m o d b g c d ( a , b ) x=(x_0 \mod \frac{b}{gcd(a,b)} + \frac{b}{gcd(a,b)})\mod \frac{b}{gcd(a,b)} x=(x0modgcd(a,b)b+gcd(a,b)b)modgcd(a,b)b
4.代码
void exgcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1; y = 0;
}
else
{
int x1 = x, y1 = y;
exgcd(b, a % b, x1, y1);
x = y1;
y = x1 - (a / b) * y1;
}
}
int gcd(int a, int b)
{
if(b == 0) return a;
else return gcd(b, a % b);
}
int main()
{
cin >> a >> b;
exgcd(a, b, x, y);
d = gcd(a, b);
cout << (x % (b / d) + b / d) % (b / d);
}
5.题目
Luogu P1082 [NOIP2012 提高组] 同余方程
三、线性同余方程
定义一
给定 a , b , c ∈ Z a,b,c∈Z a,b,c∈Z,求 x ∈ Z x∈Z x∈Z,使得 a x ≡ c ( m o d b ) ax≡c(\mod b) ax≡c(modb),或者给出无解。
因为未知数的系数为1,所以我们称之为一次同余方程,也称线性同余方程。
原方程等价于 a x − c ≡ 0 ( m o d b ) ax-c≡0(\mod b) ax−c≡0(modb),即 ∃ y ∈ Z ∃y∈Z ∃y∈Z,使得 − b y = ( a x − c ) -by=(ax-c) −by=(ax−c),即 a x + b y = c ax+by=c ax+by=c。
因此当 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c 时,使用扩欧求解即可。
换而言之,有解的线性同余方程皆可用扩欧求解。
定义二
特别地,当 g c d ( a , b ) = 1 gcd(a,b) = 1 gcd(a,b)=1(即 a , b a,b a,b 互质时),则称 a x ≡ 1 ( m o d b ) ax≡1(\mod b) ax≡1(modb) 的一个解为 a a a 模 b b b 的逆。
四、乘法逆元
给定 a , b ∈ Z a,b∈Z a,b∈Z 且 a , b a,b a,b 互质,则 ∃ x ∈ Z ∃x∈Z ∃x∈Z,使得 a x ≡ 1 ( m o d b ) ax≡1(\mod b) ax≡1(modb),称 x x x 为 a a a 的模 b b b 乘法逆元,记作 1 a ( m o d b ) \frac{1}{a}(\mod b) a1(modb) 或 a − 1 ( m o d b ) a^{-1}(\mod b) a−1(modb)。
1.扩欧求逆元
将 a x ≡ 1 ( m o d b ) ax≡1(\mod b) ax≡1(modb) 转化为 a x + b y = 1 ax+by = 1 ax+by=1 ,因为 a , b a,b a,b 互质,所以 g c d ( a , b ) ∣ 1 gcd(a,b)|1 gcd(a,b)∣1,使用扩欧求解即可。
#include <iostream>
using namespace std;
int m, n, x, y;
void exgcd(int a, int b, int &x,int &y)
{
if(b == 0)
x = 1, y = 0;
else
{
int x2, y2;
exgcd(b, a % b, x2, y2);
x = y2;
y = x2- (a / b) * y2;
}
}
2.快速幂求逆元
a − 1 ≡ a b − 2 ( m o d b ) a^{-1} ≡a^{b-2}(\mod b) a−1≡ab−2(modb)
当b为质数时,由费小得, a b − 1 ≡ 1 ( m o d b ) a^{b-1}≡1(\mod b) ab−1≡1(modb),则 a ⋅ a b − 2 ≡ 1 ( m o d b ) a·a^{b-2}≡1(\mod b) a⋅ab−2≡1(modb),即 a − 1 ≡ a b − 2 ( m o d b ) a^{-1} ≡a^{b-2}(\mod b) a−1≡ab−2(modb),使用快速幂求出 a b − 2 a^{b-2} ab−2 即可。
int quickpow(int a, int b)
{
long long p = b - 2, ans = 1;
while(p != 0)
{
if(p & 1)
ans = ans * a % b;
p >>= 1;
a = a * a % b;
}
return ans % b;
}
3.递推求逆元
求整数 i = 1... M − 1 i=1...M-1 i=1...M−1 模 M M M 的逆元 i n v [ i ] inv[i] inv[i],则 i n v [ i ] = ( M − ⌊ M / i ⌋ ) ⋅ i n v [ M m o d i ] m o d M inv[i]=(M-\lfloor M/i \rfloor)·inv[M\mod i]\mod M inv[i]=(M−⌊M/i⌋)⋅inv[Mmodi]modM
推导过程:
设 t = ⌊ M / i ⌋ t = \lfloor M/i \rfloor t=⌊M/i⌋, k = M m o d i k = M \mod i k=Mmodi.
k ≡ M − t i ( m o d M ) k≡M-ti(\mod M) k≡M−ti(modM)
⇒ k + t i ≡ M ( m o d M ) ⇒k+ti≡M(\mod M) ⇒k+ti≡M(modM)
⇒ k + t i ≡ 0 ( m o d M ) ⇒k+ti≡0(\mod M) ⇒k+ti≡0(modM)
⇒ − t i ≡ k ( m o d M ) ⇒-ti≡k(\mod M) ⇒−ti≡k(modM)
两边同时除以 i k ik ik,得
− t k ≡ 1 i ( m o d M ) -\frac{t}{k}≡\frac{1}{i}(\mod M) −kt≡i1(modM)
⇒ − t k − 1 ≡ i − 1 ( m o d M ) ⇒-tk^{-1}≡i^{-1}(\mod M) ⇒−tk−1≡i−1(modM)
⇒ − t ⋅ i n v [ k ] ≡ i n v [ i ] ( m o d M ) ⇒-t·inv[k]≡inv[i](\mod M) ⇒−t⋅inv[k]≡inv[i](modM)
把 t t t 和 k k k 替换掉,得
i n v [ i ] = − ⌊ M / i ⌋ ⋅ i n v [ M m o d i ] m o d M inv[i]=-\lfloor M/i \rfloor·inv[M\mod i]\mod M inv[i]=−⌊M/i⌋⋅inv[Mmodi]modM
⇒ i n v [ i ] = ( M − ⌊ M / i ⌋ ) ⋅ i n v [ M m o d i ] m o d M ⇒inv[i]=(M-\lfloor M/i \rfloor)·inv[M\mod i]\mod M ⇒inv[i]=(M−⌊M/i⌋)⋅inv[Mmodi]modM
void invmod(int m)
{
inv[1] = 1;
for(int i = 2; i < m; i++)
inv[i] = (m - m / i) * inv[m % i] % m;
}
4.阶乘求逆元
fact[0] = 1;
for(re ll i = 1; i <= n; i++) fact[i] = fact[i - 1] * i % mod;
inv[n] = exgcd(n, mod, x, y);
for(re ll i = n - 1; i >= 1; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
5.题目
五、中国剩余定理(CRT)
1.定理
今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?
答曰:‘二十三’。
术曰:三三数之剩二,置一百四十;五五数之剩三,置六十三,七七数之剩二,置三十,并之。得二百三十三,以二百一十减之,即得。凡三三数之剩一,则置七十;五五数之剩一,则置二十一;七七数之剩一,则置十五;一百六以上以一百五减之即得。
——《孙子算经》
找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加15∗2+21∗3+70∗2得到和233。
用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。这个余数23就是符合条件的最小数。
以上就是孙子定理,国际上称为中国剩余定理(CRT),定理如下:
若
m
1
,
m
2
…
m
n
m_1,m_2…m_n
m1,m2…mn 是两两互质的正整数,
M
=
∏
i
=
1
n
m
i
M = \prod^n_{i=1}m_i
M=∏i=1nmi,
M
i
=
M
/
m
i
M_i=M/m_i
Mi=M/mi,
t
≡
M
i
−
1
(
m
o
d
m
i
)
t≡M_i^{-1}(\mod m_i)
t≡Mi−1(modmi)。对于
∀
a
1
,
a
2
…
a
n
∈
Z
∀a_1,a_2…a_n∈Z
∀a1,a2…an∈Z,则同余方程组
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
…
…
x
≡
a
n
(
m
o
d
m
n
)
\left\{\begin{matrix} &x≡a_1(\mod m_1) \\ &x≡a_2(\mod m_2) \\ &…… \\ &x≡a_n(\mod m_n) \end{matrix}\right.
⎩⎪⎪⎨⎪⎪⎧x≡a1(modm1)x≡a2(modm2)……x≡an(modmn)
有整数解,方程组的解为
x
=
∑
i
=
1
n
a
i
M
i
t
i
x=\sum^n_{i=1}a_iM_it_i
x=i=1∑naiMiti并且在模
M
M
M 意义下有唯一解。
推导: 设 x i ≡ a i ( m o d m i ) x_i≡a_i(\mod m_i) xi≡ai(modmi)。
由 a ≡ c ( m o d b ) ⇔ a + k b ≡ c ( m o d b ) a≡c(\mod b)⇔a+kb≡c(\mod b) a≡c(modb)⇔a+kb≡c(modb) 可知,要使 x ≡ a i ( m o d m i ) x≡a_i(\mod m_i) x≡ai(modmi),则 x i x_i xi 是除
m i m_i mi 之外所有模数的倍数。又因为模数两两互质,所以 x i x_i xi 是 M i = M / m i M_i=M/m_i Mi=M/mi 的倍数, M i M_i Mi 也是除 m i m_i mi 以外的模数的最小公倍数。
设 n i = x i M i n_i=\frac{x_i}{M_i} ni=Mixi,则 n i M i ≡ a i ( m o d m i ) n_iM_i ≡ a_i(\mod m_i) niMi≡ai(modmi),两边同时除以 a i a_i ai,则
n i a i M i ≡ 1 ( m o d m i ) \frac{n_i}{a_i}Mi≡1(\mod m_i) ainiMi≡1(modmi),则 t i = x i a i M i t_i=\frac{x_i}{a_iM_i} ti=aiMixi。则 x i = a i M i t i x_i=a_iM_it_i xi=aiMiti, x = ∑ i = 1 n a i M i t i x=\sum^n_{i=1}a_iM_it_i x=∑i=1naiMiti。
2.代码
int Crt()
{
int ans = 0, M = 1, Mi, x, y;
for(int i = 1; i <= n; i++)
M *= m[i];
for(int i = 1; i <= n; i++)
{
Mi = M / m[i];
exgcd(Mi, m[i], x, y);
ans = (ans + Mi * a[i] * x) % M;
}
return (ans + M) % M;
}
3.题目
Luogu P1495 【模板】中国剩余定理(CRT)/曹冲养猪
六、扩展中国剩余定理 (EXCRT)
1.定理
给定 n n n 组非负整数 a i , m i a_i, m_i ai,mi,求解关于 x x x 的方程组的最小非负整数解。
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) … … x ≡ a n ( m o d m n ) \left\{\begin{matrix} &x≡a_1(\mod m_1) \\ &x≡a_2(\mod m_2) \\ &…… \\ &x≡a_n(\mod m_n) \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧x≡a1(modm1)x≡a2(modm2)……x≡an(modmn)
推导:
设 x 0 ≡ a i − 1 ( m o d m i − 1 ) x_0 ≡ a_{i-1}(\mod m_{i-1}) x0≡ai−1(modmi−1), x 0 ≡ a i ( m o d m i ) , i = 2 … n x_0≡a_i(\mod m_i),i=2…n x0≡ai(modmi),i=2…n,
则 k m 1 + a 1 = − k ′ m 2 + a 2 , k , k ′ ∈ Z km_1+a_1=-k'm_2+a_2,k,k'∈Z km1+a1=−k′m2+a2,k,k′∈Z,
上式可化为 k m 1 + k ′ m 2 = a 2 − a 1 km_1+k'm_2=a_2-a_1 km1+k′m2=a2−a1,求得最小正整数解 k , k ′ k,k' k,k′。
将 k , k ′ k,k' k,k′ 代入原式,可求得 x 0 x_0 x0。
则此时 x ≡ x 0 ( m o d l c m ( m i − 1 , m i ) ) x≡x_0(\mod lcm(m_{i-1},m_i)) x≡x0(modlcm(mi−1,mi))。
将上式与下一式联立,用上述方法持续求解,直到 i = n i=n i=n时即可。
2.代码
int excrt()
{
for(int i = 2; i <= n; i++)
{
a = M[i - 1]; b = M[i]; c = A[i] - A[i - 1];
d = exgcd(a, b, x, y);
x = (x * (c / d) % (b / d) + (b / d)) % (b / d);
A[i] = a * b / d;
B[i] = x * a + B[i - 1];
}
return B[n];
}