中国剩余定理简单例题:从古代智慧到现代算法

在数论的浩瀚星空中,中国剩余定理无疑是最璀璨的星辰之一。它不仅是中国古代数学辉煌成就的象征,更是现代计算机科学、密码学领域的基石。对于广大学生、编程爱好者以及数学研究者而言,掌握中国剩余定理简单例题的解法,不仅是应对考试的关键,更是理解复杂算法逻辑的必经之路。

💡 什么是中国剩余定理?

简单来说,中国剩余定理解决的是这样一个问题:已知一个整数除以几个不同的数所得的余数,求这个整数是多少?

用数学语言描述:设正整数 ( m_1, m_2, dots, m_k ) 两两互质,对于任意整数 ( a_1, a_2, dots, a_k ),同余方程组:

x ≡ a₁ (mod m₁)
x ≡ a₂ (mod m₂)
...
x ≡ aₖ (mod mₖ)

在模 ( M = m_1 imes m_2 imes dots imes m_k ) 下有唯一解。

📜 历史渊源:从《孙子算经》到现代

公元 4 世纪 - 5 世纪

《孙子算经》问世

中国古代数学著作《孙子算经》卷下第二十六题首次记载了此类问题的原型:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”这是中国剩余定理最早的雏形。

南宋时期

秦九韶完善算法

数学家秦九韶在《数书九章》中提出了“大衍求一术”,系统性地解决了模数不一定互质的情况,将中国剩余定理推广到了更广泛的领域,比西方高斯的相关成果早了 1500 多年。

19 世纪

高斯正式命名

德国数学家高斯在《算术研究》中独立发现了该定理,并将其系统化。为了纪念东方智慧的贡献,后世将其命名为中国剩余定理(Chinese Remainder Theorem, CRT)。

⚙️ 算法原理:构造法的精妙之处

求解中国剩余定理简单例题的核心在于“构造法”。我们需要构造出一组特殊的数,使得它们满足特定的同余性质,最后将它们相加即可得到答案。

1. 核心步骤拆解

步骤 符号定义 操作说明 目的
第一步 M = ∏mᵢ 计算所有模数的乘积 确定解的范围(周期)
第二步 Mᵢ = M / mᵢ 计算总积除以当前模数 构造“只被其他模数整除”的基数
第三步 tᵢ = Mᵢ⁻¹ (mod mᵢ) 求逆元(扩展欧几里得算法) 使 Mᵢ × tᵢ ≡ 1 (mod mᵢ)
第四步 x = Σ(aᵢ × Mᵢ × tᵢ) 累加各项并取模 得到最小正整数解

2. 为什么这样构造有效?

以两项为例,假设我们要解:

x ≡ a₁ (mod m₁)
x ≡ a₂ (mod m₂)

我们构造 x = a₁·M₁·t₁ + a₂·M₂·t₂。

  • 当对 m₁ 取模时,第二项 a₂·M₂·t₂ 中包含因子 M₂ = M/m₂,而 M 是 m₁ 的倍数,所以第二项 ≡ 0 (mod m₁)。
  • 第一项中,M₁ = M/m₁,它不含 m₁ 因子,通过选择 t₁ 使得 M₁·t₁ ≡ 1 (mod m₁),于是第一项 ≡ a₁·1 ≡ a₁ (mod m₁)。
  • 同理,对 m₂ 取模时,只有第二项保留 a₂,第一项消失。

这就是中国剩余定理最精妙的地方:利用互质性,让每一项只对自己对应的方程生效,对其他方程“隐身”。

🔢 经典例题深度解析

理论需要实践的检验。下面我们通过三个不同难度的中国剩余定理简单例题,逐步深入理解其应用。

题目描述

有一堆苹果,不知道具体数量。如果每 3 个装一盘,剩 2 个;每 5 个装一盘,剩 3 个;每 7 个装一盘,剩 2 个。问这堆苹果至少有多少个?

解题过程

  1. 列出方程:
    x ≡ 2 (mod 3)
    x ≡ 3 (mod 5)
    x ≡ 2 (mod 7)
  2. 计算总模数 M:
    M = 3 × 5 × 7 = 105
  3. 计算各部分 Mᵢ:
    M₁ = 105 / 3 = 35
    M₂ = 105 / 5 = 21
    M₃ = 105 / 7 = 15
  4. 求逆元 tᵢ:
    对于 M₁=35:35t₁ ≡ 1 (mod 3) → 2t₁ ≡ 1 (mod 3) → t₁ = 2 (因为 2×2=4≡1)
    对于 M₂=21:21t₂ ≡ 1 (mod 5) → 1t₂ ≡ 1 (mod 5) → t₂ = 1
    对于 M₃=15:15t₃ ≡ 1 (mod 7) → 1t₃ ≡ 1 (mod 7) → t₃ = 1
  5. 代入公式:
    x = (2×35×2) + (3×21×1) + (2×15×1)
    x = 140 + 63 + 30 = 233
  6. 取模得最小解:
    x = 233 mod 105 = 23
✅ 验证: 23 ÷ 3 = 7...2 (对);23 ÷ 5 = 4...3 (对);23 ÷ 7 = 3...2 (对)。

题目描述

一个三位数,除以 3 余 1,除以 4 余 2,除以 5 余 3。求满足条件的最小三位数。

解题思路

这是一个典型的中国剩余定理变体。注意观察余数规律:

  • 3 余 1 → 差 2
  • 4 余 2 → 差 2
  • 5 余 3 → 差 2

发现规律:x + 2 能同时被 3, 4, 5 整除!

即 x + 2 = k · LCM(3, 4, 5) = k · 60。

x = 60k - 2。

寻找最小三位数:

  • k=1, x=58 (两位数)
  • k=2, x=118 (三位数,符合!)

答案: 118。

注:此题展示了观察法在解决中国剩余定理简单例题中的高效性,无需死套公式。

题目描述

某数除以 7 余 3,除以 11 余 4,除以 13 余 9。求该数。

标准解法演示

模数 7, 11, 13 两两互质,直接套用公式。

M = 7 × 11 × 13 = 1001。

M₁ = 143, M₂ = 91, M₃ = 77。

求逆元:

  • 143t₁ ≡ 1 (mod 7) → 3t₁ ≡ 1 → t₁ = 5 (3×5=15≡1)
  • 91t₂ ≡ 1 (mod 11) → 3t₂ ≡ 1 → t₂ = 4 (3×4=12≡1)
  • 77t₃ ≡ 1 (mod 13) → 12t₃ ≡ 1 → -t₃ ≡ 1 → t₃ = -1 ≡ 12

计算:

x = 3×143×5 + 4×91×4 + 9×77×12

x = 2145 + 1456 + 8316 = 11917

x mod 1001 = 11917 % 1001 = 916。

答案: 916。

💻 代码实现:Python 与 C++ 示例

在实际编程竞赛或工程应用中,手动计算容易出错。以下是两种主流语言的中国剩余定理实现模板。

1. Python 实现 (简洁优雅)

def extended_gcd(a, b):
    if a == 0:
        return b, 0, 1
    gcd, x1, y1 = extended_gcd(b % a, a)
    x = y1 - (b // a)  x1
    y = x1
    return gcd, x, y
def inverse(a, m):
    g, x, _ = extended_gcd(a, m)
    if g != 1:
        raise Exception('Modular inverse does not exist')
    return (x % m + m) % m
def chinese_remainder_theorem(n_list, a_list):
    """
    n_list: 模数列表 [m1, m2, ...]
    a_list: 余数列表 [a1, a2, ...]
    """
    M = 1
    for n in n_list:
        M = n
    result = 0
    for n_i, a_i in zip(n_list, a_list):
        M_i = M // n_i
        t_i = inverse(M_i, n_i)
        result += a_i  M_i  t_i
    return result % M

测试:韩信点兵

print(chinese_remainder_theorem([3, 5, 7], [2, 3, 2])) # 输出 23

2. C++ 实现 (高性能)

#include <iostream>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (!b) { x = 1; y = 0; return a; }
    ll d = exgcd(b, a % b, y, x);
    y -= a / b  x;
    return d;
}
ll inv(ll a, ll m) {
    ll x, y;
    exgcd(a, m, x, y);
    return (x % m + m) % m;
}
ll crt(vector<ll> &n, vector<ll> &a) {
    ll M = 1;
    for (auto val : n) M = val;
    ll res = 0;
    for (int i = 0; i < n.size(); ++i) {
        ll Mi = M / n[i];
        res = (res + a[i]  Mi % M  inv(Mi, n[i]) % M) % M;
    }
    return res;
}

🌐 网友还关心:CRT 的周边知识与应用

除了做题,中国剩余定理在现实生活中有着极其重要的地位。以下是网友们经常探讨的几个热点方向。

1. RSA 加密算法的加速

在 RSA 解密过程中,需要计算 ( c^d mod n )。如果 ( n ) 很大(如 2048 位),直接计算非常慢。利用中国剩余定理,可以将 ( n ) 分解为 ( p ) 和 ( q )(( n=pq )),分别在模 ( p ) 和模 ( q ) 下计算,最后合并结果。这使得解密速度提升了约 4 倍,是互联网安全通信的基础。

2. 分布式存储与容错

在云存储系统中,数据分片存储在不同节点。利用中国剩余定理构造的编码方案,允许系统在丢失部分节点数据的情况下,依然能够恢复原始数据,极大地提高了数据的可靠性。

3. 大整数乘法优化

当两个超大整数相乘时,可以将它们映射到多个较小的模数域中进行乘法运算,最后再用 CRT 还原结果。这种方法避免了处理超大的中间乘积,常用于高精度计算库中。

4. 扩域与多项式运算

在有限域理论和代数编码理论中,CRT 用于将大域上的多项式环分解为小域上多项式环的直积,简化了复杂的代数运算。

❓ 网友关心的常见问题 (FAQ)

Q: 中国剩余定理适用于所有同余方程组吗?

A: 不适用。标准的中国剩余定理要求所有模数 ( m_i ) 必须两两互质(即任意两个模数的最大公约数为 1)。如果模数不互质,则称为“广义中国剩余定理”或使用扩展欧几里得算法逐个合并方程。

Q: 为什么中国剩余定理又叫“韩信点兵”?

A: 虽然最早出自《孙子算经》,但民间流传的故事是汉初大将韩信通过让士兵按 3 人、5 人、7 人排队,根据剩余人数快速推算总兵力。这个故事生动地体现了中国剩余定理的应用场景,因此在中文语境下常被称为“韩信点兵”。

Q: 如果模数不互质怎么办?

A: 此时不能直接使用标准公式。需要将方程两两合并。例如 ( x equiv a_1 (mod m_1) ) 和 ( x equiv a_2 (mod m_2) ),可以写成 ( x = k_1 m_1 + a_1 = k_2 m_2 + a_2 ),整理为 ( k_1 m_1 - k_2 m_2 = a_2 - a_1 )。这是一个线性丢番图方程,可用扩展欧几里得算法求解。若 ( gcd(m_1, m_2) ) 不能整除 ( a_2 - a_1 ),则无解。

Q: 逆元不存在的情况如何处理?

A: 在中国剩余定理的标准形式中,由于模数两两互质,( M_i ) 与 ( m_i ) 必然互质,因此逆元一定存在。如果在非互质情况下强行套用,可能会遇到逆元不存在的问题,此时应回归到合并方程的方法。

✨ 更多精彩
研
墨卷研习录
墨卷研习录
CopyRight@educfa.com.cn