线性同余方程组

线性同余方程
线性同余方程是形如\(ax\equiv b(mod\ m)\)的方程。
求解方法:
如果\(gcd(a,m)==1\),则\(a^{-1}\)存在,此时可以直接通过逆元求解,\(x=a^{-1}*b\)
但是如果\(gcd(a,m)\neq 1\),也就是逆元不存在,方程依然可能有解,设\(d=gcd(a,m)\),方程可以变为:
\(\frac{a}{d}x=\frac{b}{d}(mod\ \frac{m}{d})\)
所以只有当\(b\)无法整除\(d\)时,原方程无解。
如果原方程有解,由于\(gcd(\frac{a}{d},\frac{m}{d})==1\),可以通过逆元求解:
\(x=(\frac{a}{d})^{-1}*\frac{b}{d}(mod\ \frac{m}{d})\)
所以
\(x=(\frac{a}{d})^{-1}*\frac{b}{d}+(\frac{m}{d})*k(mod\ m)(0\leq k<gcd(a,m))\)
线性同余方程组
线性同余方程组是由多个线性同余方程联立得到的方程组,也就是\(ax\equiv b_i(mod\ m_i)(1\leq i\leq n)\)
如果方程组有解,那么一定有无穷多解,可以表示成\(x\equiv b(mod\ m)\)的形式,所以转化为求解\(b\)\(m\)
如果可以求解方程组\(\left\{\begin{matrix}x\equiv b_1(mod\ m_1)\\ax\equiv b_2(mod\ m_2)\end{matrix}\right.\),那么就可以逐个求解所有线性同余方程。
将第一个方程转化为\(x=b_1+m_1*t\),代入第二个方程,得到\(a(b_1+m_1*t)\equiv b_2(mod\ m_2)\)
也就是\(a*m_1*t\equiv b_2-a_1*t(mod\ m_2)\)
这是一个线性同余方程,可以使用\(exgcd\)求解。当\(gcd(a*m_1,m_2)\nmid (b_2-a_1*t)\)时,原方程组无解。
开始时将解设为可以表示所有整数的形式,也就是\(x\equiv 0(mod\ 1)\)
函数返回一个\((b,m)\)整数对。

PII linear_congruence(vector<int> A,vector<int> B,vector<int> M){
    int x=0,m=1;
    l=A.size();
    for(int i=0;i<l;i++){
        int a=A[i]*m,b=B[i]-A[i]*x,d=gcd(max(a,M[i]),min(a,M[i]));
        if(b%d) return {0,-1};
        a/=d;
        b/=d;
        M[i]/=d;
        LL t=b*inv(a,M[i])%M[i];
        x=x+m*t;
        m*=M[i];
    }
    return {(x+m)%m,m};
}
posted @ 2020-07-24 14:31  fxq1304  阅读(337)  评论(0)    收藏  举报