Вычислять кубический корень не так то просто, особенно из какого-нибудь BigInteger. Вычислить два последовательных квадратных корня из делимого будет куда проще.
Уж поверьте тому кто писал на ассемблере свою процедуру извлечения кубического корня из 128 битного числа - разница совсем непринципиальна. Как в сложности кода, так и в скорости работы. Это первое.
Второе, корень считается лишь один раз, а потом делается
каких-то вычислений. Уже при таких соотношениях корень можно вычислять хоть через логарифм с делением и экспоненту, реализованных хоть на перле, всё равно результат будет получен за считанные доли секунды и итоговая скорость существенно не уменьшится. А если Вы хотите и ещё расширять диапазон, то проигрыш будет ещё меньше.
Третье, кубический корень вообще считать не нужно, деление нужно, а корни нет, никакие. Достаточно проверять некоторое простое условие (что точность следующей точки стала достаточной) и переходить от делений к сложениям/вычитаниям. Это уже исключает деления из 99.99% диапазона, а с увеличением чисел и ещё больше.
Четвёртое. Заявления про BigInteger несколько наивны,
итераций ещё можно выполнить за более-менее разумное время (пару недель/месяцев), а вот скажем
- уже нет, даже за тысячу лет. Ну за сотни, если грамотно GPU использовать.
Не цените вы всю красоту целочисленной арифметики и магию цифирь!!! Ой, не цените...
И пятое. Одно из правил оптимизации гласит "избегайте чрезмерной оптимизации". В вашем случае - если расчётный прирост скорости в самом идеальном случае менее 0.1%, то надо остановиться и заняться другими участками кода, оптимизация которых даст на порядки больший выигрыш.
Так что исходная задача
практически решена, а дальше уже извращения ради
любви к искусству спортивного интереса, IMHO.
(PS. Насчёт не ценю целочисленной арифметики)
Ну-ну, вообще-то я
делал например вычисление
d=(a+b)%c за, внимание, 1/16 такта процессора, т.е. 16 чисел за такт!
Или в
следующем сообщении там же пример ускорения кода с делениями с 100-130 тактов на число до 4 чисел на такт. В 500 раз.