Ran Wei/数学系列
English
计算机科学与人工智能的数学基础 — Ran Wei

模运算与计算中的代数

计算最大公因数,证明模除法条件,跟踪重复平方,区分整数环、素数域、机器字与校验和结论。

8 小时4 个时段3 个实验12 道练习与 2 道拓展10 道自测题

完成后你能够

  • 明确域使用整除、唯一商余数与素因子论证。
  • 计算欧几里得及扩展跟踪,验证贝祖恒等式。
  • 证明模逆存在条件并解小线性同余。
  • 解释重复平方正确性、费马条件与互素 CRT 例子。
  • 区分群、环、域、二进制运算与有限校验和证据。

开始之前

模块 01 与 04:整数运算、函数、归纳、不变式与终止。核心不要求图或计数模块。

目录

学习计划

8 小时

时间包含练习,是估计值;可按需要拆分时段。可选拓展练习额外需要 35 分钟。进度保存在当前浏览器,中英文版本共享。

1

除法需要定义域与逆元

时钟加小时会绕固定循环,模运算把同一思想用于所有整数,包括负数。加乘仍良定义,除法却不同:非零剩余类可能无逆元。实数上合法的约去步骤可把真同余变成假结论。

本课连接整数整除与合法模运算,推导欧几里得不变式,计算贝祖证书,识别可逆类,跟踪快速幂,区分群、环、域。最后区分二进制域算术与机器字算术,并明确小校验和实际能建立什么。

回忆检查:操作整数等式、展开有限积、解释不变式与递减整数变式。按需复习模块 01、模块 04。核心不要求图或计数模块。除另声明外,模数都是整数 m≥2。

2

整除、素数与唯一商余数

整数 a,b 的 a 整除 b,写 a|b,表示存在整数 k 使 b=ak。这是整数域存在命题,不表示 a/b 为整数,也不要求 b 大于 a。例如 3|−12,因为 −12=3·(−4)。每整数整除零,零只整除零。后面的素数与 gcd 定义避免把特殊零情况与正因数混淆。

若 a|b 且 a|c,则 a 整除任意整数线性组合 xb+yc:代 b=as,c=at 得 a(xs+yt)。若 a|b,b|c,乘见证得 a|c。它们说明减去另一整数的整数倍为何保共同因数。系数必须整数,任意实数组合不保持整除。

带余除法定理:任意整数 a 与正整数 m,唯一整数 q,r 满足 a=qm+r,0≤r<m。名称中的“算法”指商余性质,不要求特定实现。存在证明取 q=floor(a/m),r=a−qm,取整不等式给余数范围,包括负 a。

唯一性:若 qm+r=q′m+r′ 且两余数合范围,则 (q−q′)m=r′−r。右边绝对值小于 m,区间内唯一 m 倍数为零,因此 q=q′,r=r′。截断除法允许负余数等其他约定会改变表示规则;本数学代表与 Python 正整数模数的余数一致。

例题详解
负输入仍有非负代表

a=−17,m=7,q=−3,r=4,因为 −17=(−3)·7+4,0≤4<7。q=−2 会留 r=−3,是整数分解但不符合代表范围。正 17 的 q=2,r=3。按约定处理符号,不能无解释取绝对值。

唯一商余数十七个点分成两组七与余三,负十七对应商负三余四,均符合余数范围。带余除法:0 ≤ r < 777317 = 2 × 7 + 3−17 = (−3) × 7 + 4
图 8.1

两整组七与余三说明 17=2·7+3;负例须商 −3,才能余数在零到六。

素数为大于一的整数 p,正因数只有一与 p。大于一且非素数叫合数。一既非素也非合,负素数不在约定内。把大于一的正整数递归拆合因子成更小因子,直到全素;对整数作强归纳证明素因子分解存在。

算术基本定理还声明除顺序外唯一。关键引理:素数整除乘积就至少整除一个因子。下一节用贝祖说明。反复用引理把一分解的素数与另一分解相同素数匹配,约去该正整数因子并继续。存在与唯一是不同义务,列一种成功分解只证明该输入存在。

素分解是数学描述,不声称寻找任意巨大整数因子都快。小例用精确算术与初等论证。欧几里得不需要先分解两输入就能求 gcd,是不变式算法的优势。整数大小增长时要计位操作,不能把巨大积与除法当恒成本。

检验理解

按约定 −10 除三的唯一商余数?一是素数吗?5 整除零吗?

查看答案

−10=(−4)·3+2,q=−4,r=2。一非素,素数要求大于一。5|0,整数见证 k=0。

3

欧几里得、贝祖证书与终止

非负 a,b 不全零时,最大公因数 gcd(a,b) 是同时整除两者的最大正整数。共同正因数非空,且被非零输入界,故存在。a>0 时 gcd(a,0)=a。任意符号用 gcd(|a|,|b|)。全零无最大正公因数,软件常另约 gcd(0,0)=0。

若 a=qb+r,则 (a,b) 与 (b,r) 共同因数集合相同。a,b 的因数也除 r=a−qb;b,r 的因数也除 a=qb+r。故 gcd相等。欧几里得算法在 b 非零时反复把 (a,b) 换 (b,a modb),不变式是原 gcd 不变,而不只是余数递减。

终止由非负第二分量严格递减:非零 b 下 0≤r<b。非负整数不可能无限严格下降。b=0 时第一分量根据 gcd(a,0) 与不变式就是原 gcd。保持说明若停则正确,递减变式另证明一定停,与模块 04 一样两者都要。

例题详解
gcd(252,105) 与证书

252=2·105+42,105=2·42+21,42=2·21+0,所以 gcd=21。回代 21=105−2·42=105−2(252−2·105)=−2·252+5·105。系数 −2,5 证明恒等式。21 整除两输入,所有共同因数又整除这个线性组合,因此它是最大正公因数。

欧几里得与贝祖跟踪252、105 经余数 42、21、0,得到 gcd 二十一,贝祖系数负二与五。相同共同因数,第二分量严格降252 = 2 × 105 + 42105 = 2 × 42 + 2142 = 2 × 21 + 021 = −2 × 252 + 5 × 105回代给证书;不是只看猜测 gcd。
图 8.2

商余跟踪保共同因数集合,余数零结束;回代恢复贝祖系数。

贝祖恒等式说存在整数 x,y 使 ax+by=gcd(a,b)。扩展欧几里得跟踪两组系数,初始 a=1·a+0·b,b=0·a+1·b。第一行减 q 倍第二行时,余数与系数同步更新,再交换两行保表示不变式。最终非零余数因此携带具体证书。

系数通常不唯一。若 ax+by=d,对任意整数 t,把 x 改 x+(b/d)t、y 改 y−(a/d)t 保等式。实验返回其他系数仍可正确,要查实际等式与 gcd,而非硬要求特定对。零输入也有恒等式,全零软件约定返回零表示,并非最大正因数。

若 p 素且 p 不整除 a,则 gcd(p,a)=1,贝祖给 px+ay=1。若 p|ab,乘 b 得 pxb+aby=b,左两项都被 p 整除,故 p|b。这证 p|ab 蕴涵 p|a 或 p|b,支撑分解唯一性,没有假设任意合因数也有此性质。

例如 6|2·3,却不除 2 或 3,把“素数”改“任意整数”会假。精确假设在模约去再次重要,非零因子与和模数互素的因子不同。贝祖把互素变为逆元,允许合法约去。

欧几里得除法次数对较小正输入为对数。一种证明:第二分量每两次至少减半。首余 r≤b/2 已满足;若 r>b/2,下次 b 除 r 的余 b−r<b/2。此论证界余数步数,不证明每次长整数除法都恒时间。

检验理解

哪两个论证分别证明欧几里得正确与终止?−2,5 对 252,105 证实什么?

查看答案

共同因数保持给 gcd 不变式,非负第二分量严格下降给终止。−2·252+5·105=21 加 21 整除两输入,证明 gcd。

4

同余类与良定义运算

整数 a,b、固定 m≥2,模 m 同余 a≡b(modm)a\equiv b\pmod m 表示 m|(a−b),不是整数相等。同余因 m|0 自反,见证取负对称,可整除差相加传递。等价类包含相差 m 整数倍的所有整数。

a 的类写 [a]ₘ,含所有整数 k 的 a+km。带余定理给每类唯一零到 m−1 代表 a modm。因此 [−17]₇=[4]₇,但 −17 与四仍不同整数。类相等可以,不能替换成原整数相等。

定义类加乘 [a]+[b]=[a+b],[a][b]=[ab]。良定义要求不依赖代表。若 a′=a+km,b′=b+ℓm,和差为 (k+ℓ)m,积差为 m(kb+ℓa+kℓm),都可被 m 整除。故可先缩减操作数再算而不改最终剩余类。

例题详解
先取代表,结果仍同余

模七 17 代表三,−10 代表四。和七同余零,与 3+4 一致。积 −170 同余五,与 3·4=12≡5 一致。中间整数不同但类相同,约简保持小存储数且结果精确。

减法是加加法逆元:[a] 的加法逆为 [−a]。例如 −3 mod7=4,因为 3+4≡0,加法逆总存在。别与满足 ab≡1 而非 a+b≡0 的乘法逆元混淆,“逆”依选定运算,歧义时说明运算。

非负模幂是重复类乘,指数零取空积 [1]。这个代数约定使零基零指数算法也返一,并不解决所有分析中的 0⁰,仍需域声明。负指数要求乘法逆,不能为任意剩余类定义。

剩余类时钟中,加 a 是固定步数旋转,总为位置排列,因为减 a 可逆转。乘 a 则可能合并不同位置。模六一与四乘二都得二,下一节给乘法映射何时为排列的准确条件。

比较规范代表大小只是显示约定。a≡b 不意味着普通大小或符号一致,同样取模不保不等式:6<8,但 6 mod7=6 大于 8 mod7=1。同余支持经过证明的代数运算,不是所有整数操作。

{0,…,m−1} 常代指类本身,跨软件时应记解释。Python 的整数三在类型中不携带模数,程序必须一致应用模数。不同模数剩余类若无声明映射,不能仅因代表数字相同就混作一次模计算。

检验理解

−2 与五是整数相等还是模七同余?为何可先约简乘法操作数?不等式也可如此吗?

查看答案

整数不同但同类。代表变化使积只变模数倍,故良定义。不等式不保持,6<8 的代表六与一显示次序反向。

5

逆元、合法约去与线性同余

a 的模 m 乘法逆元为满足 ab≡1 的类,存在当且仅当 gcd(a,m)=1。必要:ab−1=km 即 ab−km=1,所有共同因数除一。充分:gcd 一时贝祖给 ax+my=1,x 即逆。这是双向定理,不是样例支持的经验。

例题详解
非零与可逆不同

模七 3·5=15≡1,故五是三的逆。模六二非零,但 gcd(2,6)=2 无逆;所有代表乘二得 0,2,4,0,2,4,从不到一。乘二合并输入对,模七乘三则排列所有剩余位置。

可逆与不可逆乘法映射模七乘三输出零三六二五一四各一次;模六乘二输出零二四零二四,无一。乘法是否能反转,由 gcd 决定3 × r mod 7001326324551642 × r mod 6001224304254模七乘三是排列;模六乘二重复输出。
图 8.3

可逆乘子排列剩余位置;不可逆乘子重复输出且到不了一。

逆若存在则类唯一。ab≡1,ac≡1 时乘 b 得 b≡c,等价于用已建立逆约去 a。扩展欧几里得可给三模七的逆 −2,规范代表 −2 mod7=5。唯一说类,不说该类所有整数代表只一个。

从 ax≡ay modm 约到 x≡y,在 gcd(a,m)=1 时可乘逆合法。无条件会失败:模六 2·1≡2·4,一与四却不同余。把普通整数代表除二不保原模数,这里剩的是 x≡y mod3,是更弱不同结论。

一般 d=gcd(a,m),m|a(x−y) 的整数整除式除 d 后,a/d 与 m/d 互素,贝祖约去给 (m/d)|(x−y)。因此约去后的模数应为 m/d。精确整数等式的除法与类求逆不同,写中间整除式可防除号隐藏区别。

线性同余 ax≡b modm 可解当且仅当 d=gcd(a,m) 整除 b。必要因 d 除 ax 与 m,故除 b。充分把 a,b,m 除 d,a/d 在模 m/d 可逆,得一个约简解 x₀。原模数代表解为 x₀+k(m/d),k=0,…,d−1;模 m 各不同,任意解与 x₀ 差 m/d 倍,故穷尽。

4x≡2 mod6 的 d=2,约简 2x≡1 mod3,二的逆是二,故 x≡2 mod3,原代表二与五。2x≡1 mod6 的 d 不除一,无解。方程可以零、一或多解,把非零系数都当唯一除数会丢掉区别。

d=m 时,如 a≡0,按 m 是否除 b 决定:b≡0 时每类都解 0x≡0,否则无解。约简模数一是平凡同余,不属于其他处 m≥2 的非平凡代数结构。应另说明,不能称模一类为通常非平凡域。

非零类有另一个非零类使乘积零,称零因子。模六二乘三零。素模 p 每非零都互素、可逆,无此对;零积乘逆会强迫另一因子零。这说明素模与合模的代数差别。

交互演示

改模数与乘子,读规范结果、逆存在性、乘法映射与欧几里得跟踪。上文具体例子可作静态替代。

检验理解

解 4x≡2 mod6,诊断模六约二。二的加法逆是什么,是否因此有乘法逆?

查看答案

解二、五。约二只给模三相等,非模六。二加法逆四,但 gcd(2,6)>1,所以无乘法逆。

6

快速幂、费马条件与互素重构

重复平方计算 aᴱ modm,E 为非负整数,避免 E 次连乘。维护结果 r、当前基 b、余指数 e,初始 1,a modm,E。不变式 rbᵉ≡aᴱ。e 奇时 r 乘 b,再 b 平方,e 取 floor(e/2)。偶 e=2k 得 r(b²)ᵏ,奇 e=2k+1 得 (rb)(b²)ᵏ,都与旧积同类。

正余指数严格下降,终止 e=0,不变式给 r≡aᴱ。零指数无迭代返一,按空积约定。每乘后约简保类且把存储代表限到 m−1,避免巨大未约简幂;乘法自身位成本仍随模数大小。

例题详解
跟踪 3¹³ 模七

循环头 (r,b,e) 依次 (1,3,13),(3,2,6),(3,4,3),(5,2,1),返回三。十三有四个二进制位,故四迭代。本实现最后也计平方,另每奇余指数计结果乘:四平方加三结果乘,共七模乘。跳过无用最后平方的实现会有不同精确数。

E>0 迭代数 floor(log₂E)+1,即二进制长度,每次至多两模乘,包含 E=0 边界为 O(log(E+1)) 次。这对指数数值是对数,对指数位长是线性,不是编码长度对数。大模数使每操作更贵,乘次数不是完整运行证明。

费马小定理:p 素且 p 不除 a 时 aᵖ⁻¹≡1 modp。证明乘 a 排列非零剩余类,因为 a 可逆。乘所有 p−1 输出得 aᵖ⁻¹(p−1)!≡(p−1)!,各阶乘因子非零可逆,乘积可约,余结论。

a 被 p 整除时上述非零结论假;常用全整数形式 aᵖ≡a 需分别处理零与非零类。合模一般不服素定理:2⁵ mod6=2 非一,连互素基五的 5⁵ mod6 也为五。某些合数会通过特定幂检查,因此单次成功不自动证明素性。

p 素、a 非零时逆可算 aᵖ⁻²,由乘 a 与费马推出。条件仍必要;扩展欧几里得对任意互素模数都适用,不要求素性。实验用 gcd 条件与 Python 精确模幂约定,不滥用素数公式。

中国剩余定理(CRT)对互素正模 m,n 声明:给定模 m 与模 n 剩余类,唯一确定模 mn 类。若 u 为 n 模 m 的逆,v 为 m 模 n 的逆,x=anu+bmv 在两模给 a,b。每项在一模消失,在另一模供所需代表。

例题详解
两个互素时钟重构一个类

解 x≡2 mod3,x≡3 mod5。写 x=2+3k,得 3k≡1 mod5。三逆二,故 k≡2 mod5,x≡8 mod15。直接查八余二与三。两解差都被三、五除,互素使十五也除,因此唯一组合类,不是所有整数中唯独八。

互素 CRT 的唯一类零到十四内模三余二集合与模五余三集合只有八相交。所有整数解八加十五整数倍。先限定代表范围:0 到 14x ≡ 2 (mod 3){2, 5, 8, 11, 14}x ≡ 3 (mod 5){3, 8, 13}x = 8无范围限制的全部解:8 + 15k,k 为整数。
图 8.4

零到十四内两余条件交于八。八加十五任意整数倍属同一组合类。

一般唯一性:m,n 均除差 Δ,写 Δ=mk,互素从 n|mk 约去 m 得 n|k,因此 mn|Δ。不互素时兼容条件改变,组合周期不一定 mn。例如 x≡0 mod2 与 x≡1 mod4 不可能,后一条件使数奇。互素构造不声称能处理这冲突。

检验理解

“aᵐ⁻¹≡1 modm”与“任意两余唯一组合模 mn”缺什么假设?例 CRT 唯一确定什么?

查看答案

费马形式要素 m 与非零 a 类;所述 CRT 要模数互素。确定 [8]₁₅,含所有 8+15k,而非无范围限制唯一整数。

7

群、环、域、二进制与校验和

代数结构指定集合、操作与律。群有封闭结合操作、单位元、每元素逆;操作交换叫阿贝尔群。整数加法为阿贝尔群,零单位,−a 为逆;整数乘法非群,零及多数整数无整数乘逆。

模 m 类在加法下为阿贝尔群。乘法下可逆元(units),即与 m 互素的类,形成群:一单位,可逆元积的逆由两逆相乘获得,逆仍可逆。合模全部非零类不一定成群,零因子可乘为零也缺逆。这里 unit 是可逆元素,不要与运算的 identity(单位元)混淆。

有单位元交换环有阿贝尔加法群,以及封闭、结合、交换、有单位元的乘法,对加法分配。本课非平凡环 1≠0,整数与模 m 类均例。良定义使加乘分配在取模后保持。环不承诺每非零可除,这是域多出的条件。

域是 1≠0 的交换环且每非零有乘逆。有理数、实数为域,整数非域,因二无整数逆。模 p 是域当且仅当 p 素:素 p 由 gcd 保逆;合 m=uv,1<u,v<m,非零 [u],[v] 积零,域不允许。

例题详解
比特运算与机器字运算不同

二元素域 1+1=0,1·1=1。单比特域加法是 XOR,乘法 AND。八位无符号整数加法却模 256,一加一为二,有普通进位,非零。逐位 XOR 是二元素域上的向量加法,与编码机器字的整数加法不同。

许多定宽无符号操作绕模 2ʷ,但表示与语言仍决定行为。模 256 环有零因子,16·16≡0,非域。Python 整数不自动定宽回绕,脚本需显式约简。这描述例子的模型,不声称覆盖每语言有符号溢出或每硬件指令。

校验和可取字节零到 255 的 c(values)=sum(values) mod7,输出七种类。同输入必同输出,所以不同校验和证明输入不同;同输出不证输入同。[1,2] 与 [0,3] 都三,反序 [2,1] 也三,把允许字节加七仍同剩余。

较大输入集压到小输出集必有碰撞,单射需每不同输入一个不同输出。这个和更有易构造碰撞且忽略顺序。它检测一些偶然变化,如在范围内单字节加一,却漏补偿变化、换位与七倍变化。报告要说明具体检测性质,不宣传普遍检测。

模算术也用于密码数学,但有素数、逆、快速幂本身不建立安全。小校验和或小模示例无抵抗攻击者结论。安全结论需指定构造、威胁模型、假设与远超此计算的分析。本课迁移目标是识别运算与证据限度,不设计生产安全系统。

检验理解

整数、模六、模七哪些是域?同小校验和建立什么?

查看答案

其中只有模七是域。整数缺 1/2 等逆,模六有非零零因子。同校验和只证函数输出同,不证输入同或密码安全。

8

常见误解与失败情形

说法 失败原因 修复
同余整数相等 差可为非零模数倍 区分类与代表
负输入必负余 正模数规范代表非负 查 0≤r<m 与 a=qm+r
非零都能约去 合模有不可逆类 查 gcd(a,m)=1
加法逆就是乘逆 解不同方程 指明操作与单位元
素幂定理任意模可用 素性与基条件重要 声明费马条件
CRT 唯一整数 唯一组合周期类 需要时指定代表范围
XOR 是多位整数加 无进位 区分比特向量与整数机器字
同校验和证同数据 有具体碰撞 只描述已证检测性质
9

三个 CPU 实验

Python 3.11+ 标准库即可。先预测恒等式与反例;下载脚本与下方捕获输出的执行源完全相同。

实验 A 欧几里得与扩展算法

预测:252,105 的 gcd 与贝祖系数。运行:看商行,查每等式。解释:零输入尤其 (0,0) 为何要另约定。修改:加 gcd 一的正数对,验证适当模数下系数给逆。负输入在该实验域外。

下载 lab1_euclid.py

"""Euclid and extended Euclid for nonnegative integer inputs."""
from math import gcd

def euclid_trace(a, b):
    if a < 0 or b < 0:
        raise ValueError("This lab uses nonnegative integers")
    rows = []
    while b:
        q, r = divmod(a, b)
        rows.append((a, b, q, r))
        a, b = b, r
    return a, rows

def extended_gcd(a, b):
    if a < 0 or b < 0:
        raise ValueError("This lab uses nonnegative integers")
    old_r, r = a, b
    old_x, x, old_y, y = 1, 0, 0, 1
    while r:
        q = old_r // r
        old_r, r = r, old_r - q * r
        old_x, x = x, old_x - q * x
        old_y, y = y, old_y - q * y
    return old_r, old_x, old_y

value, rows = euclid_trace(252, 105)
for a, b, q, r in rows:
    print(f"{a} = {q}*{b} + {r}")
print("Last nonzero remainder / gcd:", value)
for a, b in [(252, 105), (12, 18), (0, 7), (9, 0), (0, 0)]:
    d, x, y = extended_gcd(a, b)
    assert d == gcd(a, b) and a * x + b * y == d
    print(f"a={a}, b={b}: gcd={d}, x={x}, y={y}; a*x+b*y={a*x+b*y}")
print("The (0,0) gcd is zero by software convention; it has no positive greatest common divisor.")
输出
252 = 2*105 + 42
105 = 2*42 + 21
42 = 2*21 + 0
Last nonzero remainder / gcd: 21
a=252, b=105: gcd=21, x=-2, y=5; a*x+b*y=21
a=12, b=18: gcd=6, x=-1, y=1; a*x+b*y=6
a=0, b=7: gcd=7, x=0, y=1; a*x+b*y=7
a=9, b=0: gcd=9, x=1, y=0; a*x+b*y=9
a=0, b=0: gcd=0, x=1, y=0; a*x+b*y=0
The (0,0) gcd is zero by software convention; it has no positive greatest common divisor.

实验 B 重复平方与操作计数

预测:3¹³ mod7 与四个循环头。运行:与三参数 pow 比,包括零指数、负基。解释:百万指数为何二十迭代,以及为何不代表长整数乘法恒成本。修改:跳最后无用平方,保持不变式与输出,比精确乘次数。零基零指数按空积;非负指数限制比完整 Python pow 接口窄。

下载 lab2_modular_powers.py

"""Repeated squaring with exact integer arithmetic and an explicit operation count."""
def power_mod(base, exponent, modulus):
    if exponent < 0 or modulus < 2:
        raise ValueError("Require exponent >= 0 and modulus >= 2")
    original_base, original_exponent = base, exponent
    result, base = 1, base % modulus
    steps, multiplications, trace = 0, 0, []
    while exponent:
        trace.append((result, base, exponent))
        if exponent % 2:
            result = result * base % modulus
            multiplications += 1
        base = base * base % modulus  # Also counted in the final iteration.
        multiplications += 1
        exponent //= 2
        steps += 1
    assert result == pow(original_base, original_exponent, modulus)
    return result, steps, multiplications, trace

for base, exponent, modulus in [(3, 13, 7), (5, 0, 11), (0, 0, 7), (-2, 9, 13), (17, 1_000_000, 97)]:
    value, steps, multiplications, trace = power_mod(base, exponent, modulus)
    assert steps == exponent.bit_length()
    print(f"({base})^{exponent} mod {modulus} = {value}; iterations={steps}, multiplications={multiplications}")
    if (base, exponent, modulus) == (3, 13, 7):
        print("Loop-head (result, base, exponent):", trace)
print("At most two modular multiplications per iteration; their bit cost is not constant in general.")
for base, exponent, modulus in [(3, -1, 7), (3, 5, 1)]:
    try:
        power_mod(base, exponent, modulus)
    except ValueError as error:
        print("Rejected:", (base, exponent, modulus), str(error))
输出
(3)^13 mod 7 = 3; iterations=4, multiplications=7
Loop-head (result, base, exponent): [(1, 3, 13), (3, 2, 6), (3, 4, 3), (5, 2, 1)]
(5)^0 mod 11 = 1; iterations=0, multiplications=0
(0)^0 mod 7 = 1; iterations=0, multiplications=0
(-2)^9 mod 13 = 8; iterations=4, multiplications=6
(17)^1000000 mod 97 = 35; iterations=20, multiplications=27
At most two modular multiplications per iteration; their bit cost is not constant in general.
Rejected: (3, -1, 7) Require exponent >= 0 and modulus >= 2
Rejected: (3, 5, 1) Require exponent >= 0 and modulus >= 2

实验 C 非法除法与校验和碰撞

预测:逆存在、4x≡2 mod6 解与碰撞输出。运行:看拒绝逆与六类穷举解。解释:gcd 逆条件为定理,而有限枚举只查特定方程。修改:校验和换模十一,构造新的允许字节碰撞。更大输出范围不把求和变安全构造。

下载 lab3_division_and_collisions.py

"""Counterexamples to universal modular division and checksum uniqueness."""
from math import gcd

def inverse(a, modulus):
    if modulus < 2:
        raise ValueError("Require modulus >= 2")
    if gcd(a, modulus) != 1:
        raise ValueError("Residue is not invertible")
    return pow(a, -1, modulus)

for a, modulus in [(3, 7), (2, 6), (5, 6), (0, 7)]:
    try:
        inv = inverse(a, modulus)
        assert a * inv % modulus == 1
        print(f"Inverse of {a} mod {modulus}: {inv}")
    except ValueError as error:
        print(f"Inverse of {a} mod {modulus}: rejected ({error})")
for a, b, modulus in [(4, 2, 6), (2, 1, 6)]:
    solutions = [x for x in range(modulus) if (a * x - b) % modulus == 0]
    assert bool(solutions) == (b % gcd(a, modulus) == 0)
    print(f"{a}x = {b} mod {modulus}: solutions {solutions}")
print("Illegal cancellation:", "2*1 mod 6 =", 2 * 1 % 6, "; 2*4 mod 6 =", 2 * 4 % 6)
assert (2 * 1 - 2 * 4) % 6 == 0 and (1 - 4) % 6 != 0

def checksum(values):
    if any(not isinstance(v, int) or v < 0 or v > 255 for v in values):
        raise ValueError("Values must be bytes")
    return sum(values) % 7

pairs = [([1, 2], [0, 3]), ([1, 2], [2, 1]), ([1, 2], [8, 2])]
for left, right in pairs:
    assert left != right and checksum(left) == checksum(right)
    print("Collision:", left, right, "; checksum =", checksum(left))
print("Different checksum proves a difference; equal checksum does not prove equal input or security.")
输出
Inverse of 3 mod 7: 5
Inverse of 2 mod 6: rejected (Residue is not invertible)
Inverse of 5 mod 6: 5
Inverse of 0 mod 7: rejected (Residue is not invertible)
4x = 2 mod 6: solutions [2, 5]
2x = 1 mod 6: solutions []
Illegal cancellation: 2*1 mod 6 = 2 ; 2*4 mod 6 = 2
Collision: [1, 2] [0, 3] ; checksum = 3
Collision: [1, 2] [2, 1] ; checksum = 3
Collision: [1, 2] [8, 2] ; checksum = 3
Different checksum proves a difference; equal checksum does not prove equal input or security.
10

练习与完整解答

1–12 必做,13–14 可选扩展。给域、逆条件和准确模检查,不用无解释除号。

练习 1★★★计算5 分钟

求 −17=7q+r,0≤r<7 的 q,r。先约简操作数算 17·(−10) mod7。

查看解答

q=−3,r=4。约简三、四,积十二代表五;−170 与五差 −175,为七倍。

练习 2★★★计算5 分钟

跟踪 252,105 欧几里得,查 −2·252+5·105。

查看解答

商二、二、二,余 42,21,0,gcd 二十一,−504+525=21 验证证书。

练习 3★★★计算5 分钟

三模七的加逆与乘逆?二模六有哪些逆?

查看解答

三加逆四、乘逆五,3+4≡0,3·5≡1。二模六加逆四,无乘逆因 gcd=2。

练习 4★★★概念5 分钟

列 4x≡2 mod6 解,判 2x≡1 mod6 可解否。

查看解答

首式除 d=2 成 2x≡1 mod3,x≡2 mod3,模六二、五。次式 gcd=2 不除一,无解。

练习 5★★★proof14 分钟

证欧几里得保共同因数且对非负不全零输入终止。

查看解答

a=qb+r 时,共同因数从 a,b 可到 r=a−qb,从 b,r 可到 a=qb+r,所以集合与 gcd 同。b>0 每次被 0≤r<b 替代,非负第二分量严格降。终止 gcd(a,0)=a,不变式给原 gcd。正确与终止都已证明。

练习 6★★★proof14 分钟

证 a 模 m≥2 有逆当且仅当 gcd(a,m)=1。

查看解答

有 ab≡1,则 ab−km=1,共同因数除一,gcd 一。反之贝祖 ax+my=1,ax≡1,[x] 为逆。覆盖整数 a、正 m≥2 的双向。

练习 7★★★proof14 分钟

按奇偶步骤证重复平方不变式,解释终止与零指数。

查看解答

初始 r=1,b=a modm,e=E,rbᵉ≡aᴱ。偶 e=2k,换 b²,k 保积;奇 e=2k+1,另换 r 为 rb,(rb)(b²)ᵏ 保积。约简保类,正 e 取整减半严格降,零时不变式确定结果。E 初始零无步骤,空积返一。

练习 8★★★application10 分钟

重构 x≡2 mod3,x≡3 mod5,证组合类唯一。

查看解答

x=2+3k 得 3k≡1 mod5,k≡2,x≡8 mod15。查八两余。两解差被三、五除,互素使十五除,故唯一模十五类,所有 8+15t 都代表它。

练习 9★★★application10 分钟

声明费马条件,找三模七逆与 3¹³ mod7。相同素数公式可用于二模六吗?

查看解答

七素三非零,3⁶≡1,逆 3⁵≡5,3¹³=(3⁶)²·3≡3。六合、二不互素,公式不适用且无逆。

练习 10★★★application10 分钟

算 [1,2] 小校验和,给两碰撞与一种检测的字节变化。

查看解答

输出三。[0,3]、[2,1] 不同却同和;[8,2] 也只差七倍。范围内单字节加一使输出模七加一,可检测。同输出仍不证同数据。

练习 11★★★diagnosis10 分钟

诊断模六从 2·1≡2·4 约二,以及非零剩余类成乘法群的说法。

查看解答

原积均二,一与四却不同余模六。二无逆,约去只给模三。非零类不封闭,二乘三零,又二无逆,故失败。可逆元一与五确成乘法群。

练习 12★★★diagnosis10 分钟

程序以 XOR 作八位整数加法,并称七值求和无碰撞。给反例修正。

查看解答

一 XOR 一零,八位整数一加一二。XOR 是二元素域逐坐标加法,非模 256 整数加。[1,2]、[0,3] 同校验和三,反驳无碰撞。描述实际机器字操作与有限检测性质,不只是改名称。

练习 13★★★proof15 分钟

扩展:d=gcd(a,m),证 d|b 时 ax≡b modm 恰 d 类解,含 a≡0。

查看解答

d<m 时除 d 后模 m/d 可逆系数给唯一 x₀ 类,原模 m 的 d 代表 x₀+k(m/d),k=0,…,d−1,各不同且覆盖全解。d=m 时 a≡0,d|b 意味 b≡0,全部 m=d 类解。d 不除 b 则必要性说明无解。

练习 14★★★proof20 分钟

扩展:证模 m 乘 a 是排列当且仅当 gcd(a,m)=1,用非平凡 gcd 构造碰撞。

查看解答

gcd 一时乘逆为双侧逆映射,故双射。d>1 时零与 m/d 是不同代表,1≤m/d<m,但乘积差 a(m/d)=(a/d)m,同余。故非单射非排列。a≡0,d=m 时零与一碰撞也覆盖。

11

自测测验

自动评分 1–9,最后书面自评。

1
整数 a|b 含义?
2
本约定 −17 mod7?
3
欧几里得 gcd 保持依据?
4
a 模 m≥2 何时有逆?
5
无其他假设,2x≡2y mod6 得?
6
重复平方不变式?
7
aᵖ⁻¹≡1 modp 的条件?
8
互素 CRT 唯一确定什么?
9
哪个正确?
查看答案

ab≡1 modm 给整数 k 的 ab−km=1,共同因数除一故 gcd=1。反向贝祖 ax+my=1,使 x 为逆。二模六 gcd 二,无逆;2·1 与 2·4 同余,一与四不同余模六。完整回答有双向等式及具体错误结论,不只背“检查 gcd”。

12

带着问题阅读

读 MIT Mathematics for Computer Science 数论选段。MIT Theory of Numbers 讲义 提供欧几里得、线性同余与 CRT 比较。查 Python pow 文档 三整数参数接口。这些是外部一手阅读,本课例子与必做练习原创。

时间 选段与问题
学习时段 2 · 15 分钟 欧几里得、贝祖、逆:哪恒等式证合法除法?
学习时段 4 · 5 分钟 Python pow:负指数带模要什么附加条件,本实验为何较窄?

Python 模负指数要求基与模互素。本重复平方故意接受非负指数、模≥2,不要把受限接口当 Python 全部支持情形。

13

回忆、结业任务与下一步

不看笔记声明商余唯一,证明欧几里得保持与终止,从贝祖推逆。区分类与代表,给错误约去,写费马与 CRT 准确条件。

结业任务:模十找可逆元,解 4x≡6,比此环与域。可逆元 1,3,7,9。除 gcd 二得 2x≡3 mod5,x≡4 mod5,原代表四、九。模十非域,二与五是非零零因子。

前进标准:运算前能说明合法性,并限定小实验结论。线性代数分支从向量、几何与数组形状开始,CS 路线随后回概率。见课程总览的课程与路线。

14

记法与双语术语

术语或符号 含义 English
a b b 为 a 整数倍
素数、合数 大于一正整数只有平凡因数、非素 Prime / composite
gcd / 贝祖系数 最大公因数、整数恒等式见证 Greatest common divisor / Bézout coefficients
a≡b modm / [a]ₘ 差可被 m 除、同余类 Congruence / class
可逆元、零因子 乘可逆类、非零零积因子 Unit / zero divisor
重复平方 二进制指数模幂 Repeated squaring
费马 / CRT 素幂同余、互素剩余重构 Fermat / Chinese remainder theorem
群、环、域 单运算逆结构、双运算、非零除法结构 Group / ring / field
XOR / 校验和 / 碰撞 逐比特异或、摘要函数、不同输入同输出 XOR / checksum / collision