gpt4 book ai didi

java - BigInteger modInverse 不适用于检查为可逆的数字

转载 作者:行者123 更新时间:2023-12-04 05:56:18 27 4
gpt4 key购买 nike

我收到此错误消息:

Exception in thread "main" java.lang.ArithmeticException: BigInteger not invertible.

这很奇怪,因为我已经检查过它是否像这样可逆,但有一段时间:
if(e.gcd(f)==BigInteger.valueOf(1)){d=e.modInverse(f);}

(我只使用 modInverse 一次,所以问题只能是这个。)我还尝试使用 equals 函数检查,结果相同,并用 BigInteger.ONE 替换 BigInteger.valueOf(1),结果也是相同的。

e 和 f 都是相当大的数字。这可能是问题吗?如果不是,那是什么?

编辑: 两个应该不错的数字(e 和 f 都是随机生成的):
e: 9621052046061456501366587335847490032034738260531416442599992125724770869143777724434621136148270408224358486480789065076015439260049732834961669339663651068040517049948746219457579643120163445760970644691744741533662899190172821721584052976577686282851438621400884199179254302505283244747995592596611537181094200162016550417633813815524000523611778694711681246885146830340987509832366125391293211772272830763010707464147876271519220158561249284055201778976275
f: 16676513155155711435633556290292399841994478533147079158165313450742666183857468374630705186073152798730185754009359158564262184760166850555421565829031677397531160732952407631566282672221888347405139275392725582249315145105384589417633027161798592285078352417743828277682057499510687432654973434263500652446355805121287249351524290685634309632867270787070026404872073959084720337580246072021126301925486445661096650037029829869513910200205317091132530162195304846449018937204755880662935929704531348715166585715335080615831412163500338513091079355521203276478413800219497108551811002174097217821125116752809771773184

最佳答案

你们的数字互不质数:

public static void main(String... args) throws Exception {
BigInteger e = new BigInteger("9621052046061456501366587335847490032034738260531416442599992125724770869143777724434621136148270408224358486480789065076015439260049732834961669339663651068040517049948746219457579643120163445760970644691744741533662899190172821721584052976577686282851438621400884199179254302505283244747995592596611537181094200162016550417633813815524000523611778694711681246885146830340987509832366125391293211772272830763010707464147876271519220158561249284055201778976275");
BigInteger f = new BigInteger("16676513155155711435633556290292399841994478533147079158165313450742666183857468374630705186073152798730185754009359158564262184760166850555421565829031677397531160732952407631566282672221888347405139275392725582249315145105384589417633027161798592285078352417743828277682057499510687432654973434263500652446355805121287249351524290685634309632867270787070026404872073959084720337580246072021126301925486445661096650037029829869513910200205317091132530162195304846449018937204755880662935929704531348715166585715335080615831412163500338513091079355521203276478413800219497108551811002174097217821125116752809771773184");
System.out.println(e.gcd(f)); //prints 3
BigInteger d;
if (e.gcd(f).equals(BigInteger.ONE)) {
d = e.modInverse(f);
System.out.println(d);
} else {
System.out.println("nop");
}
}

现在使用下面的数字它可以工作:
public static void main(String... args) throws Exception {
BigInteger e = new BigInteger("2");
e = e.pow(2048);
BigInteger f = e.add(BigInteger.ONE);
System.out.println(e.gcd(f)); //1
BigInteger d;
if (e.gcd(f).equals(BigInteger.ONE)) {
d = e.modInverse(f);
System.out.println(d);
} else {
System.out.println("nop");
}
}

关于java - BigInteger modInverse 不适用于检查为可逆的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9479487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com