Java BigInteger.pow(BigInteger)?

Java BigInteger.pow(BigInteger)?,java,math,biginteger,pow,Java,Math,Biginteger,Pow,我正在玩Java中的数字游戏,想看看我能创造多大的数字。我的理解是BigInteger可以容纳无限大的数字,只要我的计算机有足够的内存来容纳这样的数字,对吗 我的问题是biginger.pow只接受一个int,而不接受另一个biginger,这意味着我只能使用2147483647以下的数字作为指数。可以这样使用BigInteger类吗 BigInteger.pow(BigInteger) 谢谢。java不允许您执行BigInteger.Pow(BigInteger),但您可以在循环中将其设置为

我正在玩Java中的数字游戏,想看看我能创造多大的数字。我的理解是BigInteger可以容纳无限大的数字,只要我的计算机有足够的内存来容纳这样的数字,对吗

我的问题是biginger.pow只接受一个int,而不接受另一个biginger,这意味着我只能使用2147483647以下的数字作为指数。可以这样使用BigInteger类吗

BigInteger.pow(BigInteger)

谢谢。

java不允许您执行BigInteger.Pow(BigInteger),但您可以在循环中将其设置为最大整数,然后查看由于内存不足而引发算术异常或其他错误的位置

2^2147483647至少有500000000个数字,实际上计算pow是NPC问题,[pow是输入长度的NPC,2个输入(m,n),它们可以用O(logm+logn)编码,最多可以占用nlog(m)(最后答案占用n个log(m)空间),输入和计算大小之间不是多项式关系],有一些简单的问题事实上并不容易,例如,有一类问题,你不能指定真正的精度(所有精度),即BigDecimal说可以计算所有精度,但它不能(事实上),因为到目前为止还没有人解决过这个问题。

你可以使用以下方法编写自己的问题:


可能不适用于负基或指数。

BigInteger的底层实现仅限于(2^31-1)*32位值。这几乎是2^36位。您将需要8 GB的内存来存储它,并且需要多次这样的内存才能对其执行任何操作,如toString()

顺便说一句:你永远读不到这样的数字。如果你想把它打印出来,阅读它将花费一生的时间。

你只能在Java中通过模运算来完成,这意味着你可以做aa^b mod c,其中a,b,c是
大整数

这是通过以下方式实现的:

 BigInteger modPow(BigInteger exponent, BigInteger m) 
只需使用.intValue() 如果您的BigInteger名为BigValue2,那么它将是BigValue2.intValue()

所以要回答你的问题,是

BigValue1.pow(BigValue2.intValue())

对于任何从Groovy方面偶然发现这一点的人来说,完全可以将BigInteger传递给BigInteger.pow()


我可以建议你利用 biginger modPow(biginger指数,biginger m)

假设有BigInteger X和BigInteger Y,并且要计算BigInteger Z=X^Y



得到一个大素数p>>>>X^Y,doz=X.modPow(Y,p)

biginger
不能表示无限大的数字,它只能表示“接近”任意大小的数字。最大可表示数量取决于您的实现(内部数据结构)和可用堆内存。为什么需要它?就像赛义德在下面说的,即使是最小的这样的值,在int不够的地方也太大了……只有当你计算模a
biginger
时,它才有意义,因为在这种情况下它是存在的:可能是+1的重复,以表明它是可能的(尽管这可能不是个好主意)@Sean Patrick Floyd,@Keith Randall,可以编写这么简单的代码,但不可能使用它,在这种情况下大整数coef有什么用途?????您是否可以使用一个不在int中的大整数范围?????这段代码很慢,因为biginteger比int慢。是的,它会非常慢,而且可能不是很有用。但它回答了OP关于如何测试一个大整数的问题。使用模运算时,同样的算法也很有用-请参阅BigInteger.modPow,它确实采用BigInteger指数。@Saeed,他没有问为什么BigInteger.pow是这样,他问是否可以使用更大的指数。@HendraWijayaDjiono:结果中有10^18位数字。给你的计算机加载一百万TB的RAM,然后再试一次…@Fakrudeen,这是太空中的NPC。计算能力不是NPC。这很像多项式。例如,algo。见基思的答案。计算n^m为大气(mlogn)^2*logm,明显小于(max(n,m))^4。你对NPC的定义也不正确。NPC意味着您可以在多项式时间内验证答案,但解决方案是NP难的(非确定性TM模型中的多项式)。空间中的NPC将意味着至少在时间上的NPC,因为占用那么多空间本身将占用NPC时间@Fakrudeen,输入可以用O(log(m)+log(n)编码,这是真的是吗?输出m^n可以用
n log(m)
编码,它与输入大小(log(m)+log(n)没有多项式关系^verylargenembern log(m)*…
确实时间上的NPC,但我只是试着谈论空间(说我们不能使用它)没有提出OP要求的限制。加上一个“顺便说一句”部分…还有一个问题,如果我只存储这么大的一个怎么办BigInteger类型变量中的BigInteger?我这样做了,将其与另一个BigInteger相除,并尝试获取余数。然后我尝试打印余数,但console显示余数花费了太多时间。@Mukit09如果您只需要余数,而且余数相对较小,则只需计算余数,就可以更有效地显示余数n避免使用较大的值。例如,
pow
可能非常昂贵,但
modPow
可能会显著更快。注意:控制台esp DOS控制台非常慢。请尝试将数字写入文件。谢谢您的回复。我的问题已经解决,但我想知道事实。当我尝试在变量中存储如此大的整数时ble,我想,这也是一个问题,因为我的RAM不能给那个变量提供这样的空间。请告诉我我是否错了好吗?@Mukit09内存是一个问题,但是,即使你有足够的内存,处理和显示大量数字也可能需要更长的时间。toString无法工作,因为字符串是无效的
BigValue1.pow(BigValue2.intValue())
groovy> def a = 3G.pow(10G) 
groovy> println a 
groovy> println a.class 

59049
class java.math.BigInteger