biginteger.modinverse用于计算大整数对正模数的乘法逆元,要求两数互质,否则抛arithmeticexception;结果在[0,m−1]内,基于扩展欧几里得算法实现,时间复杂度约o(log²n)。

BigInteger.modInverse 是 Java 中计算模逆元的内置方法,它返回当前大整数对指定模数的乘法逆元,即满足 a.multiply(result).mod(m).equals(BigInteger.ONE) 的结果。
前提条件:模数必须与原数互质
调用 modInverse 前,必须确保当前 BigInteger 与模数 m 互质(即 gcd(a, m) == 1),否则会抛出 ArithmeticException。Java 内部会自动检查这一点。
- 例如:
BigInteger.valueOf(3).modInverse(BigInteger.valueOf(7))返回5,因为3 × 5 = 15 ≡ 1 (mod 7) - 但
BigInteger.valueOf(2).modInverse(BigInteger.valueOf(8))会抛异常,因为gcd(2,8)=2 ≠ 1
底层使用扩展欧几里得算法
虽然你不需要手动实现,但理解原理有助于调试:该方法基于扩展欧几里得算法(Extended Euclidean Algorithm),求解方程 a·x + m·y = 1 中的 x,这个 x mod m 就是模逆元。
- Java 的
modInverse已高度优化,支持任意长度的大整数 - 时间复杂度大致为
O(log²n),其中n是较大操作数的位数
使用时注意符号和范围
结果始终是非负的,且严格小于模数 m(即在区间 [0, m-1] 内);即使原数为负,Java 也会先将其转为等价正剩余类再计算。
-
BigInteger.valueOf(-3).modInverse(BigInteger.valueOf(7))等价于BigInteger.valueOf(4).modInverse(BigInteger.valueOf(7)),结果仍是5 - 模数
m必须为正整数(m.compareTo(BigInteger.ZERO) > 0),否则抛异常
简单示例代码
直接调用即可,无需额外依赖:
BigInteger a = new BigInteger("17");
BigInteger m = new BigInteger("43");
BigInteger inv = a.modInverse(m); // 结果为 25,因为 17×25 = 425 ≡ 1 (mod 43)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











