首页 > 代码库 > 中国剩余定理
中国剩余定理
设正整数两两互素,则同余方程组
有整数解。并且在模下的解是唯一的,解为
其中,而为模的逆元。
ll e_gcd(ll a,ll b,int &x,int &y){ if (b==0){ x=1; y=0; return a; } ll d=e_gcd(b,a%b,x,y); ll t=x; x=y; y=t-(a/b)*y; return d; } void CRT(int n){ int M=1; ans=0; for (int i=1;i<=n;i++) M*=m[i]; for (int i=1;i<=n;i++){ int x,y,Mi=M/m[i]; e_gcd(Mi,m[i],x,y); ans=mo(ans+a[i]*Mi*x,M); } }
普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?
这种情况就采用两两合并的思想,假设要合并如下两个方程
那么得到
在利用扩展欧几里得算法解出的最小正整数解,再带入
得到后合并为一个方程的结果为
这样一直合并下去,最终可以求得同余方程组的解。
ll e_gcd(ll a,ll b,ll &x,ll &y){ if (b==0){ x=1; y=0; return a; } ll d=e_gcd(b,a%b,x,y); ll t=x; x=y; y=t-(a/b)*y; return d; } ll e_crt(int n) { ll M=m[1],R=r[1],x,y,d; for (int i=2;i<=n;++i) { d=e_gcd(M,m[i],x,y); if ((r[i]-R)%d) return -1; x=(r[i]-R)/d*x%(m[i]/d); R+=x*M; M=M/d*m[i]; R%=M; } return R>0?R:R+M; }
转自:http://blog.csdn.net/acdreamers/article/details/8050018
证明:可以参考百度百科。
中国剩余定理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。