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的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章