核心概述

模幂(Modular Exponentiation, powmod):用于在给定模 m 下以二进制快速幂计算 a^e mod m,时间复杂度 O(log e),在 64 位大模时需配合安全模乘(如 __int128、Barrett 或 Montgomery)防止溢出。

原文引述

Description: Fast modular exponentiation using binary exponentiation. Supports safe 64-bit modular multiply (u128/Barrett/Montgomery). Time: O(log e) multiplications

展开阐述

  • 函数/接口(据实现)

    • ll powmod(ll a, unsigned long long e, ll m):返回 a^e mod m(m>0)。
    • u64 powmod_u64(u64 a, u64 e, u64 m, Mul mul=mul128):mul 为 (x,y)↦(x·y mod m) 的安全模乘(见 090-数论-长整型模乘)。
    • 特例:当 m 为奇素数且需大量乘法,可用 Montgomery 版本 powMont。
  • 核心算法(二进制快速幂)

    • 规范化:a = (a % m + m) % m;若 m==1 返回 0;res=1 % m。
    • 迭代:
      • while (e > 0):
        • if (e & 1) res = mul(res, a)。
        • a = mul(a, a)。
        • e >>= 1。
    • 返回 res。对于 e0,按约定返回 1 mod m(即使 a0,常取 1)。
  • 安全与实现要点

    • 溢出防护:乘法用 __int128 或 Barrett/Montgomery(见 090-数论-长整型模乘)。
    • 负底数:先规约至 [0,m)。
    • 指数类型:用无符号 64 位可涵盖常见场景;大指数可用大整数按位迭代。
    • 定模优化:固定奇模、多次乘幂时,Montgomery 常数更小(需 toMont/fromMont)。
  • 典型用途

  • 输出语义

    • 返回 a^e 在模 m 下的值,位于 [0,m)。
  • 复杂度

    • 乘法次数约为 ⌊log2(e)⌋·2 次(含平方与若干乘);总体 O(log e)。
  • 使用与注意

    • m1 直接返回 0;e0 返回 1 % m。
    • 若 m 很大且平台无 128 位,优先 Barrett;大量乘法用 Montgomery。
    • 对于随机大数测试/分解,务必搭配安全模乘防止 UB。

关联节点