26

私はJavaで数字をいじっていて、どれだけ大きな数字を作れるか知りたいです。私のコンピューターがそのような数を保持するのに十分なメモリを持っている限り、BigInteger は無限のサイズの数を保持できるというのは私の理解です。正しいですか?

私の問題は、BigInteger.pow が別の BigInteger ではなく、int のみを受け入れることです。つまり、指数として 2,147,483,647 までの数値しか使用できません。BigInteger クラスをそのまま使用することは可能ですか?

BigInteger.pow(BigInteger)

ありがとう。

4

8 に答える 8

23

繰り返し二乗を使用して、独自に書くことができます。

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;
}

負の基数または指数では機能しない場合があります。

于 2011-01-03T06:16:57.110 に答える
13

Java ではモジュラー演算によってのみこれを行うことができます。つまり、 a a^b mod cを実行できます。ここで、a、b、cBigInteger数値です。

これは以下を使用して行われます。

 BigInteger modPow(BigInteger exponent, BigInteger m) 

BigInteger.modPowこちらのドキュメントをお読みください。

于 2013-01-10T17:32:16.047 に答える
10

BigInteger の基本的な実装は、(2^31-1) * 32 ビット値に制限されています。これはほぼ 2^36 ビットです。それを格納するには 8 GB のメモリが必要であり、toString() などの操作を実行するにはこれが 何度も必要になります。

ところで: そのような数字を読み取ることはできません。印刷しようとすると、読むのに一生かかるでしょう。

于 2011-01-03T09:18:16.443 に答える
1

2^2,147,483,647 は少なくとも 500000000 桁であり、実際には pow の計算は NPC 問題です。入力と計算サイズの間の多項式関係ではない nlog(m) (最終的に答えは n log(m) スペースを取ります)]、実際には簡単ではないいくつかの単純な問題があります。たとえば、sqrt(2)はある種の真の精度 (すべての精度) を指定することはできません。つまり、BigDecimal はすべての精度を計算できると言っていますが、(実際には) できません。

于 2011-01-03T06:00:11.630 に答える
1

Java では BigInteger.Pow(BigInteger) を実行できませんが、それをループ内の最大整数に配置して、ArithmeticException がスローされた場所や、メモリ不足によるその他のエラーを確認できます。

于 2011-01-03T05:51:08.243 に答える
0

Groovy 側からこれに出くわした人にとっては、BigInteger を BigInteger.pow() に渡すことは完全に可能です。

groovy> def a = 3G.pow(10G) 
groovy> println a 
groovy> println a.class 

59049
class java.math.BigInteger

http://docs.groovy-lang.org/2.4.3/html/groovy-jdk/java/math/BigInteger.html#power%28java.math.BigInteger%29

于 2015-05-01T05:33:51.377 に答える