带有int base的Java BigInteger pow

时间:2014-11-14 02:10:59

标签: java

我可能错过了某些东西并且有点生气,我想知道将2^Biginteger实现到变量的最佳方法是什么?我确定这是一个简单的问题。这是为了帮助计算出一个2-pseudoprime。 (基本上看是否2^N-1 = 1 mod N或不是。

2 个答案:

答案 0 :(得分:1)

所以,如果我理解你,你想做这样的事情:

 BigInteger bigExp = ...  some really large value
 BigInteger pow = BigInteger.valueOf(2).pow(bigExp);

不幸的是,这不起作用。

如您所述,没有pow重载需要BigInteger参数。当你考虑它时,这样的方法会有问题。

2 N 的值是以二进制表示时具有N个有效位的值。如果大于int,则表示N为2 31 或更多。或转换为字节,即2 28 字节或0.25千兆字节。对于一个号码。

那不是不可能大。应该可以表示大的数字,即使在32位JVM中也是如此。问题是任何BigInteger算术运算都容易产生另一个怪物。只创建一个这样大小的数量就可以复制0.25千兆字节,并且乘法和除法等操作......对于N位数字来说是O(N ^ 2)......将会“永远”。

话虽如此,还是有办法生成这么大的数字。例如,您可以分配一个巨大的字节数组(默认初始化为零),将相应的字节设置为包含1位,然后使用BigInteger(byte[])构造怪物编号。

答案 1 :(得分:0)

正如@StephenC指出的那样,这些数字太笨重了。

但是

  

看是否2 ^ N-1 = 1 mod N或

您不需要计算2 ^ X.你可以计算2 ^ X mod N.一个小得多的数字。

 BigInteger.valueOf(2).modPow(n.subtract(ONE), n);