Каков наиболее эффективный способ вычисления произведения
a1 b2 c3 d4 e5 .. .
если предположить, что возведение в квадрат стоит примерно вдвое меньше, чем умножение? Количество операндов меньше 100.
Существует ли простой алгоритм для случая, когда время умножения пропорционально квадрату длины операнда (как в случае java.math.BigInteger
)?
Первый (и единственный) ответ идеален. количество операций.
Как ни странно, применительно к значительным BigInteger
эта часть вообще не имеет значения. Даже вычисление abbcccdddddeeeee без каких-либо оптимизаций занимает примерно столько же времени.
Большая часть времени тратится на окончательное умножение (BigInteger
не реализует ни один из более умных алгоритмов, таких как Карацуба, Тум-Кук или БПФ, поэтому время квадратично). Важно убедиться, что промежуточные множители имеют примерно одинаковый размер, т. е. заданы числа p, q, r, s примерно одинакового размера, вычисление (pq) (rs) i> обычно быстрее, чем ((pq) r) s. Соотношение скоростей примерно 1:2 для нескольких десятков операндов.
Обновлять
В Java 8 в BigInteger
есть как умножения Карацубы, так и умножения Тум-Кука.
O(N log(N)^2)
(где N — размер конечного числа). Но для этого вам нужно выйти за рамкиjava.math.BigInteger
. - person Mysticial   schedule 26.10.2012BigInteger
s, но в настоящее время я не знаю, насколько они велики. - person maaartinus   schedule 26.10.2012BigInteger implements none of the smarter algorithms like Karatsuba, Toom–Cook, or FFT, so the time is quadratic
к какой реализацииjava.math.BigInteger
это относится/применяется? - person greybeard   schedule 21.07.2019