Math.pow() は double 値を返し、パラメーターとして int のみを受け取ります... BigInteger^BigInteger を見つける関数がないため、BigInteger ループを介して実行すると非常に長い時間がかかります...他に不足している方法はありますか?
事前にthnx...
Math.pow() は double 値を返し、パラメーターとして int のみを受け取ります... BigInteger^BigInteger を見つける関数がないため、BigInteger ループを介して実行すると非常に長い時間がかかります...他に不足している方法はありますか?
事前にthnx...
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 として使用できますBigInteger
。BigInteger
モジュラスとして機能するために、予想される答えよりも大きいa を最初に作成する必要があります。
2^x の場合、x は大きな数であり、ビット シフトによってこれを行うことができます。例:
2^4 == (1 << 4);
2^12 == (1 << 12);
BigIntegers を使用すると、shiftLeft() および shiftRight() メソッドで同じことができます。
pow を使用できますが、左シフトの方が速い可能性があります。
BigInteger bi = BigInteger.ONE.shiftLeft(1_000_000_000);
BigInteger.pow(BigInteger) がサポートされていない理由は、最も些細な例でさえ、そのような値を保持するために世界中のどのコンピューターよりも多くのメモリが必要になるためです。BigInteger 指数を必要とする最小値は 2^63 で、2<<2^63 には 2^60 バイトのメモリまたは 1 兆 GB が必要です。