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

Материал из testwiki
Перейти к навигации Перейти к поиску

Метод умножения Шёнхаге — Штрассена (Шаблон:Lang-en) — алгоритм умножения больших целых чисел, основанный на быстром преобразовании Фурье, требует O(NlogNloglogN) битовых операций, где N — количество двоичных цифр в произведении[1].

Изобретён Арнольдом Шёнхаге и Фолькером Штрассеном в 1971 году[2].

Фактически является методом умножения многочленов от одной переменной, превращается в алгоритм умножения чисел, если эти числа представить как многочлены от основы системы счисления, а после получения результата сделать переносы через разряды. Например, для перемножения 157 и 171 (в десятичной системе счисления) выполняются следующие операции:

  • представляется 157 как x2+5x+7, а 171 — как x2+7x+1, где x=10;
  • перемножаются многочлены x2+5x+7 и x2+7x+1 с помощью быстрого преобразования Фурье, результат — x4+12x3+43x2+54x+7;
  • применяются переносы через разряды: 2x4+6x3+8x2+4x+7, то есть 26847.

Также в алгоритме можно умножать по модулю чисел Ферма 22n+1, если применять двоичную систему счисления.

Метод считался асимптотически быстрейшим методом с 1971 до 2007 годы, пока не был изобретён алгоритм Фюрера с лучшей оценкой сложности[3]. На практике метод Шёнхаге — Штрассена начинает превосходить более ранние классические методы, такие как умножение Карацубы и алгоритм Тоома — Кука (обобщение метода Карацубы), начиная с целых чисел порядка 10100001040000 (от 10 000 до 40 000 десятичных знаков)[4][5][6].

Примечания

Шаблон:Примечания

Шаблон:Теоретико-числовые алгоритмы