Алгоритм Шьонхаге — ШтрассенаМетод множення Шенхаге — Штрассена (англ. Schönhage–Strassen algorithm) — алгоритм множення великих цілих чисел, заснований на швидкому перетворенні Фур'є, потребує ) бітових операцій, де — кількість двійкових цифр у добутку[1]. ІсторіяМетод швидкого перетворення Фур'є зі складністю став широко відомим 1965 року після публікації статті Джеймса Кулі та Джона Тьюкі. Застосувати швидке перетворення Фур'є для множення великих чисел запропонував 1968 року Фолькер Штрассен. Разом із Арнольдом Шьоханге вони уточнили метод та опублікували алгоритм 1971 року[2][3]. Ідея алгоритмуФактично — це метод множення многочленів від однієї змінної; перетворюється на алгоритм множення чисел, якщо числа подати як многочлени від основи системи числення, а після отримання добутку многочленів зробити знесення старших розрядів у коефіцієнтах. Наприклад, для множення 157 на 171 (у десятковій системі числення) виконуються такі операції:
АлгоритмОсновний етапом алгоритму є множення чисел a і b по модулю 2N+1:
Оскільки потрібен повний результат множення (а не залишок по модулю), то на N накладають обмеження:
Вхідні числа поділяють на 2k частин розміром M біт кожна (M = N/2k). Це накладає додаткове обмеження на N — воно має націло ділитися на 2k: N=2kM. Після цього обидва числа розглядають як поліноми від однієї змінної — основи системи числення (2M). Для проміжних розрахунків (після перетворення Фур'є) обрати модуль N' з умови N'=2kM', де M' >= 2M + k[4]. Такий вибір N' дозволяє уникнути цілочисельного переповнення.
У коефіцієнтах многочлена-добутку зробити знесення старших розрядів, щоб отримати нормалізований запис числа-добутку в обраній системі числення. Оскільки у швидкому перетворенні Фур'є (як у прямому, так і в оберненому) застосовуються тільки операції додавання, віднімання та зсуву (яким замінено множення на степені двійки), то власне множення в алгоритмі виконується лише на кроці 3. Зокрема, алгоритм дозволяє ефективно множити за модулем чисел Ферма . Оцінка складностіЯк довели у своїй публікації Шенхаге і Штрассен, алгоритм потребує ) бітових операцій, де — кількість двійкових цифр у добутку[2][1]. Порівняння з іншими методамиНа практиці метод Шенхаге — Штрассена починає перевершувати раніше відомі класичні методи, такі як множення Карацуби та алгоритм Тоома — Кука (узагальнення методу Карацуби), починаючи з цілих чисел порядку — (від 10 000 до 40 000 десяткових знаків)[5][6]. Метод вважався асимптотично найшвидшим до винайдення алгоритму Фюрера (2007 рік), який має меншу асимптотичну оцінку: , де log*n — повторний логарифм[7]. Утім, перевага алгоритму Фюрера стає помітною лише для настільки великих чисел, які практично не трапляються. Примітки
|