4

Math.pow() は double 値を返し、パラメーターとして int のみを受け取ります... BigInteger^BigInteger を見つける関数がないため、BigInteger ループを介して実行すると非常に長い時間がかかります...他に不足している方法はありますか?

事前にt​​hnx...

4

4 に答える 4

7

BigInteger.pow()大きな指数を取るために使用できます。10 9はに収まり、intとしても正確に表現できるため、次のdoubleようにすることができます。

int exp = (int) Math.pow(10, 9);
BigInteger answer = BigInteger.valueOf(2).pow(exp);

これは、指数が よりも大きい場合は明らかに破綻しInteger.MAX_VALUEます。ただし、これを使用BigInteger.modPow(BigInteger exponent, BigInteger m)して、 aBigIntegerを別BigIntegerのモジュールに累乗、モジュール a third として使用できますBigIntegerBigIntegerモジュラスとして機能するために、予想される答えよりも大きいa を最初に作成する必要があります。

于 2013-11-01T19:59:50.880 に答える
3

2^x の場合、x は大きな数であり、ビット シフトによってこれを行うことができます。例:

2^4 == (1 << 4);
2^12 == (1 << 12);

BigIntegers を使用すると、shiftLeft() および shiftRight() メソッドで同じことができます。

于 2013-11-01T20:06:17.263 に答える
1

pow を使用できますが、左シフトの方が速い可能性があります。

 BigInteger bi = BigInteger.ONE.shiftLeft(1_000_000_000);

BigInteger.pow(BigInteger) がサポートされていない理由は、最も些細な例でさえ、そのような値を保持するために世界中のどのコンピューターよりも多くのメモリが必要になるためです。BigInteger 指数を必要とする最小値は 2^63 で、2<<2^63 には 2^60 バイトのメモリまたは 1 兆 GB が必要です。

于 2013-11-01T20:17:22.160 に答える