Алгоритм Шьонхаге — Штрассена

Метод множення Шенхаге — Штрассена (англ. Schönhage–Strassen algorithm) — алгоритм множення великих цілих чисел, заснований на швидкому перетворенні Фур'є, потребує ) бітових операцій, де  — кількість двійкових цифр у добутку[1].

Історія

Метод швидкого перетворення Фур'є зі складністю став широко відомим 1965 року після публікації статті Джеймса Кулі та Джона Тьюкі.

Застосувати швидке перетворення Фур'є для множення великих чисел запропонував 1968 року Фолькер Штрассен. Разом із Арнольдом Шьоханге вони уточнили метод та опублікували алгоритм 1971 року[2][3].

Ідея алгоритму

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

  • подається як , а  — як , де ;
  • за допомогою швидкого перетворення Фур'є перемножуються многочлени і (результат: );
  • застосовується знесення старших розрядів у коефіцієнтах многочлена-добутку: .
    Результат: .

Алгоритм

Основний етапом алгоритму є множення чисел a і b по модулю 2N+1:

c = a * b (mod 2N+1)
Підготовчий етап (встановлення параметрів)

Оскільки потрібен повний результат множення (а не залишок по модулю), то на N накладають обмеження:

a*b < 2N+1, тобто, N >= bits(a) + bits(b)

Вхідні числа поділяють на 2k частин розміром M біт кожна (M = N/2k). Це накладає додаткове обмеження на N — воно має націло ділитися на 2k: N=2kM. Після цього обидва числа розглядають як поліноми від однієї змінної — основи системи числення (2M).

Для проміжних розрахунків (після перетворення Фур'є) обрати модуль N' з умови N'=2kM', де M' >= 2M + k[4]. Такий вибір N' дозволяє уникнути цілочисельного переповнення.

Основний етап (обчислення добутку поліномів методом згортки)
  1. Обчислити значення поліномів-множників (Ai, Bi) у точках gi, де:
    • g = 2(2N' / 2k)
    • i = 0 .. 2k-1.
    такий вибір точок спрощує подальшу інтерполяцію (на кроці 5)
  2. Для обох наборів обчислених значень (Ai, Bi) виконати дискретне перетворення Фур'є в кільці :
    оскільки в обох наборах по 2k значень, застосовується швидке перетворення Фур'є
  3. Обчислити образ добутку шляхом попарного множення:
    попарне множення виконується по модулю 2N';
    воно потребує D=2k множень (замість D2 у звичайному алгоритмі множення поліномів)
  4. До образу застосувати обернене перетворення Фур'є:
  5. Побудувати поліном-добуток за його значеннями в 2k точках () шляхом інтерполяції.
Завершальний етап (нормалізація результату)

У коефіцієнтах многочлена-добутку зробити знесення старших розрядів, щоб отримати нормалізований запис числа-добутку в обраній системі числення.

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

Зокрема, алгоритм дозволяє ефективно множити за модулем чисел Ферма .

Оцінка складності

Як довели у своїй публікації Шенхаге і Штрассен, алгоритм потребує ) бітових операцій, де  — кількість двійкових цифр у добутку[2][1].

Порівняння з іншими методами

На практиці метод Шенхаге — Штрассена починає перевершувати раніше відомі класичні методи, такі як множення Карацуби та алгоритм Тоома — Кука (узагальнення методу Карацуби), починаючи з цілих чисел порядку (від 10 000 до 40 000 десяткових знаків)[5][6].

Метод вважався асимптотично найшвидшим до винайдення алгоритму Фюрера (2007 рік), який має меншу асимптотичну оцінку: , де log*n — повторний логарифм[7]. Утім, перевага алгоритму Фюрера стає помітною лише для настільки великих чисел, які практично не трапляються.

Примітки

  1. а б Bürgisser P., Clausen M., Shokrollahi A. Algebraic Complexity Theory. — Berlin : Springer-Verlag, 1997. — 618 p. — ISBN 3-540-60582-7..
  2. а б Knuth, 2008, Section 4.3.3 С.
  3. Schönhage A., Strassen V. Schnelle Multiplikation großer Zahlen // Computing. — 1971. — № 7. — С. 281—292.
  4. У реалізаціях алгоритму N' зазвичай збільшують до найближчого добутку 2k на розмір машинного слова в бітах.
  5. Meter van R., Itoh K. M. Fast quantum modular exponentiation // Physical Review A. — 2005. — Т. 71. Архівовано з джерела 7 лютого 2006. Процитовано 2023-05-28. [Архівовано 2006-02-07 у Wayback Machine.]
  6. Coronado García L. C. Can Schönhage multiplication speed up the RSA encryption or decryption? // University of Technology. — Darmstadt, 2005. Архівовано з джерела 29 грудня 2009. Процитовано 2023-05-28. [Архівовано 2009-12-29 у Wayback Machine.]
  7. Fürer M. Faster integer multiplication // STOC 2007 Proceedings. — 2007. — С. 57—66. Архівовано з джерела 25 квітня 2013.