概览
本节展示了同余在计算机科学和日常生活中的三个重要应用:哈希函数(hashing functions)用于在计算机中高效地分配和检索文件存储位置;伪随机数生成(pseudorandom number generation)利用线性同余法产生具有随机性质的数列;校验码(check digits)用于检测标识号码中的错误,广泛应用于 ISBN、UPC 等编码系统中。这三个应用共同体现了数论从”纯数学”到”实用工具”的跨越。
- 哈希函数 :将关键字映射到 个存储位置,处理冲突用线性探测
- 线性同余法 :生成伪随机数列,参数选择影响质量
- 纯乘法生成器: 的特例,如 ,
- 奇偶校验位 :检测奇数个错误
- UPC 校验码:
- ISBN-10 校验码:,可检测单错误和邻位交换错误
一、知识结构总览
graph TB A["4.5 同余的应用<br/>Applications of Congruences"] --> B["哈希函数 Hashing Functions"] A --> C["伪随机数生成 Pseudorandom Numbers"] A --> D["校验码 Check Digits"] B --> B1["h(k) = k mod m"] B --> B2["冲突 Collision"] B --> B3["线性探测 Linear Probing"] B --> B4["双重哈希 Double Hashing"] C --> C1["线性同余法 Linear Congruential"] C --> C2["参数:模m, 乘数a, 增量c, 种子x₀"] C --> C3["纯乘法生成器 c=0"] C --> C4["周期与质量"] D --> D1["奇偶校验位 Parity Check"] D --> D2["UPC校验码 Universal Product Code"] D --> D3["ISBN-10校验码"] D --> D4["ISBN-13校验码"] D --> D5["错误检测能力分析"]
二、核心思想
核心思想
本节的核心思想是同余的实用化:将前几节建立的模运算理论转化为解决实际问题的工具。哈希函数利用 将大范围的键值压缩到小范围的存储位置;伪随机数生成器利用递推公式 产生看似随机的数列;校验码利用加权求和取模来检测输入错误。三者的共同数学基础都是模运算,但各自对参数的选择有特殊要求——哈希函数要求均匀分布,伪随机数要求长周期和统计性质,校验码要求能检测特定类型的错误。
1. 哈希函数(Hashing Functions)
哈希函数
哈希函数 将记录的关键字 映射到存储位置 。最常用的哈希函数是:
其中 为可用的存储位置数。
- 哈希函数应易于计算,以便快速定位文件
- 哈希函数应是满射(onto),使所有存储位置都可能被使用
- 满足这两个要求
哈希函数分配存储位置
设哈希函数 ,为以下社保号分配存储位置:
- (与第一个冲突!)
冲突与线性探测
当两个不同的关键字被映射到同一存储位置时,称为冲突(collision)。
线性探测(linear probing)是最简单的冲突解决方法:
即从初始位置开始,依次检查后续位置,直到找到空闲位置。
在上例中, 的初始位置 已被占用,检查位置 为空闲,故分配到位置 。
其他冲突解决方法
除线性探测外,还有多种冲突解决策略:
- 双重哈希(double hashing):,其中
- 链地址法(chaining):每个存储位置维护一个链表
- 再哈希(rehashing):使用第二个哈希函数确定探测步长
2. 伪随机数生成(Pseudorandom Numbers)
线性同余法(Linear Congruential Method)
选择四个整数参数:
- 模 (modulus)
- 乘数 (multiplier),
- 增量 (increment),
- 种子 (seed),
递推生成伪随机数列 :
所有 满足 。若需要 区间的伪随机数,使用 。
线性同余法生成伪随机数
参数:,,,。
递推公式:。
计算 0 3 种子 1 7 2 8 3 6 4 1 5 2 6 0 7 4 8 5 9 3 因为 ,序列开始重复。周期为 ,遍历了 的所有值。
纯乘法生成器(Pure Multiplicative Generator)
当 时,线性同余法退化为纯乘法生成器:
广泛使用的参数:(Mersenne 素数),。
在此参数下,可以生成 个数后才重复,周期极长。
伪随机数的局限性
线性同余法生成的伪随机数虽然计算快速,但存在以下局限:
- 序列是确定性的,给定种子即可完全预测
- 不具备真正随机数的所有统计性质
- 不适合用于密码学等安全敏感的场景
- 对于大规模模拟等需要高质量随机数的任务,应使用其他方法
3. 校验码(Check Digits)
3.1 奇偶校验位(Parity Check Bits)
奇偶校验位
对于 位比特串 ,奇偶校验位定义为:
- 若前 位中有奇数个 ,则
- 若前 位中有偶数个 ,则
- 可以检测奇数个错误,但不能检测偶数个错误
奇偶校验验证
接收到的比特串(最后一位为校验位):
- :前7位中 的个数为 (偶数),校验位 。… 等等,重新计算:(奇数),校验位应为 。实际校验位为 ,正确。
- :前7位中 的个数为 (奇数),校验位应为 。实际校验位为 ,,错误。
3.2 UPC 校验码(Universal Product Code)
UPC 校验码
UPC 是12位十进制数字 ,其中前11位标识商品,第12位为校验位。校验位满足:
即奇数位乘以 ,偶数位不变,加权求和后模 应为 。
UPC 校验码计算与验证
(a) 前11位为 ,求校验位: 要求 ,故 ,校验位为 。
(b) 验证 是否为有效 UPC: 故 不是有效 UPC。
3.3 ISBN-10 校验码
ISBN-10 校验码
ISBN-10 是10位编码 ,其中 为校验位(可以是 — 或 , 代表 )。校验位满足:
即第 位乘以权重 ,加权求和后模 应为 。
ISBN-10 校验码计算与验证
(a) 前9位为 ,求校验位: 故校验位 。
(b) 验证 是否为有效 ISBN-10: 故 不是有效 ISBN-10。
ISBN-10 能检测单错误和邻位交换错误
单错误检测:设有效 ISBN-10 被印错为 ,其中仅第 位出错,(,)。则 因为 ()且 (),故 ,因此 ,检测到错误。
邻位交换检测:设第 位和第 位()被交换,。则 因为 ()且 (,),故 ,检测到错误。
三、补充理解与易混淆点
补充理解
补充1:哈希函数的设计原则与实际应用
哈希函数是计算机科学中最重要的基础数据结构之一。除了本节介绍的除法法 外,常见的哈希函数还包括折叠法(folding method):将关键字分成等长的几段,将各段相加后取模。例如,对关键字 ,可分为 ,再取模。在实际的哈希表实现中(如 Java 的 HashMap、Python 的 dict), 通常选择素数或 的幂,以减少冲突。当冲突频繁时,还需要动态扩容(rehashing)。Donald Knuth 在《The Art of Computer Programming》Vol. 3 中对哈希技术有详尽的分析(Knuth, 1997, Vol. 3, Sec. 6.4)。
- Hash Function (Wikipedia) — 哈希函数的全面介绍
- Hash Tables (Khan Academy) — 哈希表的交互式教程
来源:Knuth, D. E. (1997). The Art of Computer Programming, Vol. 3: Sorting and Searching (2nd ed.), Addison-Wesley, Section 6.4. 来源:Cormen, T. H., et al. (2009). Introduction to Algorithms (3rd ed.), MIT Press, Chapter 11.
补充2:校验码的数学原理——为什么选模11
ISBN-10 选择模 而非模 是一个精妙的数学选择。模 的校验码(如 UPC)能检测所有单错误,但不能检测所有邻位交换错误——当被交换的两位之差为 的倍数时,模 的校验和不变。而模 中,因为 是素数,只要 且 (对 ISBN-10 总是成立),就能保证 ,从而检测到所有邻位交换。这就是为什么 ISBN-10 的校验能力优于 UPC 的校验能力。ISBN-13(2007年引入)改用模 ,但通过更复杂的权重方案( 交替)弥补了这一不足(GS1, 2005)。
- ISBN (Wikipedia) — ISBN 的历史与格式
- Check Digit Schemes (Math Pages) — 各种校验码方案的数学分析
来源:Rosen, K. H. (2019). Discrete Mathematics and Its Applications (8th ed.), McGraw-Hill, Section 4.5. 来源:Gallian, J. A. (2017). Contemporary Abstract Algebra (9th ed.), Cengage Learning, Section 0.
易混淆点
误区1:哈希函数的模数选择
- ❌ 认为哈希函数的模数 可以任意选择
- ✅ 的选择对哈希表的性能有重大影响:
- 应为素数,以减少冲突的聚集效应
- 不应为 的幂,否则哈希值只取决于关键字的低位
- 不应太接近 或 ,否则具有特定模式的关键字容易冲突
- 例如:(本节例子)不是素数(),实际应用中应选择如 、 等素数
误区2:伪随机数与真随机数的区别
- ❌ 认为线性同余法生成的序列是”真正的随机数”
- ✅ 线性同余法生成的是伪随机数(pseudorandom numbers),具有以下特征:
- 完全确定性:给定种子,整个序列唯一确定
- 有限周期:序列最终一定会重复
- 可预测性:如果知道参数和足够多的输出,可以预测后续值
- ✅ 真随机数需要物理噪声源(如放射性衰变、热噪声等)
- ✅ 对于密码学应用,必须使用密码学安全的伪随机数生成器(CSPRNG)
四、习题精选
习题概览
题号范围 核心考点 难度 1-2 哈希函数分配存储位置 ⭐ 3 哈希函数应用(停车场) ⭐⭐ 4 双重哈希解决冲突 ⭐⭐⭐ 5-7 线性同余法生成伪随机数 ⭐ 8 伪随机数生成算法伪代码 ⭐⭐ 9-10 中平方法生成伪随机数 ⭐⭐ 11-12 幂生成器 ⭐⭐ 13-14 奇偶校验位验证 ⭐ 15-17 ISBN-10 校验码计算与验证 ⭐⭐ 18-23 USPS 汇款单校验码 ⭐⭐ 24-27 UPC 校验码计算、验证与错误检测 ⭐⭐ 28-31 航空机票校验码 ⭐⭐⭐
题1:哈希函数分配存储位置
题目
使用哈希函数 ,为以下社保号分配存储位置: (a) ;(b) ;(c) ;(d) 。
解答
(a) (因为 … 需精确计算)
直接计算:,,,,,。
故 。
(b) 。,,。
故 。
(c) 。,,,,… 重新计算:,,… 取 。
故 。
(d) 。,,,,,。
故 。
题2:线性同余法生成伪随机数
题目
使用线性同余生成器 ,种子 ,生成伪随机数序列。
解答
计算 0 1 种子 1 5 2 4 3 1 因为 ,序列开始重复。
生成序列:,周期为 。
题3:UPC 校验码计算
题目
求以下 UPC 前11位对应的校验位:(a) ;(b) 。
解答
(a) : 要求 ,故 ,校验位为 。
(b) : 要求 ,故 ,校验位为 。
题4:ISBN-10 校验码验证
题目
验证 (其中 为一位数字)是否为有效 ISBN-10,并求 的值。
解答
ISBN-10 各位:,校验位 。
要求 :
要求 :
求 模 的乘法逆元:,故 。
因为 是一位数字(),故 。
解题思路提示
同余应用的解题方法论:
- 哈希函数:直接计算 ,注意冲突处理
- 伪随机数:按递推公式逐步计算,注意周期检测(当 重复时停止)
- UPC 校验码:奇数位乘 、偶数位不变,加权求和模 为
- ISBN-10 校验码:第 位乘 ,加权求和模 为 ,注意校验位可以是 ()
- 验证校验码:将所有位代入公式,检查同余式是否成立
- 求校验码:设校验位为未知数,解同余方程
题5:ISBN-10 错误检测能力证明
题目
证明 ISBN-10 的校验码方案可以检测出任何单个数字的错误。
解答
设 是有效的 ISBN-10,即 。
假设在印刷时第 位发生错误,变为 ,其中 ,(因为每位数字范围是 — 或 ,所以 ),其余位不变。
错误码的校验和为:
因为原码有效:,故
因为 ,所以 。 因为 且 ,所以 。 因此 ,即 。
故 ,错误码不是有效的 ISBN-10,检测到错误。
五、视频学习指南
视频资源
六、教材原文
教材原文
“Congruences have many applications to discrete mathematics, computer science, and many other disciplines. We will introduce three applications in this section: the use of congruences to assign memory locations to computer files, the generation of pseudorandom numbers, and check digits.”
“Constructing sequences of random numbers is important for randomized algorithms, for simulations, and for many other purposes. Constructing a sequence of truly random numbers is extremely difficult, or perhaps impossible, because any method for generating what are supposed to be random numbers may generate numbers with hidden patterns.”
“Remember that the check digit of an ISBN-10 can be an X!”