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