А ОЛ (В ОЛ (АВ О

Добавление нулей

Ряд алгоритмов целочисленной арифметики и теории матриц оказы­вается достаточным (без нанесения сколь-либо существенного ущер­ба идее алгоритма и его качеству) описать для случая, когда размер

!См., например, [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 = (Ац + А1222,
Х2 =
21 + А221Ъ Х6 = 21 - Ап) п + В12),

Х3 = АП1222), Х7 = (А12 - А22)(В21 + В22),

Х42221п), далее используются только аддитивные операции:

Сп1457, c12 = x3+xs,

с21 = х2 + х4, с22 = х1 + х32 + х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].


Задачи