Java中2的幂取模计算结果错误,请求排查代码问题
问题分析与解答
你的模幂运算代码逻辑是正确的,但你对“正确结果”的认知存在偏差——运行得到的140625001才是2109 mod 1e9+7的正确结果,你认为的336781474是错误的。
验证依据
根据费马小定理:由于1e9+7是质数,对于与它互质的整数a,存在a^(p-1) ≡ 1 mod p(其中p=1e9+7)。推导过程如下:
2^(1e9+6) ≡ 1 mod 1e9+7(因为p-1=1e9+6)- 两边同时乘以
2^(-6)(即64的乘法逆元),可得2^1e9 ≡ 2^(-6) mod 1e9+7 - 通过扩展欧几里得算法计算64在模1e9+7下的逆元,结果正是140625001,与代码运行输出一致。
代码优化建议
代码中(long)1e9的写法虽然在当前场景下是精确的,但更严谨的方式是直接使用1000000000L,避免double转long的潜在精度风险(对于超过2^53的整数,double无法精确表示)。修改后的main方法如下:
public static void main(String[] args) { Solution solution = new Solution(); int result = solution.modPow(2, 1000000000L); System.out.println(result); // Output: 140625001 }
补充说明
如果你的目标是得到336781474,大概率是混淆了问题参数:比如底数不是2而是其他数、指数或模数设置错误,请重新核对问题需求。
内容的提问来源于stack exchange,提问作者Hemanthkumar Pujari
相关产品推荐
相关产品推荐

