big.int 的幂运算唯一标准方法是 exp 方法。它通过三参数 exp(x, y, m) 统一支持普通幂(m==nil)和模幂(m≠nil),要求 y 为非负整数,x/y/m 均需正确初始化,推荐复用实例并注意线程安全。

big.Int 没有 Pow 方法,但有 Exp 方法——它就是 Go 里实现大整数幂运算的唯一标准方式。
为什么 Exp 是幂运算的正确入口
Go 的 math/big 包不提供 Pow 这类“看起来像 Python”的便捷函数,而是把幂和模幂统一在 (*big.Int).Exp 中。这不是遗漏,是设计取舍:避免 API 膨胀,同时满足密码学对模幂的刚需。
它的三参数签名 Exp(x, y, m) 明确表达了计算意图:
- 传
m == nil→ 普通幂:x^y - 传非零
m→ 模幂:x^y mod |m|(自动取绝对值) -
y必须是非负整数;若y == 0,结果恒为1(无论m是否为 nil)
常见错误:传错参数类型或 nil 值
编译器不会帮你检查 x 或 y 是否为 nil,一调就 panic。
- 别写
new(big.Int).Exp(a, 100, nil)——100是int,不是*big.Int,编译失败 - 正确写法是
big.NewInt(100)构造指数 - 底数和指数都必须用
big.NewInt()或SetString()初始化,不能依赖未赋值的var x *big.Int - 模数
m可以是nil,但不能是未初始化的指针(比如var m *big.Int)
性能与复用:别在循环里 new big.Int
Exp 内部用快速幂,复杂度是 O(log y),算法层面没问题。但高频调用时,反复 new(big.Int) 会触发 GC、拖慢速度。
- 推荐提前声明临时变量:
var result, base, exp, mod big.Int - 复用时用
result.Exp(&base, &exp, &mod),注意传地址(&base) - 若需保留原值,先
new(big.Int).Set(&base)复制,big.Int没有内置 clone 方法 - 并发场景下,每个 goroutine 必须用独立的
*big.Int实例,它不是线程安全的
负指数、负底数怎么处理
Exp 不支持负指数(y ),也不会自动求逆元。如果你真需要 <code>a^(-n),得手动结合 ModInverse:
- 仅当模数
m存在乘法逆元(即gcd(a, m) == 1)时才可行 - 步骤:先算
inv := new(big.Int).ModInverse(a, m),再用Exp(inv, n, m) - 负底数可以传入(如
big.NewInt(-2)),但要注意模幂结果始终是非负且小于|m| - 无模场景下,
(-2)^3没问题,但(-2)^100会生成一个巨大正整数,内存占用高
SetString(" 123 ", 10) 会返回 nil, false,但你不检查 ok 就直接传给 Exp,运行时 panic。务必先 strings.TrimSpace,再判断 ok。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











