PrepStack · Markdown HTML

模运算与快速幂

数学、数论与组合 · HTML

数学 / 逻辑形态

若 a≡b(mod M),加乘保持同余;快速幂按指数二进制位累乘 base^(2^k)。

识别信号

容易误判的相似信号

SignalWhy it is different
需要精确商或大小比较取模会丢失数量级,不能恢复原数顺序。
随意使用费马逆元a^(M-2) 仅在 M 为质数且 a 非零模 M 时成立。

核心不变量

快速幂中 result*base^exp 与原目标同余;每步处理一位并令 base 平方、exp 折半。

状态、转移与处理顺序

ItemDefinition
Stateresult、当前 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)

正确性思路

  1. 指数二进制分解为若干 2^k 之和。
  2. 最低位为 1 时当前 base 正是相应 2^k 次幂。
  3. 平方与右移保持 result*base^exp 的同余不变量。
  4. exp 归零时 result 等于目标幂的模。

复杂度

TimeSpaceParameters
O(log exp)O(1)exp 为非负指数,mod 为正模数

边界条件

错误模式

PatternWhy it fails / fix
最后才取模中间数会巨大或溢出。
逆元条件缺失不可逆元素没有模逆元。
把除法直接取模模除法需乘逆元且先确认存在。

选择与排除规则

相关模板

RelationTemplateBoundary
大数支撑组合计数 / 容斥计数需取模和逆元
数论组合筛法与质因数分解质数模数和逆元依赖因子性质

原创微型例子

环节内容
Result结果 5。
Scenario计算 3^13 mod 7。
Walkthrough13 的二进制为 1101,只乘入对应 1 位的平方幂并每步取模。

Recall prompts

我的补充