中国同余定理

从《孙子算经》到现代密码学的跨千年智慧之旅

历史渊源:物不知数

中国同余定理,又称中国剩余定理(Chinese Remainder Theorem, 简称CRT),是中国古代数学辉煌成就的重要代表之一。其最早记载于南北朝时期(公元4-5世纪)的数学著作《孙子算经》卷下第二十六题,题为“物不知数”。

原文记载:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?” 这一问题的本质是求解一个一次同余方程组。解答者不仅给出了答案“二十三”,还给出了通用的解法口诀:“三人同行七十稀,五树梅花廿一枝,七子团圆正半月,除百零五便得知。”

南北朝 (约公元450年)

《孙子算经》

首次提出“物不知数”问题,奠定了同余理论的基础。虽然未给出一般性理论,但提供了具体问题的解法。

南宋 (1202年)

秦九韶《数书九章》

秦九韶将“物不知数”问题推广为一般形式,提出了“大衍求一术”,完整叙述了求解任意模数同余方程组的算法,这是中国同余定理的成熟形态。

1801年

高斯《算术研究》

德国数学家高斯在《算术研究》中独立提出了相同定理,西方数学界称之为“中国剩余定理”,以表彰中国数学家的早期贡献。

⚙️ 核心概念:模运算

模运算(Modular Arithmetic)是中国同余定理的基础。若整数 除以正整数 ,余数为 ,则记作 。同余定理研究的就是多个这样的方程组如何联立求解。

⚙️ 互质条件

定理成立的关键前提是模数 必须两两互质(即任意两个模数的最大公约数为1)。如果模数不互质,则需要使用扩展中国剩余定理或合并方程的方法。

数学原理:大衍求一术

要深入理解中国同余定理,必须掌握其严格的数学表述和构造性证明。设 是两两互质的正整数,对于任意整数 ,同余方程组:

方程 含义
x 除以 m1 余 a1
x 除以 m2 余 a2
... ...
x 除以 mk 余 ak

在模 的意义下,该方程组有唯一解。解的构造公式为:

其中:

  • (总积除以当前模数)
  • 是 关于模 的模逆元,即满足 的整数。

示例计算:孙子算经原题

问题:, , 。

  1. 计算总积 M:。
  2. 计算 Mi:
  3. 计算逆元 yi:
    • (因为 ? No. . . Correct.)
    • (Wait, . So . . Correct.)
  4. 计算解 x:
  5. 取模 M:。

最终解为 23。这与秦九韶口诀“三人同行七十稀”(? No, the口诀 uses 70, 21, 15. Let's check: , , . Yes. My calculated inverses were 2, 1, 1. The口诀 uses 70, 21, 15. . So the口诀 effectively absorbs the multiplier or uses a different set of bases. Actually, the口诀 is: . . Perfect match.

算法实现与代码示例

在现代计算机科学中,中国同余定理不仅是数论的考点,更是算法竞赛和密码学实现的基石。下面提供Python和C++两种语言的实现示例。

Python 简洁实现

def extended_gcd(a, b):
    if a == 0:
        return b, 0, 1
    else:
        g, y, x = extended_gcd(b % a, a)
        return g, x - (b // a)  y, y
def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        raise Exception('Modular inverse does not exist')
    else:
        return (x % m + m) % m
def chinese_remainder_theorem(pairs):
    """
    pairs: list of tuples (remainder, modulus)
    Example: [(2, 3), (3, 5), (2, 7)]
    """
    # 1. Calculate product of all moduli
    mod_product = 1
    for _, m in pairs:
        mod_product = m
    result = 0
    for a, m in pairs:
        Mi = mod_product // m
        yi = modinv(Mi, m)
        result += a  Mi  yi
    return result % mod_product

Test

print(chinese_remainder_theorem([(2, 3), (3, 5), (2, 7)])) # Output: 23

C++ 快速实现

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, y, x);
    y -= a / b  x;
    return d;
}
ll crt(vector<ll>& a, vector<ll>& m) {
    ll M = 1, ans = 0;
    for (ll x : m) M = x;
    for (int i = 0; i < a.size(); i++) {
        ll Mi = M / m[i];
        ll x, y;
        exgcd(Mi, m[i], x, y);
        ans = (ans + a[i]  Mi  x) % M;
    }
    return (ans % M + M) % M;
}
int main() {
    vector<ll> a = {2, 3, 2};
    vector<ll> m = {3, 5, 7};
    cout << crt(a, m) << endl; // Output: 23
    return 0;
}

Java 实现

public class CRT {
    public static long extendedGCD(long a, long b, long[] xy) {
        if (b == 0) {
            xy[0] = 1;
            xy[1] = 0;
            return a;
        }
        long[] nextXY = new long[2];
        long d = extendedGCD(b, a % b, nextXY);
        xy[0] = nextXY[1];
        xy[1] = nextXY[0] - (a / b)  nextXY[1];
        return d;
    }
    public static long modInverse(long a, long m) {
        long[] xy = new long[2];
        extendedGCD(a, m, xy);
        return (xy[0] % m + m) % m;
    }
    public static long chineseRemainder(long[] a, long[] m) {
        long M = 1;
        for (long val : m) M = val;
        long result = 0;
        for (int i = 0; i < a.length; i++) {
            long Mi = M / m[i];
            long yi = modInverse(Mi, m[i]);
            result = (result + a[i]  Mi % M  yi % M) % M;
        }
        return result;
    }
    public static void main(String[] args) {
        long[] a = {2, 3, 2};
        long[] m = {3, 5, 7};
        System.out.println(chineseRemainder(a, m)); // Output: 23
    }
}

现代应用:从密码学到分布式计算

中国同余定理不仅在古代数学中占据重要地位,在现代科技领域更是不可或缺。以下是其几个核心的应用场景。

🔐 RSA 密码系统加速

在RSA解密过程中,私钥操作涉及大数模幂运算 。利用中国同余定理,可以将模 的运算分解为模 和模 的两个较小运算,速度可提升约4倍。这就是著名的CRT-RSA。

🌐 秘密共享方案

在中国剩余定理的秘密共享中,一个秘密 可以被分割成 个份额 。只有收集到足够多的份额(例如 个),才能通过CRT重构出秘密 。这广泛应用于银行金库管理和区块链钱包。

💻 大整数运算优化

在计算机处理超大整数(超过64位)时,直接运算效率低下。利用中国同余定理,可以将大整数映射到多个小模数域上进行并行运算,最后通过CRT合并结果。这种技术被称为残数系统(Residue Number System, RNS)。

📡 编码理论

在纠错码(如BCH码、Reed-Solomon码)中,中国同余定理用于解码算法,帮助从受损的数据包中恢复原始信息,确保通信的可靠性。

网友们还关心:CRT与扩展CRT的区别

标准的中国同余定理要求模数两两互质。然而,在实际问题中,模数往往不互质。这时需要使用扩展中国剩余定理(Extended CRT)。

扩展CRT的处理思路是将两个方程 和 合并为一个方程。通过扩展欧几里得算法,判断方程组是否有解(即 是否整除 ),如果有解,则合并为一个新的模线性同余方程,模数变为 。重复此过程直到所有方程合并完毕。

考研与竞赛复习指南

对于准备考研数学、离散数学或算法竞赛的同学来说,中国同余定理是一个高频考点。以下是复习重点和易错点分析。

考点 难度 考查形式 备考建议
基础定义 ★☆☆ 选择题、填空题 熟练掌握同余的基本性质(加法、乘法、幂运算)。
逆元计算 ★★☆ 计算题、算法题 熟练使用扩展欧几里得算法求解模逆元,注意负数取模的处理。
CRT应用 ★★★ 证明题、综合应用题 能够构造方程组并求解,理解唯一性证明。
扩展CRT ★★★★ 算法竞赛、研究生复试 掌握模数不互质时的合并方法,处理大数运算时的溢出问题。
密码学结合 ★★★★★ 专业课综合题 理解CRT在RSA加速中的原理,能推导公式。

易错点提示

  • 余数范围:余数必须是非负整数且小于模数。在计算过程中如果出现负数,务必转换为正余数。
  • 互质条件:在使用标准CRT公式前,务必检查模数是否两两互质。如果不互质,必须使用扩展CRT。
  • 数据溢出:在编程实现时,中间乘积可能远超数据类型范围,需要使用快速乘或大数库,或在每一步进行取模操作。

常见问题解答 (FAQ)

中国同余定理和欧拉定理有什么区别?

欧拉定理()主要研究模幂运算的性质,用于简化大指数模运算。而中国同余定理(CRT)主要研究同余方程组的求解,用于将大模数问题分解为小模数问题。两者在密码学中常结合使用。

如果模数不互质,还能用中国同余定理吗?

不能直接使用标准形式的中国同余定理。此时需要使用扩展中国剩余定理,通过扩展欧几里得算法判断解的存在性,并将方程合并,直到模数变为两两互质或合并为单一方程。

中国同余定理在现实生活中有直接应用吗?

虽然普通人日常生活中不直接计算同余方程,但其原理广泛应用于日历计算(如闰年周期)、周期性问题(如星期几推算)、以及现代科技中的数据存储校验和网络安全。

为什么叫“中国”剩余定理?

因为该问题最早出现在中国古算书《孙子算经》中,且中国古代数学家秦九韶给出了完整的通用解法“大衍求一术”,比西方早了几百年。1801年高斯在《算术研究》中引用了中国的成果,故命名为“中国剩余定理”。

© 2023 中国同余定理研究中心. All Rights Reserved.

本站内容仅供学习参考,不构成专业建议。

研
墨卷研习录
墨卷研习录
CopyRight@educfa.com.cn