中国剩余定理[学习笔记]

扩展中国剩余定理[学习笔记]

很久以前就学了\(crt\)\(Excrt\),但一直都没有真正理解。今天又重新学习了一下,尤其是推式子的过程,就整理一下吧


\(Excrt\)用来解决的问题:

求解关于a的同余方程组:

\[\begin{cases} a\equiv b_1\ (mod\ c_1)\\ a\equiv b_2\ (mod\ c_2)\\ ...\\ a\equiv b_3\ (mod\ c_n)\\ \end{cases} \]

不保证\(ci,cj\)互质


解法

已经知道了对于单一的关于\(a\)的同余方程\(a=b_i (mod\) \(c _i)\),可以用exgcd的方法去求,那么只要我们将方程组的各个方程合成一个方程不就可以求解了吗?


将两个同余方程

\[\begin{cases} a\equiv b_i\ (mod\ c_i)\\ a\equiv b_j\ (mod\ c_j)\\ \end{cases} \]

合并 :

联立方程组得

\[a=x_ic_i+b_i=x_jc_j+b_j \]

两边交换

\[x_ic_i-x_jc_j=b_j-b_i \]

\[x_ic_i\equiv b_j-b_i(mod\ c_j) \]

\(c,d\)

\[c=b_j-b_i,d=gcd(c_i,c_j) \]

很明显如果不满足\(d|c\),方程无解

同除d,得

\[\frac{c_i}{d}x_i\equiv \frac{c}{d}(mod\ \frac{cj}{d}) \]

\[x_i\equiv \frac{c}{d}*inv(\frac{c_i}{d})(mod\ \frac{cj}{d}) \]

\(K=\frac{c}{d}*inv(\frac{c_i}{d})\),则

\[x_i=K+y\frac{c_j}{d} \]

\(x_i\)代回原来的\(a=x_ic_i+b_i\),得

\[a=Kc_i+y\frac{c_ic_j}{d}+b_i \]

\[a\equiv Kc_i+b_i(mod\ \frac{c_ic_j}{d}) \]

合并完成,新的\(b_i=Kc_i+b_i,c_i=\frac{c_ic_j}{d}\)


代码(照着上面膜你就好啦)

void excrt(ll bj,ll cj){
	if(bi==0&&ci==0){
		bi=bj,ci=cj;
		return;
	}
	ll C=bj-bi,d=gcd(ci,cj),P=ci/d*cj;
	if(C%d!=0){err=1; return;}
	ll K=e(C/d%(cj/d),inv(ci/d,cj/d),(cj/d));
	bi=(e(K,ci,P)+bi)%P,ci=P;
}
posted @ 2018-11-27 20:08  nianheng  阅读(140)  评论(0编辑  收藏  举报