实际上一元一次线性同余方程组,形式如下:
如果 m0,m1,⋯ m 0 , m 1 , ⋯ 两两互质,则方程有唯一解,在模 ∏imi ∏ i m i 的意义下。解法如下:
令 M=∏imi M = ∏ i m i ,且 Mi=M/mi M i = M / m i
对每一个 Mi M i 求出在模 mi m i 意义下的逆元,记作 xi x i
即满足 Mi⋅xi≡1(modmi) M i ⋅ x i ≡ 1 ( m o d m i )
则原方程组的解为 x=∏iri⋅xi⋅MimodM x = ∏ i r i ⋅ x i ⋅ M i m o d M
使用中国剩余定理理论上可以很方便的解出模数两两互质的方程组。对于不互质的情况可以使用下面的一般解法。
考虑单独的一个线性同余方程,已知 a,b,m a , b , m ,求 x x 满足如下方程:
考虑2个线性同余方程构成的方程组:
typedef long long int llt;
//to convert two congruence equations to equivalent one
//x = r1 (mod m1)
//x = r2 (mod m2)
//the out put is: x = r3 (mod m3)
//return true if there is a solution, otherwise false
bool mergeCrt(llt r1,llt m1,llt r2,llt m2,llt&r3,llt&m3){
llt x,y;
llt g = exEuclid(m1,m2,x,y);
llt r = (r2 - r1) % m2;
if ( r < 0 ) r += m2;
if ( r % g ) return false;//no solution
x = r / g * x % ( m2 / g );//the least positive solution
m3 = m1 / g * m2; //lcm
r3 = ( ( x * m1 ) % m3 + r1 ) % m3;
return true;
}
//Chinese remainder theorem to solve linear congruence equations
//n is the count of equations
//remainder is the array of remainders, index from 0
//mod is the array of modules, index from 0
//return the least positive solution or -1 if there is no solution
llt Crt(int n,llt const remainder[],llt const mod[]){
llt r1 = remainder[0],m1 = mod[0];
for(int i=1;iif ( !mergeCrt(r1,m1,remainder[i],mod[i],r1,m1) ){
return -1;
}
}
r1 %= m1;
if ( r1 < 0 ) r1 += m1;
return r1;
}
完整的程序可以见POJ2891