相关笔记: 4.1 整除与模运算 | 4.3 素数与最大公约数

概览

本节介绍了整数的进制表示以及基于二进制表示的整数运算算法。首先,我们证明了任意正整数都可以唯一地表示为任意基数 的展开式,并给出了进制转换的具体算法。然后,我们详细描述了二进制加法、乘法算法,分析了它们的位运算复杂度。最后,我们介绍了密码学中至关重要的模幂算法(快速幂),它利用指数的二进制展开,将计算 的时间复杂度从 降至 级别。

  • 基数展开定理,其中
  • 进制转换算法:反复除以基数 ,余数从右到左构成目标进制表示
  • 二进制/八进制/十六进制互转:每3位二进制对应1位八进制,每4位对应1位十六进制
  • 二进制加法 位运算,逐位相加并处理进位
  • 二进制乘法 位运算,利用分配律将乘法分解为移位与加法
  • 模幂算法(快速幂): 位运算,利用反复平方法

一、知识结构总览

graph TB
    A["4.2 整数表示与算法<br/>Integer Representations and Algorithms"] --> B["整数的基数表示"]
    A --> C["进制转换算法"]
    A --> D["二/八/十六进制互转"]
    A --> E["整数运算算法"]
    A --> F["模幂算法(快速幂)"]

    B --> B1["Theorem 1:基数展开定理"]
    B --> B2["二进制 Binary"]
    B --> B3["八进制 Octal"]
    B --> B4["十六进制 Hexadecimal"]

    C --> C1["Algorithm 1:构造b进制展开"]
    C --> C2["反复除以b取余法"]
    C --> C3["贪心算法视角"]

    D --> D1["二进制 ↔ 八进制:3位一组"]
    D --> D2["二进制 ↔ 十六进制:4位一组"]
    D --> D3["Table 1:0-15对照表"]

    E --> E1["Algorithm 2:二进制加法 O(n)"]
    E --> E2["Algorithm 3:二进制乘法 O(n²)"]
    E --> E3["Algorithm 4:div和mod计算"]

    F --> F1["朴素方法:O(n)次乘法"]
    F --> F2["快速幂:反复平方法"]
    F --> F3["Algorithm 5:O(log²m · log n)"]

二、核心思想

核心思想

本节的核心思想是进制表示(base representation)与算法复杂度(algorithm complexity)的结合。任意正整数都可以唯一地表示为任意基数 的多项式展开,这为计算机使用二进制表示数据提供了理论基础。在此基础上,我们关注的不是算法”能不能算”,而是”算得有多快”——二进制加法需要 次位运算,乘法需要 次,而模幂运算通过反复平方法(successive squaring)将朴素方法的 次乘法降低到 次,这一技巧是密码学中 RSA 等算法能够高效运行的关键。

1. 整数的基数表示(Representations of Integers)

基数展开定理(Theorem 1)

为大于 的整数。若 为正整数,则 可以唯一地表示为

其中 为非负整数, 为满足 的非负整数,且

  • 该表示称为 的== 进制展开==(base expansion),记作
  • 证明可用数学归纳法(见第5章)

二进制转十进制

八进制转十进制

十六进制转十进制

其中

2. 进制转换算法(Base Conversion)

进制转换算法(Algorithm 1)

将十进制正整数 转换为 进制表示的方法:

  1. 除以 ,得商 和余数 ), 是最低位
  2. 除以 ,得商 和余数 是次低位
  3. 重复此过程,直到商为
  4. 余数序列 (从最后一次到第一次)构成 进制表示

伪代码

procedure base_b_expansion(n, b)
    q := n; k := 0
    while q ≠ 0
        a_k := q mod b
        q := q div b
        k := k + 1
    return (a_{k-1}, ..., a_1, a_0)

十进制转八进制

转换为八进制:

  • ,余数
  • ,余数
  • ,余数
  • ,余数
  • ,余数

十进制转十六进制

转换为十六进制:

  • ,余数
  • ,余数
  • ,余数
  • ,余数
  • ,余数

十进制转二进制

转换为二进制:

3. 二进制、八进制、十六进制互转

二/八/十六进制快速互转

  • 每位八进制数字对应3位二进制数字
  • 每位十六进制数字对应4位二进制数字
  • 转换方法:将二进制按3位(八进制)或4位(十六进制)分组,不足的在左边补零

进制互转

二进制转八进制和十六进制

  • 按3位分组:
  • 按4位分组:

八进制转二进制

十六进制转二进制

4. 二进制加法算法(Addition Algorithm)

二进制加法(Algorithm 2)

给定两个 位二进制数

  1. 从最低位开始,逐位相加:,其中 为进位, 为结果位
  2. 初始进位
  3. 最终进位 作为最高位

复杂度:每次位加法需要2次位运算,共 位,总计 次位运算。

二进制加法

计算

结果:(验证: ✓)

5. 二进制乘法算法(Multiplication Algorithm)

二进制乘法(Algorithm 3)

给定两个 位二进制数

  1. 利用分配律:
  2. ,则部分积 左移 位;若 ,则
  3. 将所有部分积相加得到最终结果

复杂度

  • 移位次数:
  • 加法次数: 次加法,每次 位运算,总计
  • 总复杂度: 位运算

二进制乘法

计算

  • 求和:

验证:

更高效的乘法算法

传统的 乘法算法并非最优。第8.3节将介绍的 Karatsuba 算法只需 次位运算,而 Schonhage-Strassen 算法可达 。这些算法展示了算法设计对计算效率的巨大影响。

6. div 和 mod 的计算(Algorithm 4)

计算 div 和 mod(Algorithm 4)

给定整数 和正整数 ,计算

  1. 时,反复执行
  2. ,则

复杂度:当 时,需要 次位运算。更高效的算法只需 次位运算。

7. 模幂算法(Modular Exponentiation)

快速幂算法(Algorithm 5)

计算 ,其中 为大整数:

核心思想:利用指数 的二进制展开 ,将 分解为:

算法步骤

  1. 预计算 ),通过反复平方法:
  2. 对应的项相乘,每次乘法后取模

伪代码

procedure modular_exponentiation(b, n, m)
    x := 1
    power := b mod m
    for i := 0 to k-1
        if a_i = 1 then x := (x · power) mod m
        power := (power · power) mod m
    return x

复杂度:只需 次乘法,每次乘法 位运算,总计 位运算。

快速幂计算

,共10位。

初始:

操作
00不乘1
10不乘1
2181
30不乘81
40不乘81
50不乘81
60不乘81
71471
80不乘471
9136

结果:

为什么需要快速幂

在密码学(如RSA)中,我们需要计算 ,其中 可能是数百位的大整数。如果先计算 再取模, 的位数可能达到 位,远超计算机内存容量。快速幂算法通过”边乘边取模”的策略,始终保持中间结果不超过 ,在时间和空间上都实现了巨大的节省。


三、补充理解与易混淆点

补充理解

补充1:"算法"一词的历史渊源

英文单词”algorithm”(算法)源于波斯数学家花拉子密(al-Khwarizmi, 约780—850)的名字。花拉子密在其著作中系统描述了印度-阿拉伯数字的算术运算步骤,这些步骤正是最早的”算法”。有趣的是,本节讨论的二进制加法和乘法算法,正是历史上最早被称为”算法”的计算过程(Knuth, 1997, Vol. 1)。在计算机科学中,“算法”一词的含义已经远远超出了算术运算的范畴,但其核心——精确的、有限的、机械化的步骤序列——始终未变。

来源:Knuth, D. E. (1968). The Art of Computer Programming, Vol. 1: Fundamental Algorithms. Addison-Wesley, Section 1.1. 来源:Rosen, K. H. (2019). Discrete Mathematics and Its Applications (8th ed.), McGraw-Hill, Section 4.2.

补充2:快速幂的广泛应用

快速幂(反复平方法)是计算机科学中最重要的算法技巧之一,应用远超密码学。在竞赛编程中,快速幂是必学的基础算法;在大整数运算中,Python 的 pow(base, exp, mod) 内置函数就使用了快速幂;在矩阵快速幂中,同样的技巧可以用于 时间内计算矩阵的 次幂,从而高效求解线性递推关系(如斐波那契数列的第 项);在多项式求值中,Horner 法则与快速幂思想类似。快速幂的核心洞察是: 的二进制表示只有 位,因此只需 次平方运算就能覆盖所有可能的幂次(Cormen et al., 2009, Ch. 31)。

来源:Cormen, T. H., et al. (2009). Introduction to Algorithms (3rd ed.), MIT Press, Section 31.6. 来源:Knuth, D. E. (1997). The Art of Computer Programming, Vol. 2: Seminumerical Algorithms (3rd ed.), Addison-Wesley, Section 4.6.3.

易混淆点

误区1:进制转换时余数的排列顺序

  • ❌ 将十进制转 进制时,把余数从先到后(从左到右)排列
  • ✅ 余数应从后到先(从最后一个余数到第一个余数)排列,即第一个余数是最低位
  • 例如: 转八进制,余数依次为 ,结果为 而非
  • 记忆方法:先得到的余数是”个位”,最后得到的是”最高位”

误区2:快速幂中 power 的更新时机

  • ❌ 在判断 之前先更新 power
  • ✅ 正确顺序:先判断当前位 ,若为 则乘入 然后再更新 power(平方)
  • 因为 对应的是 ,所以第 步时 power 应为
  • 在 Algorithm 5 中,power 的初始值为 ,每次循环末尾平方得到

四、习题精选

习题概览

题号范围核心考点难度
1-2十进制转二进制
3-4二进制转十进制
5-6八进制与二进制互转
7-9十六进制与二进制互转
10-12二进制转十六进制
13-16证明二/八/十六进制互转的正确性⭐⭐
17-20进制转换综合题⭐⭐
21-24二/八/十六进制下的加法和乘法⭐⭐
25-28快速幂计算⭐⭐
29二进制展开的唯一性证明⭐⭐⭐
30平衡三进制展开⭐⭐⭐
31-32整除性与数字和的关系⭐⭐⭐
33二进制数字和与整除性⭐⭐⭐
34-35十进制展开判断整除性⭐⭐
36-37b进制展开的位数公式⭐⭐
38-39等比数列求和与进制展开⭐⭐⭐
40-51补码与反码表示⭐⭐⭐

题1:十进制转二进制

题目

将十进制数 转换为二进制。

题2:二进制转十进制

题目

转换为十进制。

题3:快速幂计算

题目

使用快速幂算法计算

题4:进制互转

题目

分别转换为八进制和十六进制。

解题思路提示

进制转换与快速幂的解题方法论:

  1. 十进制转 进制:反复除以 取余,余数从后到前排列
  2. 进制转十进制:按位展开为 的幂次和
  3. 二/八/十六互转:利用3位或4位分组,对照 Table 1
  4. 快速幂:将指数写为二进制,逐位扫描,遇 则乘入当前 power
  5. 注意:快速幂中每次乘法后都要取模,防止数值溢出

题5:证明二进制展开的位数公式

题目

证明:若 为正整数且 ,则 进制表示有 位。


五、视频学习指南

视频资源

资源链接对应内容备注
Rosen 8e Section 4.2教材原文完整定义、定理与例题英文教材
Base Conversion链接进制转换基础Khan Academy
Fast Modular Exponentiation链接快速幂算法Khan Academy

六、教材原文

教材原文

“Integers can be expressed using any integer greater than one as a base, as we will show in this section. Although we commonly use decimal (base 10), representations, binary (base 2), octal (base 8), and hexadecimal (base 16) representations are often used, especially in computer science.”

“In cryptography it is important to be able to find efficiently without using an excessive amount of memory, where , , and are large integers. It is impractical to first compute and then find its remainder when divided by , because can be a huge number and we will need a huge amount of computer memory to store such numbers.”

“As mentioned in Section 3.1, the term algorithm originally referred to procedures for performing arithmetic operations using the decimal representations of integers.”


参见 Wiki

数论与密码学