が非負で正の整数であるfloor(x^(1/n))
場所を計算するために、このメソッドを作成しました。少し前のことなので、なぜ機能するのか説明できませんが、これを書いたときは、正しい答えが合理的に迅速に返されることが保証されていることに満足していたと確信しています。x
BigInteger
n
x
が正確な累乗であるかどうn-th
かを確認するには、累乗された結果が再びn
正確に返されるかどうかを確認できます。x
public static BigInteger floorOfNthRoot(BigInteger x, int n) {
int sign = x.signum();
if (n <= 0 || (sign < 0))
throw new IllegalArgumentException();
if (sign == 0)
return BigInteger.ZERO;
if (n == 1)
return x;
BigInteger a;
BigInteger bigN = BigInteger.valueOf(n);
BigInteger bigNMinusOne = BigInteger.valueOf(n - 1);
BigInteger b = BigInteger.ZERO.setBit(1 + x.bitLength() / n);
do {
a = b;
b = a.multiply(bigNMinusOne).add(x.divide(a.pow(n - 1))).divide(bigN);
} while (b.compareTo(a) == -1);
return a;
}
使用するには:
System.out.println(floorOfNthRoot(new BigInteger("125"), 3));
編集
上記のコメントを読んで、これが n 乗根のニュートン ラフソン法であることを思い出しました。Newton-Raphson 法には 2 次収束があります (これは日常用語で高速であることを意味します)。数十桁の数字で試してみると、ほんの一瞬で答えが得られるはずです。
メソッドを他の数値型で動作するように適応させることができますがdouble
、BigDecimal
私の見解では、この種のものには適していません。