Я не знаю ни одного библиотечного решения для вашего вопроса. Вам нужно будет импортировать решение внешней библиотеки откуда-то. То, что я дам вам ниже, не так сложно, как получить внешнюю библиотеку.
Вы можете создать собственное решение для внешней библиотеки в классе с помощью двух статических методов, как показано ниже, и добавить его в свою коллекцию внешних библиотек. Методы не обязательно должны быть методами экземпляра, поэтому они являются статическими, и для удобства вам не нужно создавать экземпляр класса для их использования. Норма для целочисленных квадратных корней - это значение пола (т. Е. Наибольшее целое число, меньшее или равное квадратному корню), поэтому вам может понадобиться только один статический метод, метод floor, в классе ниже для значения floor и можно выбрать игнорировать верхний предел (т. е. наименьшее целое число, большее или равное квадратному корню) версии метода. Прямо сейчас они находятся в пакете по умолчанию, но вы можете добавить инструкцию пакета, чтобы поместить их в любой пакет, который вам удобен.
Методы очень просты, и итерации сходятся к самому близкому целочисленному ответу очень, очень быстро. Они выдают исключение IllegalArgumentException, если вы пытаетесь дать им отрицательный аргумент. Вы можете изменить исключение на другое, но вы должны убедиться, что отрицательный аргумент генерирует какое-то исключение или, по крайней мере, не пытается вычислить. Целочисленные квадратные корни отрицательных чисел не существуют, поскольку мы не находимся в области мнимых чисел.
Они получены из очень хорошо известных простых итерационных алгоритмов целочисленного квадратного корня, которые веками использовались в ручных вычислениях. Он работает путем усреднения завышения и недооценки, чтобы приблизиться к лучшей оценке. Это может повторяться до тех пор, пока оценка не станет настолько близкой, насколько это необходимо.
Они основаны на y1 = ((x / y0) + y0) / 2, сходящемся к наибольшему целому числу yn, где yn * yn <= x. </p>
Это даст вам минимальное значение для квадратного корня BigInteger, y, x, где
y * y <= x и (y + 1) * (y + 1)> x.
Адаптация может дать вам предельное значение для квадратного корня BigInteger, y, x, где
y * y> = x и (y - 1) * (y - 1)
Оба метода были проверены и работают. Они здесь:
import java.math.BigInteger;
public class BigIntSqRoot {
public static BigInteger bigIntSqRootFloor(BigInteger x)
throws IllegalArgumentException {
if (x.compareTo(BigInteger.ZERO) < 0) {
throw new IllegalArgumentException("Negative argument.");
}
// square roots of 0 and 1 are trivial and
// y == 0 will cause a divide-by-zero exception
if (x .equals(BigInteger.ZERO) || x.equals(BigInteger.ONE)) {
return x;
} // end if
BigInteger two = BigInteger.valueOf(2L);
BigInteger y;
// starting with y = x / 2 avoids magnitude issues with x squared
for (y = x.divide(two);
y.compareTo(x.divide(y)) > 0;
y = ((x.divide(y)).add(y)).divide(two));
return y;
} // end bigIntSqRootFloor
public static BigInteger bigIntSqRootCeil(BigInteger x)
throws IllegalArgumentException {
if (x.compareTo(BigInteger.ZERO) < 0) {
throw new IllegalArgumentException("Negative argument.");
}
// square roots of 0 and 1 are trivial and
// y == 0 will cause a divide-by-zero exception
if (x == BigInteger.ZERO || x == BigInteger.ONE) {
return x;
} // end if
BigInteger two = BigInteger.valueOf(2L);
BigInteger y;
// starting with y = x / 2 avoids magnitude issues with x squared
for (y = x.divide(two);
y.compareTo(x.divide(y)) > 0;
y = ((x.divide(y)).add(y)).divide(two));
if (x.compareTo(y.multiply(y)) == 0) {
return y;
} else {
return y.add(BigInteger.ONE);
}
} // end bigIntSqRootCeil
} // end class bigIntSqRoot