参考博客
一次同余方程
分情况讨论
- 若有
(a,n)=1
(
a
,
n
)
=
1
,根据 欧几里得扩展,存在 l,m使得
a∗l+n∗m=1
a
∗
l
+
n
∗
m
=
1
,等式两边同时模n,得
a∗l≡1(mod n)
a
∗
l
≡
1
(
m
o
d
n
)
,对于
a∗x≡b(mod n) a ∗ x ≡ b ( m o d n )a∗l∗x≡b∗l(mod n) a ∗ l ∗ x ≡ b ∗ l ( m o d n )x≡b∗l(mod n) x ≡ b ∗ l ( m o d n )
- 若有
(a,n)=d
(
a
,
n
)
=
d
, 对于
a∗x≡b(mod n) a ∗ x ≡ b ( m o d n )
移项
即
已知
于是
所以同余方程有解的条件是 d|b d | b
令 a1=a/d,b1=b/d,n1=n/d a 1 = a / d , b 1 = b / d , n 1 = n / d
则有
即为
就变成情况1,可以解出此时的
即
中国剩余定理
解线性同余方程,运用拉格朗日插值法,得孙子定理
模板
int m[maxn];
int China(int a[],int n,int b[])//其中a[]是模数,b[] 是余数
{
int M = 1;
for(int i = 0;i < n;++i)
M *= a[i];
int ans = 0;
for(int i = 0;i < n;++i)
{
int Mi = M/a[i];
LL x,y;
ex_gcd(Mi,a[i],x,y);
ans += b[i] * x*Mi;
}
ans = (ans%M + M) %M;
return ans;
}
扩展
合并两个模数
假设
y=a1(mod m1)
y
=
a
1
(
m
o
d
m
1
)
y=a2(mod m2)
y
=
a
2
(
m
o
d
m
2
)
令
x≡a1+t1∗m1;(1)
x
≡
a
1
+
t
1
∗
m
1
;
(
1
)
x≡a2+t2∗m2;(2)
x
≡
a
2
+
t
2
∗
m
2
;
(
2
)
两式相减得
t1∗m1−t2∗m2=a1−a2(3)
t
1
∗
m
1
−
t
2
∗
m
2
=
a
1
−
a
2
(
3
)
利用欧几里得扩展求出
t1
t
1
带入(1) 求出一个特解
x
x
证明 x与y同余于 lcm(m1,m2) l c m ( m 1 , m 2 )
m1|x−y m 1 | x − y
m2|x−y m 2 | x − y
所以 lcm(m1,m2)|x−y l c m ( m 1 , m 2 ) | x − y ,所以x和y关于 lcm(m1,m2) l c m ( m 1 , m 2 ) 同余