数论: 一次同余式 (中国剩余定律)

一次同余式(中国剩余定律)
问题描述:
                                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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值