码迷,mamicode.com
首页 > 其他好文 > 详细

中国剩余定理(孙子定理)

时间:2015-11-12 17:38:48      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

“中国剩余定理”是公元5-6世纪、我国南北朝时期的一部著名算术著作《孙子算经》中的一个“物不知数”的解法问题:今有物不知其数,三三数之剩二,

五五数之剩三,七七数之剩二。问物几何?答曰:二十三。

根据上面我们可以得到一组式子:

 

X ≡ 2  (mod 3)

X ≡ 3  (mod 5) 

X ≡ 2  (mod 7)

即:

X % 3 = 2

X % 5 = 3

X % 7 = 2

那么我们设   X = t1 * a + t2 * b + t3 * c

继续设

a ≡ 1  (mod 3)                          b ≡ 0  (mod 3)                         c ≡ 0  (mod 3) 

a ≡ 0  (mod 5)                          b ≡ 1  (mod 5)                         c ≡ 0  (mod 5) 

a ≡ 0  (mod 7)                          b ≡ 0  (mod 7)                         c ≡ 1  (mod 7)

a = LCM(5,7) * p(a%3=1)     b = LCM(3,7)*p(b%5=1)       c = LCM(3,5)*p(c%7=1)

   = 35 * 2 = 70                           = 21 * 1 = 21                           = 15 * 1 = 15

那么我们就可以根据相对应的颜色得到t1 = 2, t2 = 3, t3 = 2

所以 X = 2a + 3b + 2c = 2 * 70 + 3 * 21 + 2 * 15 = 233

233是X的一个解,通解是 X = 233 + gcd(3,5,7)*k = 233 + 105*k

这些a、b、c(下面同称为Ni)该如何求呢(除数3、5、7统称为mi)

X ≡ y1  (mod m1)

X ≡ y2  (mod m2) 

X ≡ y3  (mod m3)

...

X ≡ an  (mod mn)

设X = N1 * y1 + N2 *y2 + N3 * y3 + ... + Nn * yn;

设  Ni能够被m1、m2、m3、.... 、mi-1、 mi + 1、... 、mn整除,但就是不能被mi整除且Ni%mi = 1

设  Ni = LCM(m1, m2, m3, ..., mn) / mi * x  = mi * y + 1, 要求Ni就必须得求x

上面式子可以转化为  LCM(m1, m2, m3, ..., mn) / mi * x + (- mi) * y = 1

转化之后的式子就是扩展欧几里德了, 这样就可以求出x

 

模板:

int CRT(int a[], int b[], int n)
{//a[i]表示除数,b[i]表示余数
    int M = 1, N, ans = 0, x, y;
    for(int i = 0 ; i < n ; i++)
        M *= a[i];//因为除数两两互质,所以最小公倍数就是其乘积
    for(int i = 0 ; i < n ; i++)
    {
        N = M / a[i];
        gcd(N, a[i], x, y);//利用扩展欧几里德求x
        ans += N * x * b[i];
    }
    return ans % M;
}

 

中国剩余定理(孙子定理)

标签:

原文地址:http://www.cnblogs.com/qq2424260747/p/4959421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!