横向补全:Stage 1–3 的全部缺口(详细版)
Confidence: 0.93
好,一次补完类别 A 的所有缺口。我按”原阶段归属”组织,每个知识点给:是什么 → 为什么 → 怎么用 → 例子 → 代码/陷阱。这一节信息密度高,但补完后你 Stage 1–3 就是真正的”无死角”了。
六个缺口:① Wilson 定理 → ② 环 视角 → ③ 多元线性同余 → ④ 批量逆元 → ⑤ 扩展欧拉定理 → ⑥ Lucas 定理 + 线性筛。
补 Stage 1
① 威尔逊定理 (Wilson’s Theorem)
内容
注意这是充要条件 (if and only if)——它既是质数的必要条件,也是充分条件,所以理论上能用来判素性。
为什么成立(证明思路)
考虑 ,每个元素在模 p 下都有唯一逆元(因为都与 p 互质)。把元素两两配对:每个 和它的逆元 配对,乘积是 1。
唯一的例外是自己是自己逆元的元素,即满足 的 。解这个方程:,也就是 和 。
所以 里,除了 和 ,其余元素全部两两配对约成 1,剩下:
例子
:。 ✓
: ✓
用途与陷阱
- 理论价值大于实用:判素性要算 ,比试除法还慢,实际不用它判素。
- 真正用途:证明题、以及推导某些特殊同余(如 的性质,和二次剩余相关,Stage 4 会用)。
- ⚠️ 反方向也成立:若 合数且 ,则 。
② 环视角: 与
这不是新计算,而是给你一个代数语言,让你看清前面学的东西”住在什么结构里”。这是通往 Stage 4 群论的桥。
是一个环 (ring)
把模 n 的 n 个同余类 看成一个整体,它带着两种运算:
- 加法: —— 永远封闭,永远有逆( 的加法逆是 )
- 乘法: —— 封闭,但不一定有逆
满足”加法成群、乘法封闭且分配”的结构,数学上叫环 (ring)。 就是”模 n 整数环”。
是一个群 (group)
把环里有乘法逆元的元素(即与 n 互质的同余类)单独拎出来,组成集合 :
这个集合在乘法下成群 (group)——封闭、有单位元 、每个元素有逆、满足结合律。
它的大小恰好是 ! 这就把欧拉函数的真正含义点破了: 不只是”互质元素的个数”,而是”乘法群的阶 (order of the group)“。
为什么这个视角重要
一旦你这样看,前面学的定理瞬间”显然化”:
| 你学过的 | 群论翻译 |
|---|---|
| 欧拉定理 | “群里任何元素的 次方 = 单位元”(拉格朗日定理的推论) |
| 费马小定理 | 同上,群是 ,阶 |
| 模逆元存在 互质 | ”元素属于群 它在群里”(同义反复) |
这是 Stage 4 的入口:当你能自然地把模运算看成”群里的运算”,原根(群的生成元)、离散对数(群里的”取对数”)就都是顺理成章的概念了。
例子
:,大小 。验证封闭:、、——乘来乘去永远落在这 4 个数里,确实是个群。
补 Stage 2
③ 多元线性同余 / 线性丢番图方程 (Multivariable Linear Congruence)
问题形式
求整数对 。这叫线性丢番图方程 (linear Diophantine equation)。
有解条件与求法
有解 (和单变量同余的判据同源)。
三步求法:
- 用扩展欧几里得求 及一组
- 两边乘 ,得一个特解 (particular solution):
- 通解 (general solution) 加上齐次部分:
完整例子
解 。
- ,扩展欧几里得:,即
- ✓,乘 :特解
- 通解:
验证(取 ):, ✓;(取 ), ✓
几何直觉
是一条直线,整数解是这条线穿过的格点 (lattice points)。通解里的 就是”沿直线一格一格跳”的步数,步长由 决定。
④ 批量求逆元 (Batch Modular Inverse)
问题
求 模 p 的所有逆元。逐个用费马要 ,有更快的 递推法——竞赛高频技巧。
递推公式(线性求逆)
对质数 p,设 ,递推式:
边界 。
为什么成立(推导)
设 。两边模 p:
两边乘 ,整理就得到上面的递推式。精妙处:求 用到的 下标更小,已经算过,所以一遍扫过去 。
例子(,求 的逆元)
验证:✓,✓,✓,全对。
补 Stage 3
⑤ 扩展欧拉定理 (Extended Euler’s Theorem) ★最重要的补充
解决什么
欧拉定理降幂要求 。当 a 和 n 不互质时(普通欧拉失效),用扩展欧拉。它还能处理超大指数甚至幂塔 (power tower) 。
定理内容(三种情况)
求 :
核心区别:普通欧拉是 ;扩展欧拉在指数够大时要额外 。这个 是处理不互质情形的关键修正。
为什么需要 (直觉)
当 时, 的幂在模 n 下的序列不是纯循环,而是”先有一段不循环的前缀,再进入循环”(像字母 ρ 的形状)。 保证你把指数推到过了前缀、稳定进入循环段之后再取模,从而结果正确。
例子(不互质情形)
求 。注意 ,不能用普通欧拉。
- ,用扩展欧拉:指数变成
验证:,,……从 起进入 循环, 确实 ✓ (若错用普通欧拉 ,得 1,错误!这就是为什么必须用扩展版。)
幂塔应用(一瞥)
算 这类幂塔,从最外层往里递归套用扩展欧拉:外层模 n 用 ,再内层模 用 …… 反复迭代会快速降到 1,递归自然终止。这是竞赛幂塔题的标准解法。
⑥a Lucas 定理 (Lucas’ Theorem)
解决什么
算组合数取模质数 ,当 n、k 巨大(比如 )而 p 较小(比如 以内的质数)时。
定理内容
把 n、k 写成 p 进制 (base-p):,。则:
即”各数位的组合数之积”。每个 里 都很小,直接算。
附带推论:若某一位 ,则 ,整个 。
例子
求 。
- ,
- 逐位:
- 所以
验证: ✓
用途
组合计数题里 n 极大时的标准武器。配合 CRT 还能扩展到模合数(先对每个质因子用 Lucas,再 CRT 合并)。
⑥b 线性筛求欧拉函数 (Linear Sieve for Totient)
解决什么
一次性求出 一整片,。比逐个套公式快得多,是数论题预处理标配。
原理
线性筛 (linear sieve / Euler sieve) 在筛质数的同时,利用 的两条性质递推:
- p 是质数:
- 若 :(p 已是 i 的因子,不增新质因子)
- 若 :(积性,p 是新质因子)
每个合数只被它的最小质因子筛一次,所以总复杂度 。
代码(含批量逆元、扩展欧拉、Lucas、线性筛——一次给全)
# ===== ⑤ 扩展欧拉定理 =====
from sympy import totient
def ext_euler_pow(a, b, n):
phi = int(totient(n))
if b < phi:
return pow(a, b, n)
return pow(a, b % phi + phi, n) # 大指数 +phi 修正
print(ext_euler_pow(2, 100, 12)) # 4(不互质,普通欧拉会错)
# ===== ④ 批量逆元 O(n) =====
def batch_inverse(n, p):
inv = [0] * (n + 1)
inv[1] = 1
for i in range(2, n + 1):
inv[i] = (-(p // i) * inv[p % i]) % p
return inv
print(batch_inverse(6, 7)) # [0,1,4,5,2,3,6]
# ===== ⑥a Lucas 定理 =====
def comb_small(n, k, p): # 小组合数 mod p
if k > n: return 0
num = den = 1
for i in range(k):
num = num * (n - i) % p
den = den * (i + 1) % p
return num * pow(den, p - 2, p) % p
def lucas(n, k, p):
if k == 0: return 1
return comb_small(n % p, k % p, p) * lucas(n // p, k // p, p) % p
print(lucas(10, 3, 3)) # 0
# ===== ⑥b 线性筛欧拉函数 O(n) =====
def sieve_phi(n):
phi = list(range(n + 1))
primes = []
is_comp = [False] * (n + 1)
for i in range(2, n + 1):
if not is_comp[i]:
primes.append(i)
phi[i] = i - 1
for p in primes:
if i * p > n: break
is_comp[i * p] = True
if i % p == 0:
phi[i * p] = phi[i] * p # 情况 2
break
else:
phi[i * p] = phi[i] * (p - 1) # 情况 3
return phi
print(sieve_phi(12)) # [0,1,1,2,2,4,2,6,4,6,4,10,4]库安装方式(用到 sympy 的 totient;④⑥纯标准库无需安装):
pip install sympy -i https://pypi.tuna.tsinghua.edu.cn/simple补全后的 Stage 1–3 完整地图
| 阶段 | 原有核心 | 本次补全 |
|---|---|---|
| Stage 1 | 同余、剩余系、 入门 | Wilson 定理、环/群视角 |
| Stage 2 | 扩展欧几里得、逆元、线性同余 | 多元线性同余、批量逆元 |
| Stage 3 | 快速幂、费马、欧拉、CRT | 扩展欧拉定理、Lucas 定理、线性筛 |
我的观点:这六个补充里,分量最重、最该内化的是两个——扩展欧拉定理和环/群视角,而且它们的重要性是不同性质的。
扩展欧拉是实战补丁:它堵上了”不互质就不能降幂”这个真实的洞。你以后碰到 这种底数和模数共因子的情况(密码学和竞赛里都常见),没有它就会算错。我建议你把那个例子(普通欧拉得 1、扩展欧拉得 4、真值是 4)记牢——这个”错与对的对比”比记公式管用。
而环/群视角是认知升维:它不教你算任何新东西,却悄悄改变你”看”模运算的方式。在补这一节之前,欧拉定理对你是一条要记的公式 ;补完之后,它会变成一句几乎不需要记的废话——“群里任何元素自乘’群的大小’次必然回到单位元”。这种”把一堆孤立公式压缩成一个统一原理”的体验,正是数学威力的核心。我特意把它安排在进 Stage 4 之前,因为 Stage 4 的原根、离散对数全部建立在” 是群”这个认知上——你现在把这个视角焐热,下一阶段会顺得不可思议。
其余四个(Wilson、多元同余、批量逆元、Lucas、线性筛)我的态度是”知道、能查、用时会”即可,不必背。它们是工具箱里的专用扳手,遇到对应的螺丝再拿出来,平时不用占用你的记忆。
关键提醒 (Caveats):
- 扩展欧拉的 只在 时加;小指数直接算,别画蛇添足
- Lucas 定理要求模数是质数;合数要拆质因子分别 Lucas 再 CRT
- 批量逆元的递推只对质数模成立(用到了 的可逆性)
- 环/群视角是概念工具,本身不产生计算,别期待它”算出”什么——它的价值是让你理解为什么那些公式成立
- 本次代码用到 sympy 的 totient,安装:
pip install sympy -i https://pypi.tuna.tsinghua.edu.cn/simple
现在 Stage 1–3 真正无死角了。要不要我出一套针对这六个补充点的小测验(延续 PDF 试卷 + 答案册格式)巩固一下,还是直接进 Stage 4:阶与原根 + 二次剩余 + 离散对数?****