Довга арифметика

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Довга арифметика — в обчислювальній техніці операції над числами, розрядність яких перевищує довжину машинного слова даної обчислювальної машини. По суті арифметика з великими числами являє собою набір алгоритмів виконання базових операцій (додавання, множення, зведення в степінь …) над числами, реалізованими не апаратно, а програмно, використовуючи більш базові апаратні засоби роботи з числами менших порядків. Окремий випадок - арифметика довільної точності — відноситься до арифметики, в якій довжина чисел обмежена тільки об'ємом доступної пам'яті.

Основні споживачі[ред.ред. код]

  • Комп'ютери низької розрядності, мікроконтролери. Наприклад, мікроконтролери серії AVR мають 8-бітний регістр і 10-бітний АЦП — так що при обробці інформації з АЦП без довгої арифметики не обійтися.
  • Криптографія. Зокрема довга арифметика застосовується в алгоритмах авторизації по відкритому ключу — таких, як RSA і Diffie-Hellman. З метою запобігання відомих атак, розміри чисел повинні перевищувати 10 309 . Втім досить поширені мови програмування, такі як ISO C і JAVA, вміють працювати тільки з числами, заданої десятковій точності. Зокрема для C99 максимальна довжина вбудованого типу даних long long не перевищує число 10 19 . Втім у деяких інших мовах програмування, таких як Python, є вбудовані бібліотеки роботи з великими числами.
  • Математичне та фінансове ПЗ, яке вимагає, щоб результат обчислення на комп'ютері збігся до останнього розряду з результатом обчислення на папері. Зокрема, калькулятор Windows (починаючи з Windows 95).
  • Числа з плаваючою комою. У комп'ютерах числа з плаваючою комою представлені у вигляді n = s * m * b x , де n — саме число, s — знак числа, m — мантиса, b — підстава показової функції, x — показник степеня. При обробці чисел підвищеної точності, розміри мантиси можуть перевищити апаратно допустимі норми. У цих випадках для роботи з мантисами можна використовувати алгоритми роботи з великими числами.

Порядок слів[ред.ред. код]

Незалежно від порядку байтів машини, в довгій арифметиці існує порядок слів (з початку або з кінця). Найчастіше використовують зворотний порядок (з кінця) — операції над довгими числами виконуються саме з кінця.

Реалізація в мовах програмування[ред.ред. код]

Як говорилося вище, мови програмування мають вбудовані типи даних, розмір яких, в основному, не перевищує 64 біта.
Десяткова довга арифметика була реалізована в мові програмування Алмір-65 на ЕОМ МИР-1 і в мові програмування АНАЛІТИК на ЕОМ МИР-2.
Для роботи з великими числами, однак, існує досить багато готових оптимізованих бібліотек для довгої арифметики.

  • GMP
  • LibTomMath

У більшості мов високого рівня існує арифметика довжиною у два слова. Більш довгу арифметику зазвичай доводиться писати своїми силами, в міру можливості оптимізуючи на асемблері — в мовах високого рівня таких абстракцій, як «реєстрова пара» і «біт перенесення», зазвичай немає.

У Turbo Pascal існував шестибайтовий емулюючий дробовий тип — RealDelphi перейменований в Real48). Обчислення з ним також проводилися за допомогою довгої арифметики.

Необхідні апаратні засоби для роботи з довгою арифметикою[ред.ред. код]

Строго кажучи, для реалізації арифметики довільної точності від процесора вимагається лише непряма адресація; в арифметиці фіксованої точності можна обійтися навіть без неї. Тим не менше, певні функції процесора прискорюють довгу арифметику, одночасно спрощуючи її програмування.

Алгоритми[ред.ред. код]

Алгоритми множення[ред.ред. код]

Базовий[ред.ред. код]

Являє собою алгоритм по-шкільному методом «в стовпчик». Займає час O (N * M), де N, M — розміри перемножуваних чисел.

Множення Карацуби[ред.ред. код]

Даний алгоритм являє собою найбільш просту реалізацію ідеї поділу вхідних даних, яка стала базисною для нижчеперелічених алгоритмів.

FFT Multiplication[ред.ред. код]

Алгоритм FFT перемноження використовується для великих і дуже великих чисел. Опис даного алгоритму можна знайти в різних джерелах, зокрема Кнут секція 4.3.3 частина С, або Lipson глава 9. Далі наводиться опис алгоритму. Нехай в перемножуванні бере участь два числа x і y за модулем 2 N +1: x * y mod 2 ^ N +1. Якщо ми хочемо отримати результат «чистого» перемноження без модуля, то на N варто накласти наступне обмеження:

N> = bits (x) + bits (y)

Алгоритм використовує операції поділу, поелементного множення, інтерполяції та сполуки, такі ж як і в алгоритмах Карацуби. Параметр k контролює поділ вхідних даних на 2 k частин, причому Рамерії M = N / 2 k кожна. Це накладає обмеження на N. Воно має ділитися без остачі. Всі обчислення, поточечной перемноження виконуються по модулю 2 N ', де N' = 2 * M + k + 3 — число, округлене до твору числа 2 k на процесорний розмір елементів в бітах. Результат інтерполяції можна представити в наступному вигляді, де вибір N 'дозволяє проводити розрахунки без усікання.  w [n] = \ sum_ {i + j = b * 2 ^ k + n} ^ {b = 0,1} (-1) ^ b * x [i] * y [i] .
Як і в попередніх алгоритмах, для того, що б вирішити дану систему, можна використовувати наступні точки: g ^ i, де і змінюється від 0 до 2 k −1, а g = 2 (2N '/ 2 k ) . g є 2 k -им коренем одиниці по модулю 2 N ' +1. Ці точки гарантують, що система буде дозволена. Таким чином в Фур'є перетворенні використовуються тільки зрушення, додавання і заперечення.

Other Multiplication[ред.ред. код]

Алгоритми ділення[ред.ред. код]

    • Single Limb Division
    • Basecase Division
    • Divide and Conquer Division
    • Block-Wise Barrett Division
    • Exact Division
    • Exact Remainder
    • Small Quotient Division


Комп'ютер Це незавершена стаття про комп'ютери.
Ви можете допомогти проекту, виправивши або дописавши її.