模运算的世界--线性同余方程组

线性同余方程组

对于线性同余方程组:

a1*xb1 (mod c1)

a2*xb2 (mod c2)

……

an*xbn (mod cn)

(1)若有c1c2c3、……cn两两互质,则可以用中国剩余定理直接算出可行解(唯一解?)

(2)若不满足模数两两互质,则:

  设最后的解为X

  我们利用扩展欧几里得可以算出一个可行解x1满足:

a1*x1b1 (mod c1)

    那么对于第二个方程 a2*xb2 (mod c2)X一定满足X mod lcm(c1,x2)=x1

    所以前两个方程可直接合并成 x mod lcm(c1,c2)=x1;

    这样依次合并下去……

int gcd(int a,int b)
{
    if(a%b==0)return b;
    else return gcd(b,a%b);
}
int mod_inverse(int a,int m)
{
	int x,y,d;
	ext_gcd(a,m,d,x,y);
	return (m+x%m)%m;
}
//返回一个(b,m)数对
pair<int,int>linear_congruence(const vector<int>&A,const vector<int>&B,const vector<int>&M)
{
    int x=0,m=1;
    for(int i=0;i<A.size();i++)
    {
        int a=A[i]*m,b=B[i]-A[i]*x,d=gcd(M[i],a);
        if(b%d!=0)return make_pair(0,-1);//无解
        int t=b/d*mod_inverse(a/d,M[i]/d)%(M[i]/d);
        x=x+m*t;
        m*=M[i]/d;
    }
    return make_pair(x%m,m);
}



原文地址:https://www.cnblogs.com/bryce1010/p/9387286.html