А ОЛ (В ОЛ (АВ О
Добавление нулей
Ряд алгоритмов целочисленной арифметики и теории матриц оказывается достаточным (без нанесения сколь-либо существенного ущерба идее алгоритма и его качеству) описать для случая, когда размер
!См., например, [4].
§ 27. Добавление нулей 173
входа есть число вида 2к. При использовании стратегии «разделяй и властвуй» это облегчает и описание алгоритма, и анализ его сложности. С теоретической точки зрения для задачи умножения двух целых чисел а и Ъ мы можем предполагать, что битовая длина каждого из данных чисел равна 2к, где
fc = max{[log2 А(а)1, flog2A(b)l}, (27.1)
так как всегда возможно добавить спереди любого из данных чисел некоторое количество нулей. Если речь идет об умножении квадратных матриц А и В произвольного порядка п, то мы можем добавить к матрицам несколько нулевых строк и столбцов так, чтобы сделать их порядки равными 2Г1о&п1:
A0 B0 AB0 00 00 00
О 00 00 О (27.2)
(нулями обозначены нулевые блоки соответствующего размера). Несмотря на переход от начальных данных к более громоздким, некоторые из алгоритмов, основанных на стратегии «разделяй и властвуй» и использующих этот переход, имеют существенно меньшую сложность, чем наивные алгоритмы.
Предложение 27.1.Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех neN+ и
/(2fc)^
u, если k=0,
wf(2k-1) +ϕ(2k), если k >0,
при fceN, где u,w — вещественные числа, причем и^О, w^l, a ip — неотрицательная функция, определенная для всех п е N+. Тогда при всех п е N+ выполняется неравенство (и, если п = 1, /Тп-П Пое.п ___________ (27.3) |
^/gij^ +^(2nog2ni)) еслип>1_ |
Доказательство. Легко видеть, что
|"log2|"|]]=riog2nl-l. (27.4)
В самом деле, если 2к-г < п s= 2к, к > 1, то 2к-2 < Г|1 s= 2к-х, т. е. если [log2nl=fc, то riogJ|ll =к-1. Для случая n = 2rlo&nl неравенство (27.3) выполнено по условию, для остальных случаев используем равенства /(n) = /(2rlo&nl), /ГГ-11 = /(г1"10^1""/2"1"1) = /(2rlog2п_|-1). □
174 Глава 6. Рекуррентные соотношения и сложность алгоритмов
Теорема 27.1.Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех neN+ и
Я2Ц |
и, если к = 0,
wf(2fc-1)+c(2fc)d, еслик>0,
при fc е N, где и,d ^ О, о О, w ^ 1. Тогда при рассмотрении f как функции, определенной для всех п е N+ выполняются оценки
(o(ndlogn), если d = log2w,
f(n) = \o{nd), если d>log2w,
[о(п1о&№), если d<log2 мл
Доказательство следует из предложения 27.1 и теоремы 26.1. □
Подобно тому, как доказательство теоремы 26.1 было преобразовано в доказательство теоремы 26.2, из приведенного выше доказательства мы можем получить доказательство следующей теоремы
Теорема 27.2.Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех neN+ и
/<2Ц |
и, если к = 0,
wf(2fc-1)+c(2fc)d, еслик>0,
где и, d ^ 0, о 0, w^ 1. Тогда для функции f{n), при рассмотрении ее как функции, определенной для всех п е N+ выполнено
fn(ndlogn), если d=log2w,
f{n) = I П(п1о& w), если d > log2 w,
[n(nd), если d<log2w.
Перейдем к примерам.
Пример27.1 (умножение Карацубы).Пусть а и Ъ — целые положительные числа битовой длины т = 2к. Положив Z = 2fc-1, можем записать
a = e2l+f, b = g2l+h,
где e,f,g,h — целые числа битовой длины Z. А.А.Карацубе принадлежит замечательное наблюдение, позволяющее вычислить произведение ab, выполнив всего три умножения чисел половинной длины, несколько сдвигов (домножений на 2т и 21) и несколько аддитивных операций над числами битовой длины s= 2т:
аЪ = eg221 + ((е + /) (g + К) - eg - fh)2l + fh, (27.5)
§ 27. Добавление нулей 175
тогда как обычное раскрытие скобок в (e2l + f)(g2l + К) требует выполнения четырех таких умножения:
ab = eg22l + (eh + fg)2l+fh. (27.6)
Мы видим, что формула (27.5) использует произведения eg, fh, (e + /)(g + h), а формула (27.6)—произведения eg,eh,fg,fh.
Небольшая проблема, которая выше была замаскирована словами «половинная длина», состоит в том, что битовая длина любого из чисел e + f, g + h, входящей в произведение (е+ /)(# +ft), может оказаться равной Z +1, а не Z. Но если
e + f = ex2l+fx, g + h = g12l + hi,
где e1,g1 — однобитовые числа (0 или 1), то
(е + f)ig + K)= elgl221 + (exhx + g1/1)2l + fxhx. (27.7)
Произведение Л 7^ вычисляется рекурсивным обращением к алгоритму, произведения e1g1,e1h1,g1f1, как и все сложения и сдвиги, требуют 0(1) операций.
Равенство (27.5) и предположение, что т = 2к, приводят к рекурсивному алгоритму Карацубы умножения целых положительных чисел (будем обозначать этот алгоритм буквами KM: первая из этих букв — начальная в фамилии автора алгоритма, вторая — в английском слове multiplication —умножение). Предположение т = 2к приводит к следующему соотношению для битовой сложности умножения Карацубы:
( 1, если т = 1,
ГтЛ (27.8)
ЗГКМ1 у I +ст, еслит>1,
где с — некоторая положительная константа.
Умножение Карацубы при произвольном входе a, b е N+ размера т = шах{А(а), А(Ь)} предполагает, что сначала мы находим к = = [log2ml, затем добавляем спереди каждого из а,Ъ некоторое количество нулей так, чтобы битовая длина каждого из сомножителей стала равной 2к, а после этого используем рекурсивный алгоритм, основанный на (27.5).
Мы можем применить теорему 27.1 (w = 3, d = 1), так как при произвольном meN+ выполняется Гкм(т) = Гкм(2Г1о&т1). Получаем
Гкм(т) = 0(т1о&3), (27.9)
при этом log2 3 = 1,58...
176 Глава 6. Рекуррентные соотношения и сложность алгоритмов
Для m > 1 мы имеем
TKM(m)>G(m), (27.10)
где функция G натурального аргумента такова, что G(m) = G(2n°^m]) для всех m е N+ и
G(2k) =
1, еслиk=0,
3G(2k-1), если k >0,
откуда Tкм(m) = П(m1о&3) по предложению 27.2. Вместе с (27.9) это дает
Tкм(m) = в(m1о&3). (27.11)
При использовании m, равного максимальной из битовых длин двух данных чисел a, beN+ в качестве размера входа битовая сложность умножения Карацубы допускает оценку
Tкм(m) = в(m1о&3),
при том, что Tмм = 6(m2) — оценка битовой сложности наивного умноженияг.
Стратегия добавления нулей особенно характерна для исследований, в которых главной целью служит преодоление некоторого слож-ностного барьера; последнее было и остается важным стимулом развития теории сложности.
Пример 27.2.Алгоритм Штрассена умножения двух квадратных числовых матриц A и B порядка n, являющегося степенью двойки, основан на том, что если n = 2l и
A = [A11 A 12Л =(BU B 12Л
A 21 A2> B B 21 B22>
где все Aij,Bij — квадратные матрицы порядка l, то матрицу
C=AB= CC
можно получить, выполнив семь умножений квадратных матриц порядка l (при том, что потребовалось бы восемь таких умножений при
1 История создания алгоритма Карацубы и публикации о нем в 1962 г. сообщения [15] увлекательно рассказана в статье [17] самого А. А. Карацубы; особенно богат яркими историческими деталями раздел 6 этой статьи.
§ 27. Добавление нулей
использовании простейшего алгоритма, основанного на определении произведения матриц):
Хг = (Аи + А22) (Вп + Ваг), *5 = (Ац + А12)В22,
Х2 = (А21 + А22)В1Ъ Х6 = (А21 - Ап) (Вп + В12),
Х3 = АП(В12 -В22), Х7 = (А12 - А22)(В21 + В22),
Х4=А22(В21-Вп), далее используются только аддитивные операции:
Сп=Х1+Х4-Х5+Х7, c12 = x3+xs,
с21 = х2 + х4, с22 = х1 + х3-х2 + х6.
В правильности этого можно убедиться прямой проверкой.
Равенство п = 2к создает возможность для рекурсивного применения алгоритма. Алгоритм Штрассена будем обозначать начальными буквами St фамилии его автора.
В приведенных формулах использовано восемнадцать сложений матриц порядка Z. Сложение двух матриц порядка Z требует I2 сложений чисел. В предположении, что n = 2fc,fceN, имеем для общего числа операций—сложений и умножений чисел:
1, если п = 1,
Га(п) = |
ГпЛ ГпЛ2 (27.12)
7rSt(JJ+18(Jj , еслип>1.
Если п е N+ произвольно, то вначале к матрицам А и В добавляются нулевые строки и столбцы (см. (27.2)) так, чтобы порядки матриц стали равными 2Г1о&п1, а затем применяется описанный рекурсивный алгоритм. Рассматривая равенство (27.12) как систему двух неравенств со знаками ^ и ^ и применяя теоремы 27.1 и 27.2, получаем следующий результат.
Сложность Га(п) по числу арифметических операций алгоритма Штрассена перемножения двух числовых матриц порядка п допускает оценку rst(n) = e(nl0&7), в то время как алгоритм, непосредственно следующий из определения произведения матриц, имеет сложность в(п3) (при этом log2 7 = 2,81...).
Что касается булевых матриц, то алгоритм Штрассена не может быть непосредственно применен для их умножения по той, например, причине, что этим алгоритмом используется вычитание, для которого нет аналога в булевой арифметике. Но матрицы А и В порядка п, состоящие из нулей и единиц, можно перемножить как
178 Глава 6. Рекуррентные соотношения и сложность алгоритмов
O(n1о&7),-смысл |
целочисленные. Каждый элемент такого произведения не превосходит n, он равен нулю, если и только если соответствующий элемент произведения булевых матриц равен нулю. Для того, чтобы в процессе применения алгоритма Штрассена к целочисленным матрицам не возникало больших промежуточных значений, здесь можно все вычисления проводить по модулю n + 1, т. е. проводить вычисления не в кольце Z, а в кольце Zn+1. Если M{n)—некоторая верхняя граница для числа битовых операций, затрачиваемых при выполнении одной операции сложения, вычитания или умножения в Zn+1, то сложность модифицированного таким способом алгоритма Штрассена будет допускать оценку O{nъ^7M{n)). Наивное умножение в Zn+1 дает M(n) = O(log2 n). Таким образом, M{n) растет очень медленно в сравнении с остальными затратами. Так как log2 7 = 2,81..., мы можем использовать для сложности алгоритма Штрассена, модифицированного на булев случай, например, оценку O(n2'82) или оценку O(n1о&7), —смысл «O мягкого» объяснялся в конце § 22.
Применение алгоритма Штрассена и арифметики по модулю n + 1 дает алгоритм умножения двух булевых матриц порядка n, битовая сложность которого допускает оценки O{nъ^7) и O(n2'82).
Мы ограничились рассмотрением применения стратегии «разделяй и властвуй» для случая, когда в результате этапа разделения возникают две задачи, и каждый из размеров входа примерно вдвое меньше изначального размера. Иногда разделение приводит к трем и более задачам.
В 1963 г. А.Л.Тоом обобщил идею умножения Карацубы1. Пусть s — большее единицы целое. Предполагая, что битовая длина m каждого из сомножителей имеет вид sk, k е N, последовательность двоичных цифр каждого из сомножителей можно разбить на s групп по sk-1 цифр. Тоом показал, что умножение исходных чисел сводится к 2s - 1 умножениям чисел битовой длины sk-1 (в умножении Карацубы s = 2, 2s - 1 = 3), остальные затраты—сложения, сдвиги—будут ограничены функцией cm, где c — зависящая от выбора s константа. Здесь этап разделения приводит к 2s - 1 задачам. Для умножения То-ома (TM) неравенство
1, если m = 1, (2s - 1)T^ ( — ) + cm, если m > 1, |
T^(m)^ sГmЛ (27.13)
См. [36], [4].
§ 27. Добавление нулей 179
выполненное в случае m = sk, fceN, и равенство
r«(m) = rW(s'l0&ml)J
выполненное при произвольном meN+, приводят к оценке Т^(т) = = 0(mlogs(2s-i:)) для битовой сложности алгоритма, использующего разбиение на s частей. Может быть также показано, что
r(s)(m) = e(mlog»(2s-1)). (27.14)
Очевидно,
logs(2s - 1) = logs 2s(l - ^) = 1 + logs 2 + logs(l - ^) •
Отсюда
limlog,(2s-l) = l.
Это означает, что для любого е > О можно найти целое s ^ 2 такое, что умножение Тоома с разделением на s частей (битовая длина числа предполагается равной sk, fceN) будет иметь битовую сложность, допускающую оценку 6(т1+5) при некотором 5 таком, что 0 < 5 ^ е; разумеется, для битовой сложности этого алгоритма справедлива оценка 0(.т1+П.
Скажем коротко об основной идее алгоритма Тоома, приводящей к неравенству (27.13). Если, как предполагалось, битовая длина каждого из сомножителей а,Ъ есть sk, fceN, то последовательность двоичных цифр каждого из сомножителей а, Ъ можно разбить на s групп по s-1 цифр:
а3-ъ ■■■> ai> ао> bs-1, ...,Ьг,Ъ0. Сами сомножители а, Ъ суть значения полиномов
А(х) = а-х"-1 + ...+а1х + а0, В(х) = Ь-х*-1 + ... + Ъгх + Ъ0
в точке х0 = 2s*-1. Полином С(х), равный произведению А(х)В(х), есть полином степени не выше чем 2s - 2 (мы не утверждаем, что эта степень равна 2s - 2, так как возможно, что к изначально заданным целочисленным сомножителям спереди дописывались нули), и достаточно знать значения С (х) в 2s- 1 точках (узлах интерполяции) для того, чтобы затем, например, с помощью интерполяционной формулы Лагранжа найти значение
СС2**-1), (27.15)
180 Глава 6. Рекуррентные соотношения и сложность алгоритмов
равное ab. Тоом показал, что если в качестве узлов интерполяции xъ x2,..., x2s-i взять числа
-(s-l),-(s-2),...,-l,0,1, ...,s-2,s-l,
рекурсивно с помощью рассматриваемого алгоритма найти
A(xi\ B{xi), C{xi)=A{xi)B{xi), i = l,2,...,2s-l,
и затем, пользуясь интерполяционной формулой Лагранжа, найти значение (27.15), то это приведет к (27.13), (27.14). Такое использование интерполяции заключает в себе требуемое обобщение алгоритма Карацубы.
В 1972 г. Шенхаге и Штрассен, основываясь на идее Тоома использования интерполяции полиномов в алгоритмах умножения целых чисел, получили алгоритм умножения, битовая сложность которого допускает оценку O{m log m log log m), мы уже упоминали этот алгоритм в §21. Функция m log m log log m растет медленнее, чем m1+5 при любом 5 > 0. Улучшение достигнуто за счет привлечения интерполяции специального вида — так называемого быстрого преобразования Фурьег. До настоящего времени результат Шенхаге—Штрассе-на остается рекордным. Шенхаге на основе этого алгоритма умножения предложил алгоритм2 нахождения нод(a0,aг), сложность которого допускает оценку O{m log2 m log log m), где m — битовая длина большего числа a0 (в примере 21.2 было показано, что алгоритм Евклида имеет сложность Θ(m2)).
Необходимо сказать, что преимущества по времени выполнения рассмотренных алгоритмов перед наивным умножением и алгоритмом Евклида проявляются лишь при очень больших значениях m.
С умножением матриц положение таково, что обобщения алгоритма Штрассена в духе обобщения, предложенного Тоомом для алгоритма Карацубы, до сих пор не найдено. Используя другие идеи, Д. Коп-персмит и С. Виноград в 1987 г. предложили алгоритм со сложностью O(n2,376), где n—порядок перемножаемых квадратных матриц3. Этот результат остается рекордным по сей день. Существует ли для любого s > 0 алгоритм умножения матриц со сложностью O{n2+е)—это открытый вопрос.
Об алгоритме Шенхаге—Штрассена см., например, [5, разд. 7.5]. См., например, [5, разд. 8.10]. См. [47].
Задачи