Длинная арифметика | это... Что такое Длинная арифметика? (original) (raw)
Длинная арифметика — в вычислительной технике операции над числами, разрядность которых превышает длину машинного слова данной вычислительной машины. По сути арифметика с большими числами представляет собой набор алгоритмов выполнения базовых операций (сложение, умножение, возведение в степень…) над числами, реализованными не аппаратно, а программно, используя более базовые аппаратные средства работы с числами меньших порядков. Частный случай — арифметика произвольной точности — относится к арифметике, в которой длина чисел ограничена только объёмом доступной памяти.
Содержание
- 1 Основные потребители
- 2 Необходимые аппаратные средства для работы с длинной арифметикой
- 3 Реализация в языках программирования
- 4 Алгоритмы
- 4.1 Алгоритмы умножения
* 4.1.1 Базовый
* 4.1.2 Умножение Карацубы
* 4.1.3 Toom 3-Way
* 4.1.4 Toom 4-Way
* 4.1.5 Алгоритм Тоом-а для произвольного разбиения
* 4.1.6 Перемножение методом Фурье - 4.2 Алгоритмы деления
- 4.3 Алгоритмы возведения в степень
- 4.4 Алгоритмы извлечения корня
- 4.5 Алгоритмы преобразования системы счисления
- 4.6 Другие алгоритмы
- 4.1 Алгоритмы умножения
- 5 Литература
Основные потребители
- Компьютеры низкой разрядности, микроконтроллеры. Например, микроконтроллеры серии AVR имеют 8-битный регистр и 10-битный АЦП — так что при обработке информации с АЦП без длинной арифметики не обойтись.
- Криптография. Большинство систем шифрования данных, а также систем цифрофой подписи данных используют целочисленную арифметику по модулю m, где m - очень большое положительное натуральное чисто, не обязательно простое. Для примера RSA[1], Rabin[2] или Эль Гамаль[3] требуют наличие эффективных методов для операций перемножения и возведения в степень для чисел, имеющих порядки 10309. Впрочем довольно распространенные языки программирования, такие как ISO C и JAVA, умеют работать только с числами, заданной десятичной точности. В частности для C99 максимальная длина встроенного типа данных long long не превышает число 1019. Впрочем в некоторых других языках программирования, таких как Python, имеются встроенные библиотеки работы с большими числами.
- Математическое и финансовое ПО, требующее, чтобы результат вычисления на компьютере совпал до последнего разряда с результатом вычисления на бумаге. В частности, калькулятор Windows (начиная с Windows 95).
- Числа с плавающей запятой. В компьютерах числа с плавающей запятой представлены в виде n = s*m*bx, где n — само число, s — знак числа, m — мантисса, b — основание показательной функции, x - показатель степени. При обработке чисел повышенной точности, размеры мантиссы могут превысить аппаратно допустимые нормы. В этих случаях для работы с мантиссой можно использовать алгоритмы работы с большими числами.
- Одна из излюбленных тем спортивного программирования. С распространением стандартных библиотек для работы с длинными числами постепенно сходит на нет.
Необходимые аппаратные средства для работы с длинной арифметикой
Строго говоря, для реализации арифметики произвольной точности от процессора требуется лишь косвенная адресация; в арифметике фиксированной точности можно обойтись даже без неё. Тем не менее, определённые функции процессора ускоряют длинную арифметику, одновременно упрощая её программирование.
- Флаг переноса. Операции «сложить/вычесть с переносом», «циклический сдвиг через бит переноса».
- Автоинкрементные и автодекрементные операции доступа к памяти.
Реализация в языках программирования
Как говорилось выше, языки программирования имеют встроенные типы данных, размер которых, в основном, не превышает 64 бита.
Десятичная длинная арифметика была реализована в языке программирования АЛМИР-65 на ЭВМ МИР-1 и в языке программирования АНАЛИТИК на ЭВМ МИР-2.
Для работы с большими числами, однако, существует довольно много готовых оптимизированных библиотек для длинной арифметики.
- GMP
- LibTomMath
Алгоритмы
Алгоритмы умножения
Базовый
Представляет собой алгоритм по школьному методу «в столбик». Занимает время O(N*M), где N, M — размеры перемножаемых чисел. Его алгоритм подробно описан в книге [1]. Секция 4.3.1.
Умножение Карацубы
Этот алгоритм также описан в [1]. Секция 4.3.3, часть А[4]. Данный алгоритм представляет собой наиболее простую реализацию идеи разделения входных данных, которая стала базисной для нижеперечисленных алгоритмов.
Toom 3-Way
Идея впервые была предложена А. Л. Тоомом в [3], и заключается в разделении входных данных (множителей) на 3 равные части(для простоты все части считаем равными).
Рассмотрим данный алгоритм на следующем примере. Пусть дано два числа Y и X. Пусть определены операции над числами, размер которых равен 1/3 от размеров исходных чисел (см. рисунок). (предположим также, что числа занимают равную память и делятся ровно на 3 части, в противном случае дополним оба числа нулями до необходимых размеров.
Затем происходит отображение (параметризация) этих частей на полиномы 2 степени.
Введем , по определению такую,что значение многочленов
соответственно равно входным числам
и
. Для битового представления чисел это число равно возведению 2 в степень, равную длине каждой из частей в битах.
Также введем полином: (1).
После того как будут определены элементы - коэффициенты многочлена
, они будут использованы в целях получения
, так как
. Размер коэффициентов
в 2 раза больше (по памяти), чем разбиение
или
. Конечное число, равное произведению
можно найти, кладывая
со сдвигом, как показано на рисунке ниже.
Коэффициенты могут быть вычислены следующим образом:
и так далее, но это потребует все 9 перемножений:
для i, j=0,1,2, и будет эквивалентен простому перемножению. Вместо этого был использован иной подход.
вычисляются в (1) в 5 точках при разных
.
В таблице, представленной ниже, приведены значения полиномов в равенстве (1)
Параметр t=inf условный. Он означает банальное равенство коэффициентов при , тем самым мы полум значение
сразу. Данная система линейна относительно 5 неизвестных. При ее разрешении мы получаем неизвестные
. Далее получаем значение многочлена, как было описано выше.
Toom 4-Way
Алгоритм Тоом-а для произвольного разбиения
Алгоритм Тоома для разделения входных чисел на n операндов эквивалентен описанному выше. В общем случае разделение двух одинаково длинных операндов на r частей приводит к вычислению значений в 2*r-1 точках. В качестве точек для решения системы, обычно берут 0, inf, +1, −1 and ±2^i, ±2^-i.
Перемножение методом Фурье
Данный алгоритм перемножения используется для больших и очень больших чисел. Описание данного алгоритма можно найти в различных источниках, в частности [1] секция 4.3.3 часть С[5], или Lipson глава 9. Далее приводится описание алгоритма.
Данный вид алгоритма перемножения двух чисел , за время , где
– количество значащих цифр в перемножаемых числах (предполагая их равными), приписывается Кули (Coolet) и Таки (Tukey) — 1965 г. Также есть предположения, что данный алгоритм был известен и раньше, но не имел большой важности до того как изобрели первые компьютеры. Вероятными кандидатами изобретения данного алгоритма также называют Рунг (Runge) и Кёниг (Konig) - 1924 г., а также Гаусса – 1805г.
Пусть имеется число, представим его в виде многочлена, как мы делали ранее. Назовем этот многочлен . Также введем дискретное Фурье [6]преобразование многочлена как вектор [7] , с координатами
. Где
определены как
– комплексный корень
-ой степени из 1, не равный 1[8]. Дело в том, что комплексный корень из 1 определен с точностью до фазового множителя, количество этих корней –
. [9] Фурье преобразование применено для того, чтобы свертку[10] коэффициентов многочленов А и В:
– заменить на произведение их Фурье образов.
,
где под умножением F (A) * F (B) подразумевается скалярное произведение векторов.
Предположим, что n есть степень двойки.
Нахождение F(A) производится рекурсивным методом (разделяй и властвуй). Идея заключается в разбиении исходного многочлена на два многочлена,
Тогда .
Заметим, что среди всех чисел (0 <= i <
), только
различных. Поэтому, ДПФ
и
будут
-элементными. А так как ДПФ A0 и A1 состоит из
элементов, то комплексным корнем из 1 там будет корень степени
.
Значит, , где 0 <= k < n / 2 и
.
Мы использовали свойства комплексных чисел: различных корней степени n всего n. .
Получаем рекурсивный алгоритм:
ДПФ одного элемента равно этому элементу
для нахождения ДПФ A разбиваем коэффициенты A на чётные и нечётные, получаем два многочлена A0 и A1, находим ДПФ для них, находим ДПФ A:
для 0 <= k < n / 2.
Существует доказательство следующего утверждения: Обратное ДПФ находится аналогично прямому ДПФ, за исключением того, что в качестве точек беруться точки, симметричные относительно вещественной оси, вместо тех, что использовались в прямом ДПФ преобразовании. Также необходимо все коэффициенты многочлена поделить на n
Алгоритмы деления
Алгоритмы возведения в степень
Алгоритмы извлечения корня
Алгоритмы преобразования системы счисления
Другие алгоритмы
Литература
- Donald E. Knuth, «The Art of Computer Programming», volume 2, «Seminumerical Algo-rithms», 3rd edition, Addison-Wesley, 1998Искусство программирования
- Dan Zuras, «On Squaring and Multiplying Large Integers», ARITH-11: IEEE Symposium on Computer Arithmetic, 1993, pp. 260 to 271.
- ДАН СССР 150 (1963), 496—498
![]() |
Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её. Это примечание по возможности следует заменить более точным. |
---|
![]() |
|
---|---|
Неинтерпретируемые | Бит • Ниббл • Байт • Трит • Трайт • Слово |
Числовые | Целый • С фиксированной запятой • С плавающей запятой • Рациональный • Комплексный • Длинный • Интервальный |
Текстовые | Символьный • Строковый |
Указатель | Адрес • Ссылка |
Композитные | Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Кортеж • Объект • Option type • Product • Структура • Множество • Объединение (tagged) |
Другие | Логический • Низший тип • Коллекция • Перечисляемый тип • Исключение • First-class function • Opaque data type • Recursive data type • Семафор • Поток • Высший тип • Type class • Unit type • Void |
Связанные темы | Абстрактный тип данных • Структура данных • Интерфейс • Kind (type theory) • Примитивный тип • Subtyping • Шаблоны C++ • Конструктор типа • Parametric polymorphism |