参考博客
Acdreamer
一次同余方程
a∗x≡b(mod n)
分情况讨论
- 若有 (a,n)=1 ,根据 欧几里得扩展,存在 l,m使得 a∗l+n∗m=1 ,等式两边同时模n,得 a∗l≡1(mod n) ,对于
a∗x≡b(mod n)
a∗l∗x≡b∗l(mod n)
x≡b∗l(mod n)
- 若有 (a,n)=d , 对于
a∗x≡b(mod n)
移项
a∗x−b≡0(mod n)
即
n|(a∗x−b)
已知
d|a,d|n
于是
d|b
所以同余方程有解的条件是
d|b 令
a1=a/d,b1=b/d,n1=n/d 则有
n1|(a1∗x−b1)
即为
a1∗x≡b1(mod n1) 且(a1,n1)=1
就变成情况1,可以解出此时的
x≡b1∗l(mod n1)
即
x=b1∗l+n1∗t
t的取值范围 为(0,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=a2(mod m2)
令
x≡a1+t1∗m1;(1)
x≡a2+t2∗m2;(2)
两式相减得 t1∗m1−t2∗m2=a1−a2(3)
利用欧几里得扩展求出 t1 带入(1) 求出一个特解 x
y=x(mod lcm(m1,m2))
证明 x与y同余于
lcm(m1,m2) m1|x−y m2|x−y 所以
lcm(m1,m2)|x−y ,所以x和y关于
lcm(m1,m2) 同余