模运算的世界--线性同余方程组
线性同余方程组
对于线性同余方程组:
a1*x≡b1 (mod c1)
a2*x≡b2 (mod c2)
……
an*x≡bn (mod cn)
(1)若有c1、c2、c3、……cn两两互质,则可以用中国剩余定理直接算出可行解(唯一解?)
(2)若不满足模数两两互质,则:
设最后的解为X
我们利用扩展欧几里得可以算出一个可行解x1满足:
a1*x1≡b1 (mod c1)
那么对于第二个方程 a2*x≡b2 (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);
}