数学、数论与组合 · HTML
数学 / 逻辑形态
若 a≡b(mod M),加乘保持同余;快速幂按指数二进制位累乘 base^(2^k)。
识别信号
- 答案要求对 M 取模
- 指数极大
- 需模逆元或组合数
- 中间乘积可能爆炸
- 状态只需保留余数
容易误判的相似信号
| Signal | Why it is different |
|---|
| 需要精确商或大小比较 | 取模会丢失数量级,不能恢复原数顺序。 |
| 随意使用费马逆元 | a^(M-2) 仅在 M 为质数且 a 非零模 M 时成立。 |
核心不变量
快速幂中 result*base^exp 与原目标同余;每步处理一位并令 base 平方、exp 折半。
状态、转移与处理顺序
| Item | Definition |
|---|
| State | result、当前 base、剩余 exp、mod。 |
| Transition | 若最低位为 1 则乘入 result;base=base² mod M,exp//=2。 |
| Frontier / order | 指数尚未处理的高位是前沿;每轮消去最低一位。 |
Python 骨架
def mod_pow(base, exp, mod):
if mod <= 0 or exp < 0:
raise ValueError
result = 1 % mod
base %= mod
while exp:
if exp & 1:
result = result * base % mod
base = base * base % mod
exp >>= 1
return result
def prime_mod_inverse(a, p):
if a % p == 0: raise ZeroDivisionError
return mod_pow(a, p-2, p)
正确性思路
- 指数二进制分解为若干 2^k 之和。
- 最低位为 1 时当前 base 正是相应 2^k 次幂。
- 平方与右移保持 result*base^exp 的同余不变量。
- exp 归零时 result 等于目标幂的模。
复杂度
| Time | Space | Parameters |
|---|
| O(log exp) | O(1) | exp 为非负指数,mod 为正模数 |
边界条件
- exp=0 返回 1 mod M
- mod=1 时结果为 0
- 负 base 先规范化
- 逆元要求 gcd(a,M)=1
- 固定宽度语言乘法可能先溢出
错误模式
| Pattern | Why it fails / fix |
|---|
| 最后才取模 | 中间数会巨大或溢出。 |
| 逆元条件缺失 | 不可逆元素没有模逆元。 |
| 把除法直接取模 | 模除法需乘逆元且先确认存在。 |
选择与排除规则
- 巨大指数:binary exponentiation。
- 加乘计数:每个转移及时取模。
- 模数为质数且分母非零:可用费马逆元。
- 合数模数:用扩展欧几里得检验互质。
相关模板
原创微型例子
| 环节 | 内容 |
|---|
| Result | 结果 5。 |
| Scenario | 计算 3^13 mod 7。 |
| Walkthrough | 13 的二进制为 1101,只乘入对应 1 位的平方幂并每步取模。 |
Recall prompts
我的补充