WikiDer > Умножение Тоома – Кука

Toom–Cook multiplication

Тоом – Кук, иногда известный как Тоом-3, названный в честь Андрей Тоом, который представил новый алгоритм с его низкой сложностью, и Стивен Кук, кто чистил описание этого, является алгоритм умножения для больших целых чисел.

Учитывая два больших целых числа, а и б, Тоом – Кук разделяется а и б в k меньшие части каждой длины л, и выполняет операции над деталями. В качестве k растет, можно комбинировать множество подопераций умножения, тем самым уменьшая общую сложность алгоритма. Затем подоперации умножения можно вычислить рекурсивно, снова используя умножение Тоома – Кука и так далее. Хотя термины «Тоом-3» и «Тоом-Кук» иногда неправильно используются как взаимозаменяемые, «Тоом-3» - это всего лишь единственный экземпляр алгоритма Тоома-Кука, где k = 3.

Toom-3 уменьшает 9 умножений до 5 и выполняется за Θ (пжурнал (5) / журнал (3)) ≈ Θ (п1.46). В общем, Тоом-k вбегает Θ (c(k) пе), куда е = журнал (2k - 1) / журнал (k), пе время, затрачиваемое на подумножение, и c время, затрачиваемое на сложение и умножение на малые константы.[1] В Алгоритм Карацубы является частным случаем Тоома – Кука, где число делится на два меньших. Он уменьшает 4 умножения до 3 и поэтому работает в (пжурнал (3) / журнал (2)) ≈ Θ (п1.58). Обычное длинное умножение эквивалентно Toom-1 со сложностью Θ (п2).

Хотя показатель степени е можно установить произвольно близким к 1, увеличив k, функция c к сожалению очень быстро растет.[1][2] Темпы роста для смешанных схем Тоома – Кука все еще оставались открытой проблемой исследования в 2005 году.[3] Реализация, описанная Дональд Кнут достигает временной сложности Θ (п 22 журнала п бревно п).[4]

Из-за накладных расходов Toom – Cook работает медленнее, чем длинное умножение на маленькие числа, и поэтому обычно используется для умножений промежуточного размера, прежде чем асимптотически более быстрое Алгоритм Шёнхаге – Штрассена (со сложностью Θ (п бревно п журнал журнал п)) становится практичным.

Тоом впервые описал этот алгоритм в 1963 году, а Кук опубликовал улучшенный (асимптотически эквивалентный) алгоритм в своей докторской диссертации в 1966 году.[5]

Подробности

В этом разделе обсуждается, как именно выполнять Toom-k для любого заданного значения k, и является упрощением описания умножения многочленов Тоома – Кука, описанного Марко Бодрато.[6] Алгоритм состоит из пяти основных шагов:

  1. Расщепление
  2. Оценка
  3. Точечное умножение
  4. Интерполяция
  5. Перекомпоновка

В типичной реализации большого целого числа каждое целое число представлено как последовательность цифр в позиционная запись, с основанием или системой счисления, установленной на некоторое (обычно большое) значение б; в этом примере мы используем б = 10000, так что каждая цифра соответствует группе из четырех десятичных цифр (в компьютерной реализации б обычно будет степенью 2). Скажем, умножаются два целых числа:

м=1234567890123456789012
п=987654321987654321098.

Они намного меньше, чем обычно обрабатываются с помощью Тоома – Кука (умножение в начальной школе будет быстрее), но они служат для иллюстрации алгоритма.

Расщепление

Первым делом нужно выбрать базу B = бя, так что количество цифр обоих м и п в базе B самое большее k (например, 3 в Toom-3). Типичный выбор для я дан кем-то:

В нашем примере мы будем делать Toom-3, поэтому выбираем B = б2 = 108. Затем мы отделяем м и п в их базу B цифры мя, пя:

Затем мы используем эти цифры в качестве коэффициентов в градусах.(k − 1) многочлены п и q, со свойством, что п(B) = м и q(B) = п:

Цель определения этих многочленов состоит в том, что если мы можем вычислить их произведение р(Икс) = п(Икс)q(Икс)наш ответ будет р(B) = м × п.

В случае, когда умножаемые числа имеют разный размер, полезно использовать разные значения k за м и п, который мы назовем kм и kп. Например, алгоритм «Тоом-2.5» относится к Тоом-Куку с kм = 3 и kп = 2. В этом случае я в B = бя обычно выбирают:

Оценка

Подход Тоома – Кука к вычислению полиномиального произведения п(Икс)q(Икс) является широко используемым. Отметим, что многочлен степени d однозначно определяется d +1 балл (например, линия - многочлен первой степени задана двумя точками). Идея состоит в том, чтобы оценить п(·) и q(·) В разных точках. Затем умножьте их значения в этих точках, чтобы получить баллы на полиноме произведения. Наконец, интерполируйте, чтобы найти его коэффициенты.

С град (pq) = град (п) + град (q), нам понадобится град (п) + град (q) + 1 = kм + kп − 1 баллы для определения окончательного результата. Назовите это d. В случае с Тоом-3, d = 5. Алгоритм будет работать независимо от того, какие точки выбраны (за некоторыми небольшими исключениями, см. Требование обратимости матрицы в Интерполяция), но в интересах упрощения алгоритма лучше выбирать небольшие целые значения, такие как 0, 1, −1 и −2.

Одно необычное значение точки, которое часто используется, - это бесконечность, обозначаемая как ∞ или 1/0. Чтобы «вычислить» полином п на бесконечности на самом деле означает взять предел п(Икс)/Иксград п в качестве Икс уходит в бесконечность. Как следствие, п(∞) всегда является значением его коэффициента наивысшей степени (в приведенном выше примере коэффициент m2).

В нашем примере Toom-3 мы будем использовать точки 0, 1, −1, −2 и ∞. Эти варианты упрощают оценку, создавая формулы:

и аналогично для q. В нашем примере мы получаем следующие значения:

п(0)=м0=56789012=56789012
п(1)=м0 + м1 + м2=56789012 + 78901234 + 123456=135813702
п(−1)=м0м1 + м2=56789012 − 78901234 + 123456=−21988766
п(−2)=м0 − 2м1 + 4м2=56789012 − 2 × 78901234 + 4 × 123456=−100519632
п(∞)=м2=123456=123456
q(0)=п0=54321098=54321098
q(1)=п0 + п1 + п2=54321098 + 43219876 + 98765=97639739
q(−1)=п0п1 + п2=54321098 − 43219876 + 98765=11199987
q(−2)=п0 − 2п1 + 4п2=54321098 − 2 × 43219876 + 4 × 98765=−31723594
q(∞)=п2=98765=98765.

Как показано, эти значения могут быть отрицательными.

В целях дальнейшего объяснения будет полезно рассматривать этот процесс оценки как умножение матрицы на вектор, где каждая строка матрицы содержит степени одной из точек оценки, а вектор содержит коэффициенты полинома:

Размеры матрицы d к kм за п и d к kп за q. Строка для бесконечности всегда равна нулю, за исключением 1 в последнем столбце.

Быстрая оценка

Многоточечную оценку можно получить быстрее, чем с помощью приведенных выше формул. Количество элементарных операций (сложение / вычитание) можно уменьшить. Последовательность, данная Бодрато[6] для Toom-3, выполняемый здесь над первым операндом (полиномом п) работающего примера выглядит следующим образом:

п0м0 + м2=56789012 + 123456=56912468
п(0)=м0=56789012=56789012
п(1)=п0 + м1=56912468 + 78901234=135813702
п(−1)=п0м1=56912468 − 78901234=−21988766
п(−2)=(п(−1) + м2) × 2 − м0=(− 21988766 + 123456 ) × 2 − 56789012=− 100519632
п(∞)=м2=123456=123456.

Эта последовательность требует пяти операций сложения / вычитания, на одну меньше, чем простая оценка. Кроме того, умножение на 4 при вычислении п(−2) было сохранено.

Точечное умножение

В отличие от умножения многочленов п(·) и q(·), Умножая оцененные значения п(а) и q(а) просто включает в себя умножение целых чисел - меньший вариант исходной задачи. Мы рекурсивно вызываем нашу процедуру умножения, чтобы умножить каждую пару оцененных точек. В практических реализациях, когда операнды становятся меньше, алгоритм переключается на учебник длинное умножение. Сдача р - полином произведения, в нашем примере:

р(0)=п(0)q(0)=56789012 × 54321098=3084841486175176
р(1)=п(1)q(1)=135813702 × 97639739=13260814415903778
р(−1)=п(−1)q(−1)=−21988766 × 11199987=−246273893346042
р(−2)=п(−2)q(−2)=−100519632 × −31723594=3188843994597408
р(∞)=п(∞)q(∞)=123456 × 98765=12193131840.

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

Интерполяция

Это наиболее сложный этап, обратный этапу оценки: учитывая наши d точки на полиноме произведения р(·), Нам нужно определить его коэффициенты. Другими словами, мы хотим решить это матричное уравнение для вектора в правой части:

Эта матрица построена так же, как и на этапе оценки, за исключением того, что она d × d. Мы могли бы решить это уравнение с помощью такой техники, как Гауссово исключение, но это слишком дорого. Вместо этого мы используем тот факт, что при правильном выборе точек оценки эта матрица является обратимой (см. Также Матрица Вандермонда), и так:

Осталось только вычислить это произведение матрицы на вектор. Хотя матрица содержит дроби, результирующие коэффициенты будут целыми числами - так что все это можно сделать с помощью целочисленной арифметики, просто сложения, вычитания и умножения / деления на небольшие константы. В Toom – Cook сложная задача проектирования состоит в том, чтобы найти эффективную последовательность операций для вычисления этого продукта; одна последовательность, данная Бодрато[6] для Toom-3 это следующее, выполненное здесь в текущем примере:

р0р(0)=3084841486175176
р4р(∞)=12193131840
р3(р(−2) − р(1))/3=(3188843994597408 − 13260814415903778)/3
=−3357323473768790
р1(р(1) − р(−1))/2=(13260814415903778 − (−246273893346042))/2
=6753544154624910
р2р(−1) − р(0)=−246273893346042 − 3084841486175176
=−3331115379521218
р3(р2р3)/2 + 2р(∞)=(−3331115379521218 − (−3357323473768790))/2 + 2 × 12193131840
=13128433387466
р2р2 + р1р4=−3331115379521218 + 6753544154624910 − 12193131840
=3422416581971852
р1р1р3=6753544154624910 − 13128433387466
=6740415721237444.

Теперь мы знаем наш полином-произведение р:

Если бы мы использовали разные kм, kп, или точки оценки, матрица и наша стратегия интерполяции изменится; но он не зависит от входных данных, поэтому его можно жестко запрограммировать для любого заданного набора параметров.

Перекомпозиция

Наконец, мы оцениваем r (B), чтобы получить окончательный ответ. Это просто, поскольку B - это степень б и поэтому все умножения на степени B - это сдвиги на целое число цифр в базе б. В текущем примере b = 104 и B = b2 = 108.

3084841486175176
6740415721237444
3422416581971852
13128433387466
+12193131840

1219326312467611632493760095208585886175176

А это на самом деле произведение 1234567890123456789012 и 987654321987654321098.

Матрицы интерполяции для различных k

Здесь мы даем общие матрицы интерполяции для нескольких различных общих малых значений kм и kп.

Тоом-1

Тоом-1 (kм = kп = 1) требуется 1 оценочная точка, здесь она выбрана равной 0. Она вырождается в длинное умножение с матрицей интерполяции единичной матрицы:

Тоом-1.5

Тум-1.5 (kм = 2, kп = 1) требует 2 оценочных баллов, здесь выбираются 0 и ∞. Его матрица интерполяции тогда является единичной матрицей:

Это также вырождается к длинному умножению: оба коэффициента одного множителя умножаются на единственный коэффициент другого множителя.

Тоом-2

Тум-2 (kм = 2, kп = 2) требует 3 оценочных баллов, здесь выбираются 0, 1 и ∞. Это то же самое, что и Умножение Карацубы, с матрицей интерполяции:

Тум-2,5

Тум-2.5 (kм = 3, kп = 2) требует 4 оценочных баллов, которые здесь выбираются равными 0, 1, −1 и ∞. Затем он имеет матрицу интерполяции:

Примечания

  1. ^ а б Кнут, стр. 296
  2. ^ Crandall & Pomerance, стр. 474
  3. ^ Crandall & Pomerance, стр. 536
  4. ^ Кнут, стр. 302
  5. ^ Положительные результаты, глава III Стивена А. Кука: О минимальном времени вычисления функций.
  6. ^ а б c Марко Бодрато. К оптимальному умножению Тоома – Кука для одномерных и многомерных многочленов от характеристик 2 и 0. В Протокол WAIFI'07, том 4547 LNCS, страницы 116–133. 21–22 июня 2007 г. сайт автора

Рекомендации

внешняя ссылка