Какой самый быстрый алгоритм деления сумасшедших больших целых чисел?

Мне нужно разделить числа, представленные в виде цифр в массивах байтов, с нестандартным количеством байтов. Это может быть 5 байт или 1 ГБ или больше. Деление должно выполняться с числами, представленными в виде байтовых массивов, без каких-либо преобразований в числа.


person Kosmo零    schedule 26.06.2013    source источник
comment
en.wikipedia.org/wiki/Barrett_reduction   -  person Regenschein    schedule 26.06.2013
comment
Что-то вроде Java BigInteger?   -  person Bernhard Barker    schedule 26.06.2013
comment
Сокращение Барретта вычисляет модуль, а не частное.   -  person Tyler Durden    schedule 26.06.2013
comment
Может ли Java BigInteger обрабатывать гигабайты?   -  person Kosmo零    schedule 26.06.2013
comment
ОП не говорит, что использует Java. Реализация математики произвольной точности в Java относительно неэффективна, но может обрабатывать миллиарды цифр, если у вас достаточно памяти. Чтобы вычислить частное, потребуется много времени.   -  person Tyler Durden    schedule 26.06.2013
comment
Для общих вопросов, подобных этому, вы должны использовать Википедию и приходить сюда ПОСЛЕ того, как вы прочитали Википедию и попробовали что-то.   -  person Tyler Durden    schedule 26.06.2013
comment
@Kosmos Он должен поддерживать столько чисел, сколько поместится в памяти. Но я ссылался на это больше как на отправную точку. Код API Java имеет открытый исходный код, так что вы можете посмотреть, как они это сделали.   -  person Bernhard Barker    schedule 26.06.2013
comment
возможный дубликат алгоритма деления очень больших чисел   -  person Tyler Durden    schedule 26.06.2013
comment
википедия не отвечает на вопросы какой самый быстрый. Мне не нужны подразделения, которые должны работать сутки.   -  person Kosmo零    schedule 26.06.2013
comment
BigInteger - довольно плохая вещь, если вы хотите, чтобы ваши операции были быстрыми. Умножение и деление выполнены по школьной программе в канонической реализации.   -  person tmyklebu    schedule 26.06.2013
comment
@Tyler: ... и он получает остаток, сначала вычисляя частное, а затем вычитая соответствующее кратное делителя.   -  person    schedule 05.10.2015


Ответы (2)


Деление по принципу «разделяй и властвуй» оказывается намного быстрее, чем метод школьных учебников для действительно больших целых чисел.

GMP — это современная библиотека больших чисел. Почти для всего у него есть несколько реализаций различных алгоритмов, каждая из которых настроена на определенные размеры операндов.

Здесь представлена ​​документация GMP по "алгоритмам деления". Описания алгоритмов немного кратки, но они, по крайней мере, дают вам что-то для поиска в Google, когда вы хотите узнать больше.

Брент и Циммерманн "Современная компьютерная арифметика" — хорошая книга по теория и реализация арифметики больших чисел. Вероятно, стоит прочитать, если вы хотите знать, что известно.

person tmyklebu    schedule 26.06.2013
comment
Да, но... как я уже сказал, эти алгоритмы НАМНОГО сложнее, чем алгоритм D. Основная причина использования "разделяй и властвуй" заключается в том, что вы можете использовать алгоритм Карацубы, и позвольте мне рассказать вам, как написать все это плюс реализацию Карацубы. будет МНОГО работы, и я имею в виду МНОГО МНОГО работы. Я не знаю, насколько хорошим программистом является OP, но даже очень хороший программист может потратить МЕСЯЦЫ на написание правильной реализации, используя разделяй и властвуй. - person Tyler Durden; 26.06.2013
comment
@TylerDurden: Ну, он спросил о безумно больших числах. Карацуба сама по себе неплоха, так как вы не сталкиваетесь с проблемами степени двойки. Это становится большой работой, когда вы начинаете хотеть реализовать Toom-Cook и различные методы на основе БПФ, а затем выяснять точки пересечения. Вот почему вы используете GMP для этого :) - person tmyklebu; 26.06.2013
comment
@TylerDurden: И деление по принципу «разделяй и властвуй» совсем не так уж плохо, если у вас есть черный ящик быстрого умножения. Возьмите старшую половину числителя и знаменателя, рекурсивно разделите, а затем выполните небольшую очистку. Опять же, настройка и поиск точки пересечения между учебником и принципом «разделяй и властвуй» — немалая работа. - person tmyklebu; 26.06.2013

Стандартный алгоритм деления в длину, аналогичный алгоритму деления в длину в начальной школе, представляет собой алгоритм D, описанный в Кнуте 4.3.1. Кнут подробно обсуждает деление в этом разделе своей книги. В результате есть более быстрые методы, чем алгоритм D, но они ненамного быстрее и намного сложнее, чем алгоритм D.

Если вы решили получить максимально быстрый алгоритм, вы можете прибегнуть к тому, что известно как алгоритм SRT.

Все это и многое другое описано в Алгоритме деления в Википедии.

person Tyler Durden    schedule 26.06.2013
comment
Из алгоритмов, перечисленных по ссылке в Википедии, вы, вероятно, обнаружите, что должное деление является наиболее полезным. Однако будьте осторожны с обозначениями. D(0) указывает на наименее значащее значение в числе, а сдвиг влево предполагает, что числа хранятся с обратным порядком байтов (что означает, что LSD должен быть в D(n-1) ). - person Python Cheese; 14.04.2017