web-dev-qa-db-ja.com

64ビット以上の表現を必要とする大きな数

Javaを使用していて、long(64ビット)より大きい数値を処理する必要があります。何を使用する必要がありますか?JavaのBigIntegerのサイズはどれくらいですか?

15
Ashwin

質問で述べたように、 BigInteger を使用する必要があります。

メモリが不足するまで、必要なだけ大きくすることができます。

19
Mark Byers

JavaでのBigIntegerのサイズはどれくらいですか?

それは少し注意が必要です。問題は、javadocsに制限の明確な指定がないことです。

  • クラスは_int[]_を使用して大きさを表します。これは、_((2^32)^(2^31 - 1)_までの数値を表す可能性があることを意味します。

  • APIには、数値を2の補数バイト配列として返すメソッドがあります。これの制限は_((2^8)^(2^31 - 1)_です。

  • APIには、数値のサイズをビット単位で返す別のメソッドがあります... intとして。これは、2^(2^31 - 1)またはおそらく2^(2^32)の制限を意味します。

実際には、これらの数値はすべて非常に大きいため、最初にヒープスペースの制限(またはCPUパフォーマンスの制限)に遭遇しますおそらく


問題は、数値の平方根を見つけなければならないことです。

学部の数学の教科書(またはウィキペディア)で平方根を計算するためのアルゴリズムを見つけることができるはずです。コーディングは簡単な作業です。

(これが「宿題」のようなにおいがすることを除いて、サンプルコードを紹介します。私が見つけたコードを完全に信頼しているわけではありません。)

most整数には不合理な平方根があることを忘れないでください...

3
Stephen C

bigIntegerクラスよりも、BigDecimalクラスを探しているか、整数だけが必要な場合。任意精度なので、入力した数値の大きさに応じてサイズが変わります

2
Ben

BigIntegerの平方根を見つけるには、「-StackOverflow」の回答を省略してGoogle検索を行う必要があります。 https://www.google.com/search?q=Java+extract+root+bignum&ie=utf-8&oe=utf-8#q=Java+root+BigInteger+-stackoverflow.com+ -stackexchange.com は、 http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/ これが1つのアルゴリズムです。 Javaは、「一度書けば、どこでも使用できる」はずです。SOユーザーは、車輪の再発明が必要だと考えています。モジュールを依頼してください。 「宿題のようなにおいがする、自分でやる」と答えてください。そうです、BigIntegerは半分焼き付けられています。箱から出して対数や根を行うことはできません。非常に遅いです。アルゴリズムを以下に示します。

BigInteger sqrt(BigInteger n) {
  BigInteger a = BigInteger.ONE;
  BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString());
  while(b.compareTo(a) >= 0) {
    BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString());
    if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE);
    else a = mid.add(BigInteger.ONE);
  }
  return a.subtract(BigInteger.ONE);
}
0
sixtytrees