КАТЕГОРИИ: Архитектура-(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) |
Булева арифметика
G ql взаимно просто с а"-ч, так как а и q взаимно просты. Поэтому коэффициент при х" в левой части (22.3), равный (-l)n-qan-q(n), не q делится на ql, следовательно, не делится наи поэтому не сравним Из предложения 22.2 следует, что для проверки простоты числа п можно взять любое а, взаимно простое с п (подходит, например, 1), и проверить (22.3). Но прямая такая проверка потребует П(п) = П(2т) битовых операций, так как раскрытие скобок в левой части (22.3) дает п + 1 слагаемое. Алгоритм AKS предписывает проверку (22.3) по двум модулям {х-а)п=хп-а (mod хг - 1, п), (22.4) г > 0. Сравнение (22.4) понимается в том смысле, что все коэффициенты остатка от деления полинома (х - а)" - хп + а на хг - 1 (они будут целыми числами) делятся на п. Вычисление остатков от деления (х - а)" и х" на хг - 1 производится с помощью бинарного алгоритма возведения в степень, результат каждого умножения сразу же заменяется остатком от деления на хг - 1. Но если взять произвольное г g N+, то может оказаться, что (22.4) выполняется и при некоторых составных п. Число г должно подбираться специальным образом, и авторы показывают, что подходящее для целей алгоритма г всегда существует и может быть выбрано без существенных затрат так, что г = 0{тъ); после выбора г сравнение (22.4) надо проверить для «небольшого» числа «легко определяемых» а — количество этих а есть 0{-^гт). Итоговая сложность алгоритма допускает оценку 0{т1г). Заметим попутно, что в литературе по теории сложности часто используются оценки вида 0{f{m)) (О называется «О мягкое»), Глава 5. Битовая сложность за таким обозначением скрывается 0(/(m)log dm), где d — положительное число, значение которого не уточняется. Авторы показывают, что битовая сложность их алгоритма допускает оценку 0{т21/2), указывая при этом, что если верны некоторые известные в теории чисел гипотезы (для которых имеются серьезные основания полагать, что они верны), то можно взять г = 0{т2), и в этом случае сложность алгоритма в целом есть 0{ть). На этом мы завершим разговор об алгоритме AKS, добавив лишь ко всему сказанному, что, например, в криптографии практикуются вероятностные (типа Монте-Карло) алгоритмы распознавания простоты, имеющие меньшую сложность, но не исключающие появления, хоть и с малой вероятностью, неверного ответа. В нашем курсе такого рода алгоритмы не рассматриваются1. Сложность булевых вычислений как сложность по числу булевых операций может рассматриваться как алгебраическая сложность. Но работа с булевыми величинами является фактически работой с битами, и сложность по числу булевых операций в этом смысле совпадает с битовой сложностью. Таким образом, для алгоритмов булевой арифметики алгебраическая сложность по числу булевых операций и битовая сложность —это одно и то же. Аналогично дело обстоит и с пространственной булевой (= битовой) сложностью. Пример 23.1. Пусть дан ориентированный граф G = {V, E),n = \V\. Пусть С = (су) — булева матрица смежности графа G: сц = 1, если и только если i -я вершина соединена ребром с j -й, i,j = 1, 2,..., п. Требуется построить для G его матрицу связности D = (di ;): d y = 1, если и только если i = j или i -я вершина соединена путем из одного или более ребер с j -й, i,j = 1, 2,..., п. Если рассматривать G как граф некоторого бинарного отношения на множестве из п элементов, то задачу можно интерпретировать как задачу построения транзитив-но-рефлексивного замыкания данного бинарного отношения. Соответственно, граф, для которого D является матрицей смежности, называют транзитивно-рефлексивным замыканием графа G, а саму матрицу D — транзитивно-рефлексивным замыканием матрицы С. Для матрицы D используется обозначение С*. На рис. 20 показан ориентированный граф и его транзитивно-рефлексивное замыкание. Соот- 1 По поводу этих алгоритмов распознавания простоты числа см. [21, гл. 33] и [8, гл. 4]. § 23. Булева арифметика
а)
Рис. 20. а) Ориентированный граф; б) его транзитивно-рефлексивное замыкание. ветствующие матрицы C и C ∗ выглядят следующим образом С
С*
Нам понадобятся произведения булевых матриц, которые определяются как обычно: например, произведение F квадратных матриц A и B порядка n определяется формулой fij = \/(aikAbkj), i,j = 1,2,
k=i Элемент с индексами i,j для краткости будем называть (i, Л-элемен-том матрицы. Легко видеть, что С2 = СлС— это матрица, для которой (i, j)-эле-мент равен 1, если и только если i -я вершина соединена с j -й путем длины 2 (т.е. состоящим из двух ребер). Аналогично, Ск— матрица, для которой (i, j)-элемент равен 1, если и только если i -я вершина соединена с j -й путем длины к. Пусть / — матрица, для которой (i, Л-элемент равен 1, если и только если i = j. Тогда c*=ivcvc2v...vcn-\ Индукцией по к несложно доказать, что для любой квадратной булевой матрицы С и натурального к выполнено /V C v C 2V...V C fc = (7v C)fc. (23.1) Это дает нам C* = (lv СУ-1. (23.2) Глава 5. Битовая сложность Тривиальный способ умножения булевых (n х п)-матриц требует в(п3) битовых операций. Если используется именно этот способ, то оценка числа операций для формулы (23.2) есть в(п4). Применение бинарного алгоритма (пример 4.2) для возведения в степень булевой матрицы С позволяет перейти к оценке 6(n 3log n). (23.3) Если нежелательно связывать основанный на формуле (23.2) алгоритм построения транзитивно-рефлексивного замыкания с конкретным способом умножения матриц, то верхнюю оценку числа битовых операций можно записать как n + B (n)(A(n)+A*(n)-2), (23.4) где В{п) — сложность используемого алгоритма умножения булевых (п х п)-матриц; слагаемое п отражает расход на сложение с матрицей I. Рассмотренный пример высвечивает связь задачи построения транзитивно-рефлексивного замыкания ориентированного графа с задачей умножения булевых матриц. Эта связь оказывается очень тесной, о чем мы еще будем говорить в § 28. В следующем примере задача построения транзитивно-рефлексивного замыкания решается без использования умножения булевых матриц. Пример 23.2. Исследуем сложность алгоритма С. Уоршелла, предназначенного для построения матрицы С*. В процессе применения этого алгоритма матрица С* строится за n = | V | шагов, после fc-го шага получается матрица D (fc) = (d?5), и d?) = ^ если и только если i -я вершина соединена таким путем с j -й, номера всех промежуточных вершин которого не выходят за пределы множества {1,2,..., А:}. Вначале полагаем D (0) =/ V С. Затем для каждого к = 1, 2,..., п находим D «: dm = d *_1) V (d (,fc~u Л d *_1)). (23.5) у у i fc kj K После этого C* = D(n\ Формула (23.5) отражает то, что путь из i -й вершины в j -ю, все промежуточные вершины которого принадлежат {1,2,..., А:}, существует, если и только если реализуется хотя бы одна из следующих возможностей: • имеется путь из i -й вершины в j -ю, все промежуточные вершины которого принадлежат {1, 2, ...,к - 1}; § 23. Булева арифметика • имеются пути из i -й вершины в k -ю и из k -й в j -ю, все промежуточные вершины которых принадлежат {1, 2,..., k - 1}. На вычисление D (0) уходит n битовых операций, вычисление каждой из матриц D(k ), 1^k^n, требует 2n2 операций. Итого, требуется 2 n 3 + n операций. Алгоритм Уоршелла вычисляет матрицу C*, т. е. строит транзи-тивно-рефлексивное замыкание ориентированного графа G с n вершинами, заданного матрицей смежности, затрачивая 2 n 3 + n битовых операций. Алгоритм Уоршелла можно легко реализовать так, что храниться в памяти будут только D ( k -1) и D ( k ). Но на самом деле алгоритм Уоршелла позволяет производить все вычисления, расходуя всего n2 битов под хранение матричных элементов. Если мы вычислим D = I V C, а затем n раз обновим матрицу D (каждый раз всю целиком, не оставляя незатронутых элементов), используя на k -м этапе обновления матрицы D присваивания dij:= dij V(dik A dkj), k = 1,2,...n, то получим искомую матрицу связности. В самом деле, индукцией по k можно доказать, что после k -го этапа обновления получаем матрицу, равную D ( k ), при этом индуктивный переход от k - 1 к k основывается на том, что имеют место очевидные соотношения dik dik, dkj dkj k = 1, 2,..., n, т.е. при обновлении элемента dij на k -м этапе не имеет никакого значения, был ли уже обновлен какой-то из элементов dik, dkj или нет. Если строить матрицу C * на месте исходной матрицы C, то алгоритм можно изобразить так: for l = 1 to n do cll:=1 od; for k =1 to n do for i = 1 to n do for j = 1 to n do cij:= cij V(cik A ckj) od od od Подводя итог рассмотрению алгоритма Уоршелла, заметим, что, как и алгоритм Евклида в расширенной версии, он дает довольно Глава 5. Битовая сложность редкий пример, когда низкие временные затраты сочетаются с малым расходом памяти. Алгоритм Уоршелла построения замыкания ориентированного графа имеет битовую временную сложность 2 n 3 + n, где n = \ V \ — число вершин графа. Пространственная сложность этого алгоритма ограничена константой. При рассмотрении | V |, | E | в качестве двух параметров размера входа сказанное сохраняет силу, так как затраты алгоритма Уоршелла не зависят от числа ребер заданного входного графа.
Дата добавления: 2014-01-11; Просмотров: 1359; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |