Итак, давайте посмотрим на некоторые кубы в двоичном виде
2^3 = 8 = 100b (3 binary digits)
4^3 = 64 = 100 000b (6 binary digits)
8^3 = 512 = 100 000 000b (9 binary digits)
(2^n)^3 = 2^(3n) = (3n binary digits).
Итак, для приблизительного первого предположения подсчитайте количество двоичных цифр, скажем, d
, и разделите на три, пусть n = d/3
это говорит намесли номер корня куба находится между 2^n
и 2^(n+1)
.Подсчет цифр может быть связан с примитивным первым приближением к логарифму.
Если вы не можете получить доступ к двоичным цифрам, просто несколько раз делите на 8 (или степень 8), пока не получите нулевой результат.
Теперь мы можем использовать Ньютона-Рафсона, чтобы найти решение, Корень куба из Википедии услужливо дает нам формулу итерации.Если a
- это число, от которого мы хотим найти корень, а x_0
- это наше первое предположение, использующее приведенное выше
x_{n+1} = ( a / x_n^2 + 2 x_n ) / 3.
. Это может сойтись очень быстро.Например, с a=12345678901234567890
мы находим, что a
находится между 8 ^ 21 и 8 ^ 22, следовательно, корень куба должен быть между 2 ^ 21 и 2 ^ 22.
Запуск итерации
x_1 = 2333795, x_1^3 = 12711245751310434875
x_2 = 2311422, x_2^3 = 12349168818517523448
x_3 = 2311204, x_3^3 = 12345675040784217664
x_4 = 2311204, x_4^3 = 12345675040784217664
, и мы видим, что оно сходится после трех итераций.Проверка показывает, что a
находится между 2311204 ^ 3 и 2311205 ^ 3.
Этот алгоритм может работать с вычислениями с использованием big.js.Вышеуказанные вычисления были выполнены с использованием класса Java BigInt.