同余方程&孙子定理&模线性同余方程

2019-04-13 17:15发布

class="markdown_views prism-dracula">

参考博客

Acdreamer

一次同余方程

axb(mod n)" role="presentation">axb(mod n)
这里写图片描述
分情况讨论
  1. 若有(a,n)=1" role="presentation">(a,n)=1,根据 欧几里得扩展,存在 l,m使得al+nm=1" role="presentation">al+nm=1,等式两边同时模n,得 al1(mod n)" role="presentation">al1(mod n),对于 axb(mod n)" role="presentation">axb(mod n) alxbl(mod n)" role="presentation">alxbl(mod n)xbl(mod n)" role="presentation">xbl(mod n)

  1. 若有 (a,n)=d" role="presentation">(a,n)=d, 对于 axb(mod n)" role="presentation">axb(mod n)
移项 axb0(mod n)" role="presentation">axb0(mod n)
n|(axb)" role="presentation">n|(axb)
已知d|a,d|n" role="presentation">d|a,d|n
于是 d|b" role="presentation">d|b
所以同余方程有解的条件是d|b" role="presentation">d|b
a1=a/d,b1=b/d,n1=n/d" role="presentation">a1=a/d,b1=b/d,n1=n/d
则有 n1|(a1xb1)" role="presentation">n1|(a1xb1)
即为 a1xb1(mod n1)     (a1,n1)=1" role="presentation">a1xb1(mod n1)     (a1,n1)=1
就变成情况1,可以解出此时的 xb1l(mod n1)" role="presentation">xb1l(mod n1)
x=b1l+n1t" role="presentation">x=b1l+n1tt的取值范围 为(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)" role="presentation">