相关笔记


概览

本节覆盖 CLRS 第 4 版第 31 章的 31.3(模运算)、31.4(求解模线性方程)和 31.5(中国剩余定理)三个小节。模运算(模运算)是数论算法的核心计算工具,它将整数运算限制在一个有限集合 上,使得加法、乘法和幂运算的结果始终落在有限范围内。在此基础上,我们研究模线性方程 的求解方法——其有解条件为 ,解的个数恰好等于 。最后,中国剩余定理(中国剩余定理,CRT)给出了一套构造性方法,将多个两两互素模数下的同余方程合并为唯一解,这一结果在密码学(特别是 RSA 加速解密)和大整数运算中有着极为重要的应用。


知识结构总览

flowchart TD
    A["<b>31.3 模运算</b>"] --> A1["模加法 (a+b) mod n"]
    A --> A2["模乘法 (a×b) mod n"]
    A --> A3["模幂运算 a^b mod n"]
    A --> A4["代数性质"]
    A4 --> A4a["封闭性、结合律、交换律"]
    A4 --> A4b["单位元、逆元"]
    A --> A5["$\mathbb{Z}_n^*$ 群"]

    B["<b>31.4 求解模线性方程</b>"] --> B1["方程形式: ax ≡ b (mod n)"]
    B --> B2["有解条件: gcd(a,n) | b"]
    B --> B3["d = gcd(a,n) 个不同解"]
    B --> B4["MODULAR-LINEAR-EQUATION-SOLVER"]

    C["<b>31.5 中国剩余定理 (CRT)</b>"] --> C1["两两互素模数"]
    C --> C2["构造性证明"]
    C --> C3["唯一解 mod N"]
    C --> C4["应用: RSA加速、大整数运算"]

    A --> B
    B --> C
    A5 --> B2

核心思想

31.3 模运算

模的定义与基本运算

给定正整数 ,对于任意整数 定义为 除以 的非负余数,即满足 的唯一整数 。模等价(同余)关系记为 ,其含义是

模加法。先计算普通加法 ,再取模。

模乘法。先计算普通乘法 ,再取模。

模幂运算。利用重复平方法(square-and-multiply),将指数 的二进制展开逐步计算,避免直接计算巨大的

模幂运算的逐步执行实例

计算

将指数 10 写成二进制:

步骤指数位当前结果 底数 操作
初始17
位 0(=0)01底数平方取模
位 1(=1)1乘入结果,底数平方取模
位 2(=0)010底数平方取模
位 3(=1)1乘入结果

最终结果:

验证:,故 。正确。

模运算的代数性质

集合 在模加法和模乘法下构成一个交换环。以下是关键性质:

性质加法乘法
封闭性,则 ,则
结合律
交换律
单位元
逆元每个 都有加法逆元 仅当 时存在乘法逆元
证明:模加法满足结合律

【结合律(逐项展开验证)】:需要证明

,其中 ,即

再设 ,其中 ,即

类似地,设 ,再设

由于普通整数加法满足结合律:,而模运算只是对同一整数取余,因此

证明:模乘法满足交换律

【交换律(利用整数乘法交换律)】:需要证明

由于 (整数乘法交换律),两者是同一个整数,取模后自然相等。

证明:乘法逆元存在的充要条件

【乘法逆元存在条件(利用 Bézout 等式)】 的乘法逆元存在当且仅当

充分性:若 ,由 31.1 初等数论与最大公约数 中的扩展欧几里得算法(EXTENDED-EUCLID),存在整数 使得 。两边取模 ,因此 就是 中的乘法逆元。

必要性:若 有乘法逆元 ,即 ,则 (某个整数 )。设 ,则 ,故 ,因此

定义 ,即 中所有与 互素的元素构成的集合。 在模乘法下构成一个交换群欧拉函数):

  • 封闭性:若 ,则
  • 结合律:继承自整数乘法的结合律。
  • 单位元
  • 逆元:每个元素都有模乘法逆元(由上述证明)。

的阶(元素个数)为 ,即 欧拉函数

实例。验证:,故

证明: 的封闭性

【封闭性(利用整除性质)】:若 ,则

证明:反证法。假设 ,则存在素数 使得 ,故 。由于 是素数且 ,由欧几里得引理,。若 ,则 ,与 矛盾。若 ,则 ,与 矛盾。因此

模运算的分配律

【分配律(连接加法与乘法的桥梁)】:模乘法对模加法满足分配律,即

证明(整数分配律),而模运算保持等价关系,故

分配律是 构成”环”(而非仅仅是”群”)的关键性质。它确保了模运算中的代数恒等式(如 )在模意义下依然成立。


31.4 求解模线性方程

问题定义

给定整数 ),求解满足 的所有

有解条件与解的个数

【有解条件(利用整除性)】:方程 有解当且仅当

证明 当且仅当存在整数 使得 ,即 。由 Bézout 定理, 能取到的所有值恰好是 的倍数。因此,方程有解当且仅当 的倍数,即

【解的个数(利用整除关系)】:若 ,则方程恰好有 个模 下不同的解,分别为 ,其中 是一个特解。

证明概要:设 。原方程等价于 ,其中 。此方程在模 下有唯一解 。在模 下, 恰好是 个不同的解。

MODULAR-LINEAR-EQUATION-SOLVER 伪代码

MODULAR-LINEAR-EQUATION-SOLVER(a, b, n)
 1  (d, x', y') ← EXTENDED-EUCLID(a, n)
 2  if d ∤ b
 3      return "无解"
 4  x'_0 ← x' × (b / d) mod (n / d)
 5  return (x'_0, x'_0 + n/d, x'_0 + 2n/d, ..., x'_0 + (d-1)n/d)

执行流程图:

flowchart TD
    A(["开始"]) --> B["输入 a, b, n"]
    B --> C["调用 EXTENDED-EUCLID(a, n)"]
    C --> D["获得 d, x', y'"]
    D --> E{"d 整除 b?"}
    E -->|"否"| F["返回 无解"]
    E -->|"是"| G["计算 x₀ = x' × (b/d) mod (n/d)"]
    G --> H["循环 i = 0 到 d-1"]
    H --> I["输出 x₀ + i×(n/d)"]
    I --> J{"i < d-1?"}
    J -->|"是"| K["i = i + 1"]
    K --> I
    J -->|"否"| L(["结束"])
    F --> L

算法解读

  • 第 1 行:调用 31.1 初等数论与最大公约数 中的扩展欧几里得算法,得到 以及满足 的系数
  • 第 2-3 行:检查有解条件。
  • 第 4 行: 两边乘以 ,得 ,故 是方程 的解。
  • 第 5 行:返回所有 个解。
逐步执行实例

求解

步骤 1:计算

,故

扩展欧几里得回代:,故 (因为 )。

步骤 2:检查 是否整除 ,有解。

步骤 3

步骤 4 个解:

验证?等一下——重新检查。

实际上 。问题出在哪里?

重新审视:

,故

验证:。正确!

两个解为

验证 。正确。


31.5 中国剩余定理(CRT)

定理陈述

【中国剩余定理(CRT)】:设 为两两互素的正整数(即对所有 ),则对任意整数 ,同余方程组

在模 下有唯一解。

构造性证明

【CRT 构造性证明(分步构造)】

步骤 1:定义 ,对每个 ,令

由于 两两互素,

步骤 2:对每个 ,利用扩展欧几里得算法求 的乘法逆元 ,即

步骤 3:构造解

步骤 4:验证。对任意 ,考察

时, 包含因子 (因为 互素且 包含 ),故 ,从而

时,,故

因此 ,对所有 成立。

步骤 5(唯一性):若 也是解,则 对所有 成立,即 。由于 两两互素,,故

逐步执行实例

求解方程组:

步骤 1

步骤 2:求各

  • ,求 (因为 )。
  • ,求
  • ,求

步骤 3

步骤 4

验证

这就是经典的”物不知数”问题(孙子定理),出自《孙子算经》。

CRT 的应用

1. 大整数运算加速

CRT 允许我们将大模数 上的运算分解为多个小模数 上的独立运算,最后再合并结果。由于模 的运算中中间结果更小,计算速度更快。

2. RSA 解密加速

在 RSA 中,私钥持有者知道 的因子分解。解密时,不用直接计算 是一个大数),而是分别计算:

然后用 CRT 合并得到 。由于 各约 的一半大小,模幂运算的复杂度从 降为 ,实现约 4 倍加速


补充理解

模运算的代数结构:从环到域

模运算不仅仅是”取余数”的简单操作,它在抽象代数中拥有丰富的结构。集合 在模加法和模乘法下构成一个交换环(commutative ring),满足加法交换群、乘法半群和分配律。当 为素数 时, 中每个非零元素都有乘法逆元,此时 构成一个有限域(finite field),记为 。有限域是现代密码学(如 AES、椭圆曲线密码)的数学基础。

参考阅读:Modular Arithmetic - Wikipedia

中国剩余定理的历史渊源:孙子定理

中国剩余定理的历史可以追溯到公元 3 世纪的中国数学家孙子(Sun Tzu,非《孙子兵法》作者)。在《孙子算经》中,孙子提出了著名的”物不知数”问题:“今有物,不知其数。三三数之剩二,五五数之剩三,七七数之剩二。问物几何?“这恰好是方程组 。孙子给出了答案 23,但未提供一般性证明。直到 13 世纪,秦九韶在《数书九章》中提出”大衍求一术”,才给出了完整的算法。该定理在西方由欧拉(Euler, 1743)和高斯(Gauss, 1801)独立发现并严格证明。

参考阅读:Historical Development of the Chinese Remainder Theorem - Harvard

CRT 在 RSA 加速中的应用

RSA 解密的标准方法是对密文 计算 ,其中 是两个大素数的乘积。利用 CRT,可以将这个大模数运算分解为两个小模数运算:先分别计算 (其中 ),再通过 Garner 算法或标准 CRT 合并得到 。由于模幂运算的时间复杂度约为 为模数的比特长度),分解后两个 比特的运算总代价为 ,相比直接运算获得约 4 倍加速。实际 RSA 实现中几乎都采用 CRT 优化。

参考阅读:Fast Variants of RSA - NMSU

模幂运算伪代码(MODULAR-EXPONENTIATION)

CLRS 中给出的重复平方法伪代码如下:

MODULAR-EXPONENTIATION(a, b, n)
 1  c ← 0
 2  d ← 1
 3  设 b 的二进制表示为 ⟨b_k, b_{k-1}, ..., b_1, b_0⟩
 4  for i ← k downto 0
 5      c ← 2 × c
 6      d ← (d × d) mod n
 7      if b_i = 1
 8          c ← c + 1
 9          d ← (d × a) mod n
10  return d

执行流程图:

flowchart TD
    A(["开始"]) --> B["输入 a, b, n"]
    B --> C["初始化 c=0, d=1"]
    C --> D["设 b 的二进制为 b_k...b_0"]
    D --> E["i = k"]
    E --> F{"i >= 0?"}
    F -->|"否"| G["返回 d"]
    F -->|"是"| H["c = 2 × c"]
    H --> I["d = (d × d) mod n"]
    I --> J{"b_i == 1?"}
    J -->|"是"| K["c = c + 1"]
    K --> L["d = (d × a) mod n"]
    L --> M["i = i - 1"]
    J -->|"否"| M
    M --> F
    G --> N(["结束"])

算法解读

  • 变量 追踪当前已处理的指数部分(始终满足 ),变量 维护
  • 第 5-6 行:将指数左移一位(乘以 2),同时将结果平方。
  • 第 7-9 行:若当前二进制位为 1,则将 乘入结果。
  • 时间复杂度: 次模乘法,每次模乘法代价为 (使用学校乘法),总复杂度
模幂运算逐步执行实例(对照伪代码)

计算

ib_ic(更新前)c(更新后)d(更新前)d(更新后)
3101
2017
11210

等一下,重新计算:

ib_ic(更新后)d(更新后)
311
202
115
0010

最终 ,即 。与前文结果一致。

参考阅读:Fast Variants of RSA - NMSU

模线性方程求解的几何直观

模线性方程 可以从几何角度理解:在整数格点(lattice)上,方程 描述了一条直线,我们需要找到这条直线上所有整数坐标点 。由于 ,直线 上相邻整数点的 坐标间距恰好为 。当 时,直线经过整数格点,解的周期性反映了模运算的”循环”本质。这种几何视角有助于理解为什么解恰好有 个且等间距分布。

参考阅读:Geometry of Equations - Number Theory in Context


易混淆点

模加法逆元 ≠ 模乘法逆元

中,每个元素 都有加法逆元 (因为 ),但乘法逆元仅当 时才存在。例如在 中, 的加法逆元是 ),但 没有乘法逆元(因为 )。切勿将两者混淆。

CRT 要求模数两两互素

中国剩余定理的标准形式要求模数 两两互素。如果模数不互素,方程组可能无解(即使每个方程单独有解),或者解不唯一。例如 :由第一个方程 ,代入第二个 ,即 ,但 ,无解。对于不互素的情况,需要使用 CRT 的推广版本(generalized CRT),通过逐步合并方程并检查一致性条件来处理。

模运算中"除法"等价于乘以模逆元,但模逆元不一定存在

在模运算中,不能直接”除以”一个数。例如,从 不能直接得出 ,因为 中没有乘法逆元。正确做法是使用 31.4 节的方法:,有两个解 。只有在 时,才能安全地”两边除以 “(即乘以 )。


习题精选

题号题目描述难度
31.3-3证明模运算等式 ★★☆
31.3-5证明等比数列模n求和公式★★★
31.4-2求解模线性方程 ★★☆
31.5-2利用CRT求解同余方程组★★★

习题 31.3-3

题目:证明对于所有正整数 和所有整数 ,有

习题 31.3-5

题目:证明对于任意正整数 ,如果 ,则

习题 31.4-2

题目:找出方程 的所有解。

习题 31.5-2

题目:找出满足以下同余方程组的最小非负整数:


视频学习指南

主题推荐资源时长难度说明
模运算基础3Blue1Brown - Modular Arithmetic~15 min入门直观理解模运算的几何意义(时钟模型)
模幂运算MIT 6.006 Lecture 12~20 min中等重复平方法的实现与复杂度分析
与欧拉函数Michael Penn - The Group of Units~12 min中等从群论视角理解模乘法逆元
模线性方程求解Michael Penn - Linear Congruences~15 min中等完整求解过程与实例演示
中国剩余定理3Blue1Brown - CRT~18 min入门CRT 的几何直觉与构造性证明
CRT 与 RSAChristof Paar - RSA CRT~25 min进阶CRT 加速 RSA 解密的工程实现

教材原文

定理 31.20(中国剩余定理) 为两两互素的正整数,定义 。则对任意整数 ,关于未知量 的同余方程组

在模 下有唯一解。

——CLRS 第 4 版,第 31.5 节

定理 31.17 方程 对未知量 有解,当且仅当 ,其中

——CLRS 第 4 版,第 31.4 节

推论 31.21 如果 两两互素,且 ,则对所有整数

当且仅当

——CLRS 第 4 版,第 31.5 节


参见Wiki

第31章-数论算法 模运算