You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现仿射密码调用BigInteger.modInverse报静态引用错误如何解决

错误原因
  • modInverse() 是BigInteger类的实例方法,必须通过BigInteger的实例对象调用,不可直接用类名BigInteger做静态调用,你代码里的BigInteger.modInverse(...)写法不符合方法调用规则
  • 另外modInverse()方法需要传入模数作为参数,你要计算a模26的逆,需要把26对应的BigInteger作为参数传入方法,原代码也缺少这个参数
  • 原代码的运算括号配对存在语法错误,会导致编译不通过
修复方法

把a转换为BigInteger实例后,用该实例调用modInverse方法,传入模数26对应的BigInteger对象,修正括号配对即可。另外可以提前把a的模逆算出来,不要放到内层循环重复计算,优化执行效率。

修正后代码
for(int a = 1; a<=25;a++) {
    // 提前计算a模26的逆,仅当a和26互质时不会抛出异常
    int aInverse = BigInteger.valueOf(a).modInverse(BigInteger.valueOf(26)).intValue();
    for(int b = 0; b<=26; b++) {
        for(int i =0; i < cipherText.length;i++) {
            cipherText[i] = (byte) ( (((cipherText[i]-'A') - b) * aInverse % 26) + 'A' );
        }
    }
}
注意事项

仿射密码要求密钥a必须和26互质,也就是a只能取1、3、5、7、9、11、15、17、19、21、23、25,当a取其他值时modInverse()会抛出ArithmeticException异常,你可以在循环里提前加判断过滤不符合要求的a值,避免程序崩溃。

内容的提问来源于stack exchange,提问作者user14370029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:27:03