• 线性同余方程组


    线性同余方程
    线性同余方程是形如(axequiv b(mod m))的方程。
    求解方法:
    如果(gcd(a,m)==1),则(a^{-1})存在,此时可以直接通过逆元求解,(x=a^{-1}*b)
    但是如果(gcd(a,m) eq 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)(0leq k<gcd(a,m)))
    线性同余方程组
    线性同余方程组是由多个线性同余方程联立得到的方程组,也就是(axequiv b_i(mod m_i)(1leq ileq n))
    如果方程组有解,那么一定有无穷多解,可以表示成(xequiv b(mod m))的形式,所以转化为求解(b)(m)
    如果可以求解方程组(left{egin{matrix}xequiv b_1(mod m_1)\axequiv b_2(mod m_2)end{matrix} ight.),那么就可以逐个求解所有线性同余方程。
    将第一个方程转化为(x=b_1+m_1*t),代入第二个方程,得到(a(b_1+m_1*t)equiv b_2(mod m_2))
    也就是(a*m_1*tequiv b_2-a_1*t(mod m_2))
    这是一个线性同余方程,可以使用(exgcd)求解。当(gcd(a*m_1,m_2) mid (b_2-a_1*t))时,原方程组无解。
    开始时将解设为可以表示所有整数的形式,也就是(xequiv 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};
    }
    
  • 相关阅读:
    第二次会议记录(2021.7.19)
    第一次会议记录(2021.7.8)
    软件工程助教工作总结
    Linux下的常用命令
    GPIO输出——使用固件库点亮LED 宏定义遇到的问题
    STM32 GPIO BRR和BSRR寄存器
    snprintf()函数使用方法
    结构体元素偏移量宏的定义及解析
    函数指针&回调函数Callback
    解析#define NULL ((void *)0)——野指针,空指针和 void*
  • 原文地址:https://www.cnblogs.com/fxq1304/p/13371766.html
Copyright © 2020-2023  润新知