
go 的 `math/big` 包中没有名为 `pow` 的方法,但可通过 `exp` 方法(底数、指数、模数三参数)实现任意精度整数的幂运算,模数设为 `nil` 即执行无模幂运算。
在 Java 中,BigInteger.pow(int exponent) 是一个直观且常用的幂运算接口;而 Go 的 math/big 包虽未提供同名方法,但其 *big.Int.Exp 方法功能更强大——它支持模幂(即 base^exp mod m),当模数 m 为 nil 时,自动退化为普通幂运算,完全等价于 Java 的 pow。
基本用法示例
package main
import (
"fmt"
"math/big"
)
func main() {
base := big.NewInt(16)
exp := big.NewInt(1)
// Exp(y, m) → x = y^exp mod m;m = nil 表示不取模
result := new(big.Int).Exp(base, exp, nil)
fmt.Println(result) // 输出: 16
// 更多示例
fmt.Println(new(big.Int).Exp(big.NewInt(16), big.NewInt(2), nil)) // 256
fmt.Println(new(big.Int).Exp(big.NewInt(3), big.NewInt(4), nil)) // 81
}⚠️ 关键注意事项:
- Exp 是原地计算方法:调用 x.Exp(y, e, m) 表示将 y^e mod m 的结果写入 x。推荐使用 new(big.Int).Exp(...) 模式避免意外覆盖源值;
- 指数必须为 *big.Int 类型(不能直接传 int),需用 big.NewInt(int64) 转换;
- 底数和指数可为负数,但负指数会导致 panic(math/big 不支持分数结果);
- 若需模幂(如密码学场景),可传入非 nil 的 *big.Int 作为模数 m,此时结果恒为非负且小于 |m|。
对比 Java 实现的映射关系
| Java | Go 等效写法 |
|---|---|
| new BigInteger("16").pow(1) | new(big.Int).Exp(big.NewInt(16), big.NewInt(1), nil) |
无需自行实现幂算法——big.Int.Exp 基于高效的大数乘法与快速幂(exponentiation by squaring)实现,时间复杂度为 O(log₂ exponent),兼具正确性与性能。
✅ 总结:Go 中替代 bigint.pow(a) 的标准做法是调用 (*big.Int).Exp(base, exponent, nil),牢记 nil 模数这一关键约定,即可安全、高效完成任意精度整数幂运算。










