КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
А ОЛ (В ОЛ (АВ ОДобавление нулей Ряд алгоритмов целочисленной арифметики и теории матриц оказывается достаточным (без нанесения сколь-либо существенного ущерба идее алгоритма и его качеству) описать для случая, когда размер !См., например, [4]. § 27. Добавление нулей 173 входа есть число вида 2к. При использовании стратегии «разделяй и властвуй» это облегчает и описание алгоритма, и анализ его сложности. С теоретической точки зрения для задачи умножения двух целых чисел а и Ъ мы можем предполагать, что битовая длина каждого из данных чисел равна 2к, где fc = max{[log2 А(а)1, flog2A(b)l}, (27.1) так как всегда возможно добавить спереди любого из данных чисел некоторое количество нулей. Если речь идет об умножении квадратных матриц А и В произвольного порядка п, то мы можем добавить к матрицам несколько нулевых строк и столбцов так, чтобы сделать их порядки равными 2Г1о&п1: A 0 B 0 AB 0 00 00 00 О 00 00 О (27.2) (нулями обозначены нулевые блоки соответствующего размера). Несмотря на переход от начальных данных к более громоздким, некоторые из алгоритмов, основанных на стратегии «разделяй и властвуй» и использующих этот переход, имеют существенно меньшую сложность, чем наивные алгоритмы. Предложение 27.1. Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех n eN+ и /(2fc)^ u, если k =0, wf (2 k -1) + ϕ (2 k), если k > 0,
Доказательство. Легко видеть, что |"log2|"|]]=riog2 n l-l. (27.4) В самом деле, если 2к-г < п s= 2к, к > 1, то 2к-2 < Г|1 s= 2к-х, т. е. если [log2 n l=fc, то riogJ|ll =к-1. Для случая n = 2rlo& n l неравенство (27.3) выполнено по условию, для остальных случаев используем равенства /(n) = /(2rlo& n l), /ГГ-11 = /(г1"10^1"" / 2"1"1) = /(2rlog2п_|-1). □ 174 Глава 6. Рекуррентные соотношения и сложность алгоритмов Теорема 27.1. Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех n eN+ и
и, если к = 0, wf (2fc-1)+ c (2fc) d, еслик>0, при fc е N, где и,d ^ О, о О, w ^ 1. Тогда при рассмотрении f как функции, определенной для всех п е N+ выполняются оценки (o(nd log n), если d = log2w, f(n) = \o{nd), если d> log2 w, [о(п1о&№), если d< log2 мл Доказательство следует из предложения 27.1 и теоремы 26.1. □ Подобно тому, как доказательство теоремы 26.1 было преобразовано в доказательство теоремы 26.2, из приведенного выше доказательства мы можем получить доказательство следующей теоремы Теорема 27.2. Пусть вещественная функция f натурального аргумента такова, что /(п) =/(2г1о&"1) для всех n eN+ и
и, если к = 0, wf (2fc-1)+ c (2fc) d, еслик>0, где и, d ^ 0, о 0, w^ 1. Тогда для функции f{n), при рассмотрении ее как функции, определенной для всех п е N+ выполнено fn(nd log n), если d =log2 w, 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 = g 12 l + h i, где e1,g1 — однобитовые числа (0 или 1), то (е + f)ig + K)= elgl221 + (exhx + g 1/1)2 l + 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+ размера т = шах{А(а), А(Ь)} предполагает, что сначала мы находим к = = [log2 m l, затем добавляем спереди каждого из а,Ъ некоторое количество нулей так, чтобы битовая длина каждого из сомножителей стала равной 2к, а после этого используем рекурсивный алгоритм, основанный на (27.5). Мы можем применить теорему 27.1 (w = 3, d = 1), так как при произвольном m eN+ выполняется Гкм(т) = Гкм(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 (2 k) = 1, если k =0, 3 G (2 k -1), если k > 0, откуда T км(m) = П(m 1о&3) по предложению 27.2. Вместе с (27.9) это дает T км(m) = в(m 1о&3). (27.11) При использовании m, равного максимальной из битовых длин двух данных чисел a, be N+ в качестве размера входа битовая сложность умножения Карацубы допускает оценку T км(m) = в(m 1о&3), при том, что T мм = 6(m 2) — оценка битовой сложности наивного умноженияг. Стратегия добавления нулей особенно характерна для исследований, в которых главной целью служит преодоление некоторого слож-ностного барьера; последнее было и остается важным стимулом развития теории сложности. Пример 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, Х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(n l0&7), в то время как алгоритм, непосредственно следующий из определения произведения матриц, имеет сложность в(п3) (при этом log2 7 = 2,81...). Что касается булевых матриц, то алгоритм Штрассена не может быть непосредственно применен для их умножения по той, например, причине, что этим алгоритмом используется вычитание, для которого нет аналога в булевой арифметике. Но матрицы А и В порядка п, состоящие из нулей и единиц, можно перемножить как 178 Глава 6. Рекуррентные соотношения и сложность алгоритмов
целочисленные. Каждый элемент такого произведения не превосходит n, он равен нулю, если и только если соответствующий элемент произведения булевых матриц равен нулю. Для того, чтобы в процессе применения алгоритма Штрассена к целочисленным матрицам не возникало больших промежуточных значений, здесь можно все вычисления проводить по модулю n + 1, т. е. проводить вычисления не в кольце Z, а в кольце Z n +1. Если M{n) —некоторая верхняя граница для числа битовых операций, затрачиваемых при выполнении одной операции сложения, вычитания или умножения в Z n +1, то сложность модифицированного таким способом алгоритма Штрассена будет допускать оценку O{nъ^7M{n)). Наивное умножение в Z n +1 дает M (n) = O (log2 n). Таким образом, M{n) растет очень медленно в сравнении с остальными затратами. Так как log2 7 = 2,81..., мы можем использовать для сложности алгоритма Штрассена, модифицированного на булев случай, например, оценку O(n2'82) или оценку O (n 1о&7), —смысл «O мягкого» объяснялся в конце § 22. Применение алгоритма Штрассена и арифметики по модулю n + 1 дает алгоритм умножения двух булевых матриц порядка n, битовая сложность которого допускает оценки O{nъ^7) и O (n 2'82). Мы ограничились рассмотрением применения стратегии «разделяй и властвуй» для случая, когда в результате этапа разделения возникают две задачи, и каждый из размеров входа примерно вдвое меньше изначального размера. Иногда разделение приводит к трем и более задачам. В 1963 г. А.Л.Тоом обобщил идею умножения Карацубы1. Пусть s — большее единицы целое. Предполагая, что битовая длина m каждого из сомножителей имеет вид sk, k е N, последовательность двоичных цифр каждого из сомножителей можно разбить на s групп по sk -1 цифр. Тоом показал, что умножение исходных чисел сводится к 2 s - 1 умножениям чисел битовой длины sk -1 (в умножении Карацубы s = 2, 2 s - 1 = 3), остальные затраты—сложения, сдвиги—будут ограничены функцией cm, где c — зависящая от выбора s константа. Здесь этап разделения приводит к 2 s - 1 задачам. Для умножения То-ома (TM) неравенство
T^(m)^ sГmЛ (27.13) См. [36], [4]. § 27. Добавление нулей 179 выполненное в случае m = sk, fceN, и равенство r«(m) = rW(s 'l0& m l)J выполненное при произвольном m eN+, приводят к оценке Т^(т) = = 0(m log s (2 s -i:)) для битовой сложности алгоритма, использующего разбиение на s частей. Может быть также показано, что r(s)(m) = e(m log»(2 s -1)). (27.14) Очевидно, log s (2 s - 1) = log s 2 s (l - ^) = 1 + log s 2 + log s (l - ^) • Отсюда limlog,(2 s -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 = 2 s *-1. Полином С(х), равный произведению А(х)В(х), есть полином степени не выше чем 2 s - 2 (мы не утверждаем, что эта степень равна 2 s - 2, так как возможно, что к изначально заданным целочисленным сомножителям спереди дописывались нули), и достаточно знать значения С (х) в 2 s - 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 нахождения нод(a 0, aг), сложность которого допускает оценку O{m log2 m log log m), где m — битовая длина большего числа a0 (в примере 21.2 было показано, что алгоритм Евклида имеет сложность Θ(m 2)). Необходимо сказать, что преимущества по времени выполнения рассмотренных алгоритмов перед наивным умножением и алгоритмом Евклида проявляются лишь при очень больших значениях m. С умножением матриц положение таково, что обобщения алгоритма Штрассена в духе обобщения, предложенного Тоомом для алгоритма Карацубы, до сих пор не найдено. Используя другие идеи, Д. Коп-персмит и С. Виноград в 1987 г. предложили алгоритм со сложностью O (n 2,376), где n —порядок перемножаемых квадратных матриц3. Этот результат остается рекордным по сей день. Существует ли для любого s > 0 алгоритм умножения матриц со сложностью O{n2+е) —это открытый вопрос. Об алгоритме Шенхаге—Штрассена см., например, [5, разд. 7.5]. См., например, [5, разд. 8.10]. См. [47]. Задачи
Дата добавления: 2014-01-11; Просмотров: 381; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |