pow中Java Biginteger的最大值[重复]

Posted

技术标签:

【中文标题】pow中Java Biginteger的最大值[重复]【英文标题】:Maximum value of Java Biginteger in pow [duplicate] 【发布时间】:2019-10-01 08:30:01 【问题描述】:

我的代码可以从给定的输入中获取指数值:

BigInteger a= new BigInteger(2,10);       
BigInteger b; 
b=a.pow(9999999999);

值小于 7 位时有效。例如:

BigInteger a= new BigInteger(2,10);       
BigInteger b; 
b=a.pow(1234567);

我的代码是否使指数成为可能或不可能有 10 位数字?

我使用的是 JDK 1.8。

【问题讨论】:

pow 采用int 参数并且9999999999 不在int 的范围内。 这不是@michalk所说的bigInteger的问题,而是int的参数 查看重复的问题并检查为什么不可能(或如何“克服”这个问题) 它有解决办法还是无法克服? 【参考方案1】:

BigInteger.pow()只存在于int参数,所以不能一次取大于Integer.MAX_VALUE的幂。

如果你能做到的话,这些数字也将难以置信地大(如“快速接近并通过可观测宇宙中的粒子数量),而且很少有这种用途。

请注意,密码学中经常使用的“带模幂”操作是使用BigInteger.modPow() 实现的,确实采用BigInteger 参数,因此可以有效地处理任意大的值。

【讨论】:

所以我应该使用 modPow 来工作@joachim @DrianDrian:这真的取决于你需要什么,所以我不知道。如果您打算拨打pow,然后在号码上拨打mod,那么modPow 将产生相同的结果,快得多,并且还可以处理更大的数字。如果您真的想继续处理pow 以其他方式产生的巨大数字,那么modPow 不是可以帮助您的替代品。【参考方案2】:

pow 的参数是int。 range of int 是 -2147483648 到 2147483647,因此答案取决于您使用的 哪个 10 位数字。如果这 10 位数字是 1234567890,那很好,它在范围内(尽管您可能会得到一个 非常非常大 BigInteger,这可能会推动您的内存限制);如果它们是您的问题中的 9999999999,那不好,超出范围。

例如,编译:

int a = 1234567890;

这不是:

int b = 9999999999;
        ^--------------- error: integer number too large: 9999999999

【讨论】:

那么我是否需要更改代码或寻找其他方式来完成任务? @DrianDrian - 是的,.但是有两件事:1. BigInteger 不需要支持您想要的范围内的数字。它只需要支持最多 2 次方 Integer.MAX_VALUE 的数字。 2. 即使有,也需要很长的时间来计算,结果将是一个真正庞大的数。我怀疑你内存不足。考虑到 2 的 999 次方大约是 536xxx,其中 xxx 是 297 个零。

以上是关于pow中Java Biginteger的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java大数BigInteger-用法记录

Kotlin:使Java函数可调用中缀

Math类Arrays类BigInteger类常用方法

java中int类型怎么转biginteger类型

java中BigDecimal和bigInteger如何转换

BigInteger和BigDecimal