Я кодирую большие целые числа в массив из size_t
. У меня уже работают другие операции (добавление, вычитание, умножение); а также деление на одну цифру. Но я хотел бы совместить временную сложность моих алгоритмов умножения, если это возможно (в настоящее время Toom-Cook).Какой алгоритм следует использовать для высокопроизводительного большого целочисленного деления?
Я собираюсь найти линейные алгоритмы времени для принятия различных понятий мультипликативного инверсного моего дивиденда. Это означает, что я мог бы теоретически достичь деления с той же сложностью по времени, что и мое умножение, потому что линейная операция «ничтожно» по сравнению в любом случае.
Мой вопрос: как я на самом деле это делаю? Какой тип мультипликативного обратного лучше всего на практике? Modulo 64^digitcount
? Когда я умножаю мультипликативный обратный на мой делитель, могу ли я уклониться от вычисления части данных, которые будут выбрасываться из-за целостного усечения? Может ли кто-либо предоставить псевдокод C или C++ или дать точное объяснение того, как это должно быть сделано?
Или существует специальный алгоритм разделения, который даже лучше, чем обратный подход?
Редактировать: Я откопал туда, где я получил обратный подход, упомянутый выше. На стр. 312 «Искусство компьютерного программирования, Том 2: Семинумерные алгоритмы», Кнут обеспечивает «Алгоритм R», который является высокоточным обратным. Он говорит, что его временная сложность меньше, чем умножения. Однако нетривиально преобразовать его в C и проверить его, а также неясно, сколько накладных расходов и т. Д. Будет потреблено до тех пор, пока я не закоучу это, что займет некоторое время. Я отправлю его, если никто меня не ударит.
Вы знакомы с асимптотической сложностью этих методов? В терминах количества цифр, переданных в функцию? Для сравнения с O (n^2) умножения на столе и т. Д. – VoidStar
'O (n * log (n))' звучит слишком быстро, это быстрее, чем самое быстрое умножение. Я подозреваю, что по какой-то причине он окажется немного медленнее, но я вернусь к вам, если я смогу понять, почему. – VoidStar
переместил комментарии, чтобы ответить, добавил пример двоичного длинного деления с некоторой информацией ... – Spektre