一次同余式(中国剩余定律)
问题描述:
x = b1 (mod m1),
x = b2 (mod m2), x = b3 (mod m3) , .... ... , x = bk (mod mk);
(1)
这些成为同余式组, 它们有一个未知数, 而且有不同的两辆互素的模(mi), 求解全部的 x .
要求解同余式组, 先假设数Ms ,Ms' , 并且有下面的条件:
m1*m2*m3*...*mk = Ms * ms
Ms*Ms' = 1 (mod ms)
而且设:
Xo = M1*M1'*b1 + M2*M2'*b2 + M3*M3'*b3 + ... + Mk*Mk'*bk
那么适合组的全部x可以有下面的同余式定出:
x = Xo mod (m1*m2*m3*...*mk);
(2)
并且: Xo = Ms*Ms'*bs
= bs (mod ms)
即直接推出组(1) 与 组
x = Xo (mod m1),
x = Xo (mod m2), ... , x = Xo (mod mk)
(3)
例子: 解同余式组
x = b1(mod 4), x = b2(mod 5), x = b3(mod 7)
这里有: 4*5*7 = 4*35 = 5*28 = 7*20, 并且:
35 * 3 = 1 (mod 4), 28*2 = 1 (mod 5), 20*6 = 1 (mod 7)
有上面(2)式有: x = 105*b1 + 56*b2 + 120*b3 (mod 4 * 5 * 7)
代码:
// a,b是系数, x,y是方程的解. d是a,b的最大公约数
// x最小的解: 设t = b/d; x = (x%t + t) % t;
void ex_gcd(int a,int b, int &d,int &x,int &y)
{
if( b == 0 )
{
d = a , x = 1, y = 0;
}
else
{
ex_gcd(b,a%b,d,y,x);
y -= x*(a/b);
}
}
//求解模线性方程组. (中国剩余定律)
// x = b[0] (mod w[0])
// x = b[1] (mod w[1])
// ...
// x = b[k-1] (mod w[k-1])
//要求 w[i] > 0 与 w[j]互质.
int modular_linear_system(int *b,int *w,int k)
{
int d, x, y;
int a = 0, i;
int m, n = 1;
for(i = 0; i < k; ++i) n *= w[i];
for(i = 0; i < k; ++i)
{
m = n/w[i];
ex_gcd(w[i],m,d,x,y);
a = (a+y*m*b[i]) % n;
//y是Ms*Ms' = 1 (mod ms)中的Ms'
}
return (a+n) % n;
}
例子: 解同余式组
代码:
// a,b是系数, x,y是方程的解. d是a,b的最大公约数
// x最小的解: 设t = b/d;
void ex_gcd(int a,int b, int &d,int &x,int &y)
{
}
//求解模线性方程组. (中国剩余定律)
// x = b[0] (mod w[0])
// x = b[1] (mod w[1])
// ...
// x = b[k-1] (mod w[k-1])
//要求 w[i] > 0 与 w[j]互质.
int modular_linear_system(int *b,int *w,int k)
{
}