私はJavaで数字を使って遊んでいて、私がどれだけ大きな数字を作ることができるかを見たいと思っています。私の理解では、私のコンピューターにそのような数を保持するのに十分なメモリがある限り、BigIntegerは無数のサイズを保持できると思いますか?
私の問題は、BigInteger.powがintのみを受け入れ、別のBigIntegerを受け入れないことです。つまり、2,147,483,647までの数しか指数として使用できません。 BigIntegerクラスをそのまま使用できますか?
BigInteger.pow(BigInteger)
ありがとう。
repeated squaring を使用して、独自に作成できます。
BigInteger pow(BigInteger base, BigInteger exponent) {
BigInteger result = BigInteger.ONE;
while (exponent.signum() > 0) {
if (exponent.testBit(0)) result = result.multiply(base);
base = base.multiply(base);
exponent = exponent.shiftRight(1);
}
return result;
}
負の基数または指数では機能しない可能性があります。
これは、Javaでモジュラー演算によってのみ実行できます。つまり、a ^ b mod c、ここでa、b、cはBigInteger
番号です。
これは以下を使用して行われます:
BigInteger modPow(BigInteger exponent, BigInteger m)
BigIntegerの基礎となる実装は、(2 ^ 31-1)* 32ビット値に制限されています。これはほぼ2 ^ 36ビットです。それを保存するには8 GBのメモリが必要であり、toString()のように操作を実行するにはmany倍必要です。
ところで:そのような番号を読むことはできません。印刷しようとすると、読むのにかなりの時間がかかります。
2 ^ 2,147,483,647は少なくとも500000000桁です。実際、powの計算はNPC問題、[PowはNPC入力の長さ、2入力(m、 n)それらはO(logm + logn)でコーディングでき、最大nlog(m)をとることができます(最後に答えはn log(m)のスペースを取ります)入力と計算サイズの間の多項式関係ではありません]、いくつかありますたとえば実際には簡単ではない単純な問題 sqrt(2) はある種の問題であり、真の精度(すべての精度)を指定することはできません。つまり、BigDecimalはすべての精度を計算できますが、それは可能ですt(実際)今まで誰もこれを解決しなかったので。
JavaではBigInteger.Pow(BigInteger)を実行できませんが、ループ内で最大整数に配置して、メモリ不足によるArithmeticExceptionがスローされる場所やその他のエラーを確認できます。
BigInteger modPow(BigInteger exponent、BigInteger m)を利用することをお勧めします
BigInteger XとBigInteger Yがあり、BigInteger Z = X ^ Yを計算するとします。
大きな素数P >>>> X ^ Yを取得し、Z = X.modPow(Y、P);を実行します。
物事のGroovy側からこれにつまずく人のために、BigIntegerをBigInteger.pow()に渡すことは完全に可能です。
groovy> def a = 3G.pow(10G)
groovy> println a
groovy> println a.class
59049
class Java.math.BigInteger