LogoCSP Wiki By Yundou
0 MathBasics

中国剩余定理

引入

「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

即求满足以下条件的整数:除以 3322,除以 5533,除以 7722

该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

2×70+3×21+2×15=233=2×105+232\times 70+3\times 21+2\times 15=233=2\times 105+23,故答案为 2323

定义

中国剩余定理 (Chinese Remainder Theorem, CRT) 可求解如下形式的一元线性同余方程组(其中 n1,n2,,nkn_1, n_2, \cdots, n_k 两两互质):

{xa1(modn1)xa2(modn2)xak(modnk)\begin{cases} x &\equiv a_1 \pmod {n_1} \\ x &\equiv a_2 \pmod {n_2} \\ &\vdots \\ x &\equiv a_k \pmod {n_k} \\ \end{cases}

上面的「物不知数」问题就是一元线性同余方程组的一个实例。

过程

  1. 计算所有模数的积 nn
  2. 对于第 ii 个方程:
    1. 计算 mi=nnim_i=\frac{n}{n_i}
    2. 计算 mim_i 在模 nin_i 意义下的 逆元 mi1m_i^{-1}
    3. 计算 ci=mimi1c_i=m_im_i^{-1}不要对 nin_i 取模)。
  3. 方程组在模 nn 意义下的唯一解为:x=i=1kaici(modn)x=\sum_{i=1}^k a_ic_i \pmod n

实现

LL CRT(int k, LL* a, LL* r) {
  LL n = 1, ans = 0;
  for (int i = 1; i <= k; i++) n = n * r[i];
  for (int i = 1; i <= k; i++) {
    LL m = n / r[i], b, y;
    exgcd(m, r[i], b, y);  // b * m mod r[i] = 1
    ans = (ans + a[i] * m * b % n) % n;
  }
  return (ans % n + n) % n;
}

证明

我们需要证明上面算法计算所得的 xx 对于任意 i=1,2,,ki=1,2,\cdots,k 满足 xai(modni)x\equiv a_i \pmod {n_i}

iji\neq j 时,有 mj0(modni)m_j \equiv 0 \pmod {n_i},故 cjmj0(modni)c_j \equiv m_j \equiv 0 \pmod {n_i}。又有 cimi(mi1modni)1(modni)c_i \equiv m_i \cdot (m_i^{-1} \bmod {n_i}) \equiv 1 \pmod {n_i},所以我们有:

xj=1kajcj(modni)aici(modni)aimi(mi1modni)(modni)ai(modni)\begin{aligned} x&\equiv \sum_{j=1}^k a_jc_j &\pmod {n_i} \\ &\equiv a_ic_i &\pmod {n_i} \\ &\equiv a_i \cdot m_i \cdot (m^{-1}_i \bmod n_i) &\pmod {n_i} \\ &\equiv a_i &\pmod {n_i} \end{aligned}

即对于任意 i=1,2,,ki=1,2,\cdots,k,上面算法得到的 xx 总是满足 xai(modni)x\equiv a_i \pmod{n_i},即证明了解同余方程组的算法的正确性。

因为我们没有对输入的 aia_i 作特殊限制,所以任何一组输入 {ai}\{a_i\} 都对应一个解 xx

另外,若 xyx\neq y,则总存在 ii 使得 xxyy 在模 nin_i 下不同余。

故系数列表 {ai}\{a_i\} 与解 xx 之间是一一映射关系,方程组总是有唯一解。

解释

下面演示 CRT 如何解「物不知数」问题。

  1. n=3×5×7=105n=3\times 5\times 7=105
  2. 三人同行 七十 希:n1=3,m1=n/n1=35,m112(mod3)n_1=3, m_1=n/n_1=35, m_1^{-1}\equiv 2\pmod 3,故 c1=35×2=70c_1=35\times 2=70
  3. 五树梅花 廿一 支:n2=5,m2=n/n2=21,m211(mod5)n_2=5, m_2=n/n_2=21, m_2^{-1}\equiv 1\pmod 5,故 c2=21×1=21c_2=21\times 1=21
  4. 七子团圆正 半月n3=7,m3=n/n3=15,m311(mod7)n_3=7, m_3=n/n_3=15, m_3^{-1}\equiv 1\pmod 7,故 c3=15×1=15c_3=15\times 1=15
  5. 所以方程组的唯一解为 x2×70+3×21+2×1523323(mod105)x\equiv 2\times 70+3\times 21+2\times 15\equiv 233\equiv 23 \pmod {105}。(除 百零五 便得知)

例题:

On this page