中国剩余定理与扩展中国剩余定理

中国剩余定理(CRT)

我好蔡啊
不学这个东东我连任意模数\(NTT\)都学不了

问题

中国剩余定理用于求解同余方程组

\[ \left\{
\begin{aligned}
x≡a_1(\mod m_1)\x≡a_2(\mod m_2)\......\x≡a_k(\mod m_k)
\end{aligned}
\right.
\]

其中\(m_1,m_2,...,m_k\)两两互质
求\(x\)的最小非负整数解

定理

令\(M=\prod_{i=1}^km_i\),也就是它们的最小公倍数
设\(t_i\)为\({M\over m_i}t_i≡1(\mod m_i)\)的最小非负整数解
那么有一个\(x\)解为\(\sum_{i=1}^ka_i{M\over m_i}t_i\)
通解为\(x+kM(k\in \Z)\),最小非负整数解为\((x\% M+M)\%M\)

证明

对于\(M\over m_i\),它一定是其他\(m\)的倍数且不整除\(m_i\)(注意限制)
那么\(?k≠i,a_i{M\over m_i}t_i≡0(\mod m_k)\),这个是因为\({M\over m_i}\mod m_k=0\)
由于\({M\over m_i}t_i≡1(\mod m_i)\),所以\(a_i{M\over m_i}t_i≡a_i(\mod m_i)\)
又因为\(x=\sum_{i=1}^ka_i{M\over m_i}t_i\),代入方程组,方程组成立

code

容易发现因为\({M\over m_i}t_i≡1(\mod m_i)\)
其实就是求\({M\over m_i}\)关于\(m_i\)的逆元
扩欧实现好了

inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if (b==0){x=1,y=0;return a;}
    ll ans=exgcd(b,a%b,y,x);
    y-=x*(a/b);return ans;
}
inline ll CRT(ll a[],ll m[],ll n)
{
    ll M=1ll,x,y,ans=0ll;
    fo(i,1,n)M*=m[i];
    fo(i,1,n)
    {
        ll tmp=M/m[i];exgcd(tmp,m[i],x,y);
        ans=(ans+a[i]*x*tmp)%M;
    }
    return (ans+M)%M;
}

扩展中国剩余定理(EXCRT)

问题

扩展中国剩余定理用于求解同余方程组

\[ \left\{
\begin{aligned}
x≡a_1(\mod m_1)\x≡a_2(\mod m_2)\......\x≡a_k(\mod m_k)
\end{aligned}
\right.
\]

其中\(m_1,m_2,...,m_k\)不保证两两互质
求\(x\)的最小非负整数解

求解

设前\(k-1\)条方程组成的方程组的一个解为\(x\)
令\(M=\prod_{i=1}^{k-1}m_i\),那么通解就为\(x+kM(k\in\Z)\)

那么考虑加入第\(k\)条方程,即求一个\(t\in\N^+\),使
\(x+tM≡a_k(\mod m_k)\),也就是\(tM≡a_k-x(\mod m_k)\)
由于\(M,a_k,x,m_k\)都已知,可以看作\(ax≡c(\mod b)\)
这个也可以用扩欧解

扩欧可以直接解出\(ax+by=gcd(a,b)\)的解\(x_0,y_0\)
于是如果直接解\(ax+by=c\),\(x_0\)还要除掉\({c\over \gcd(a,b)}\)就是\(x_0c\over \gcd(a,b)\)
原方程相当于\(ax\mod b=c\),转化为\(ax+by=c\),用上面的方法解就好了
注意如果不满足\(gcd(a,b)|c\),这条方程无解,整个方程组也无解
好像就是这样了,一共要做\(n-1\)次扩欧,注意各种取模细节

code

inline ll mul(ll x,ll y,ll mod)
{
    return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}
inline ll EXCRT(ll a[],ll m[],ll n)
{
    ll M=m[1],x,y,ans=a[1];
    fo(i,2,n)
    {
        ll gcd=exgcd(M,m[i],x,y),tmp=(a[i]-ans%m[i]+m[i])%m[i];
        if (tmp%gcd!=0)return -1;
        x=mul(x,tmp/gcd,m[i]/gcd);
        ans+=x*M,M*=m[i]/gcd,ans=(ans%M+M)%M;
    }
    return (ans%M+M)%M;
}

后记

感觉这种数学的东西还得多学多记多背……
本人版权意识薄弱……

原文地址:https://www.cnblogs.com/horizonwd/p/11307384.html

时间: 2024-11-05 22:37:02

中国剩余定理与扩展中国剩余定理的相关文章

中国剩余定理和扩展中国剩余定理

也许更好的阅读体验 前置知识 快速乘 扩展欧几里得定理 同余方程 中国剩余定理(CRT) 目的 求最小的正整数\(x\),使其满足 \(\begin{cases} x\equiv a_{1}\left( mod\ m\right) \\ x\equiv a_{2}\left( mod\ m_{2}\right) \\ \vdots \\ x\equiv a_{n}\left( mod\ m_{n}\right) \end{cases}\) 其中 \(m_1,m_2\dots m_n\)互质 求法

扩展中国剩余定理

若有以下两个同余方程 x ≡ a1 mod n1 x ≡ a2 mod n2 x= n1*k1+a1 = n2*k2+a2 ∴ n1*k1 = n2*k2+a2-a1 ∴ n1*k1 ≡ a2-a1 mod n2 由扩展欧几里得定理得,同余方程有解的条件是 gcd(n1,n2) | (a2-a1) 令d=gcd(n1,n2),c=a2-a1 则n1/d * k1 ≡ c/d mod n2/d ∴ k1 = c/d * inv(n1/d)mod n2/d 令k=c/d * inv(n1/d),则k

gcd,扩展欧几里得,中国剩余定理

1.gcd: int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题:有一正整数ans,对于每一对数,都有:(ans-a[i])mod m[i]=0.求此数最小为多少. 输入样例: 1 10 2 3 1 2 3 2 3 5 8 1 2 3 4 5 6 7 8 97 89 67 61 59 53 47 88 12 1 2 3 4 5 6 7 8 9

数论E - Biorhythms(中国剩余定理,一水)

E - Biorhythms Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the

HDU 1573 X问题 中国剩余定理

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路:中国剩余定理的模板题,如果找不到这样的数或者最小的X大于N,输出零. 代码: #include <iostream> #include

同余 模算术 中国剩余定理

相关知识点: 1.a≡b(modc),a,b关于模c同余  ,即a modc=b mod c , 等价于a%c=b 2.如果a,b互质(a,b)=1,则可得a关于模b的逆 ax≡1(modb) 3.关于余数的定理: 定理1 :如果被除数加上(或减去)除数的整数倍,除数不变,则余数不变. 定理2 :如果被除数扩大(或缩小)几倍,除数不变,则余数也扩大(或缩小)同样的倍数. 定理3: 如果整数a除以自然数b(b≠0),余数r仍不小于b,则r除以b的余数等于a除以b所得余数.(余数和被除数关于除数同余

POJ 1006 中国剩余定理

[题意]: 给定p,e,i,d,求解 (x + d) % 23 = p (x + d) % 28 = e(x + d) % 33 = i x最小正整数值 [知识点]: 中国剩余定理 [题解]: 典型的 xmodmi = ai模型,其中mi间两两互素.但该题式子较少,也可以直接自己化简带入值. [代码]: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <ctime> 5 #inc

【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理

题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. 输入 第一行,四个整数N.M.T.P. 接下来的T行,每行两个整数,表示施工的路口的坐标. 输出 一

转载----POJ 1006 中国剩余定理

本文为转载,源地址:   http://blog.csdn.net/dongfengkuayue/article/details/6461298 POJ 1006   Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78980   Accepted: 23740 Description Some people believe that there are three cycles in a perso