Московский государственный университет имени М.В.Ломоносова
Опубликован: 15.03.2007 | Доступ: свободный | Студентов: 611 / 26 | Оценка: 5.00 / 4.50 | Длительность: 19:30:00
Специальности: Программист
Дополнительный материал 1:

Решения задач

< Лекция 14 || Дополнительный материал 1: 12345678910

2.6 б). Заметим, что число раскрасок в 3 цвета по очевидным причинам кратно 6: перестановка цветов сохраняет правильную раскраску.


Рис. 15.4.

Пусть есть 3-КНФ из m дизъюнкций, в которые входят n переменных. Граф, который сопоставляется этой КНФ, имеет 7m+2n+3 вершин. Для описания структуры графа удобно пометить часть вершин. Во-первых, пометим три вершины числами 0, 1, 2. Во-вторых, пометим каждым литералом (переменной или ее отрицанием) по одной вершине. Остальные 7m вершин разобьем на группы по 7, каждая группа соответствует одной из дизъюнкций.

Теперь опишем ребра этого графа. Как показано на рис. 15.4а), вершины 0, 1 и 2 соединены между собой ребрами. На рис. 15.4б) показаны еще n треугольников в этом графе. И, наконец, рис. 15.4в) показывает, как соединены ребрами вершины, соответствующие каждой дизъюнкции. На этом рисунке l_1, l_2, l_3 обозначают литералы, входящие в дизъюнкцию. Заметим, что некоторые ребра мы перечислили по нескольку раз.

Очевидно, что описанное выше построение можно выполнить за полиномиальное от n и m время. Докажем его корректность.

Рассмотрим, какие правильные раскраски в 3 цвета возможны для такого графа. Без ограничения общности можно считать, что вершины 0, 1 и 2 покрашены в цвета 0, 1 и 2 (из шести раскрасок, различающихся перестановками цветов мы выбрали одну). Тогда вершины, помеченные x_i и \neg x_i, покрашены в цвета 0 и 1, причем их цвета должны быть противоположны (см. рис. 15.4б).

Прямым перебором вариантов можно проверить, что граф, изображенный на рис. 15.4в) удовлетворяет следующему свойству: если красить вершины, отмеченные литералами, в цвета 0 или 1, а вершины, отмеченные отрицаниями литералов, — в противоположные цвета 1 или 0, то правильная раскраска остальных вершин этого графа в 3 цвета существует (и единственна!) тогда и только тогда, когда хотя бы одно из значений литералов отлично от 0.

Поэтому правильные 3-раскраски построенного графа, для которых вершины 0, 1, 2 покрашены в цвета 0, 1, 2 соответственно, находятся во взаимно однозначном соответствии с выполняющими наборами значений переменных исходной 3-КНФ.

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

Итак, назовем данную задачу ("restricted puzzle"). Задача ("unrestricted puzzle") получается, если отказаться от ограничения на число типов квадратиков и требовать сложить прямоугольник заданных размеров, причем не из всего набора квадратиков, а из некоторого его подмножества.

Опишем неформально цепочку сводимостей

\text{3-КНФ}\propto \text{UP}\propto \text{RP},
которая доказывает NP-полноту исходной задачи.

\text{3-КНФ}\propto \text{UP}. Для описания этой сводимости будем считать квадратики роботами, которые могут получать и передавать сообщения через стороны. Пара букв допустима, если одна из них означает передачу сообщения, а вторая — прием того же сообщения.

Итак, пусть есть 3-КНФ, множество переменных которой обозначим через X, а множество дизъюнкций — через \calD. Через \calD' обозначим множество выполнимых дизъюнкций, получаемых из \calD подстановкой значений некоторых переменных.

Будем теперь описывать множество квадратиков и их типы, из которых нужно будет складывать прямоугольник размера |X|\times|\calD|. Одна сторона этого прямоугольника (для определенности — левая) соответствует переменным КНФ, а другая (нижняя) — дизъюнкциям. Роботы-квадратики получают слева сообщения " x_j=1 " или " x_j=0 ", x_j\in X ; передают вправо то же самое сообщение; получают снизу дизъюнкцию из \calD' ; подставляют в нее, если возможно, переменную x_j и передают полученную дизъюнкцию вверх, если не получено нулевое значение (другими словами, отсутствуют типы, получающие слева сообщения вида " x_j=\alpha ", а снизу — " \alpha\oplus x_j "). Все эти типы не содержат граничных букв. А есть еще 4 угловых типа, двум сторонам которых разрешено выходить на границу, и 2|X|+2|\calD| граничных типов (одна сторона может выходить на границу), которые нумеруются переменными и дизъюнкциями соответственно. Буквы, написанные на сторонах квадратиков граничных типов, обеспечивают однозначную сборку контура прямоугольника. Квадратик каждого типа один. А всего типов O(|X|\cdot|\calD|).

Таким образом, выполнимость КНФ эквивалентна возможности сложить прямоугольник размера (|X|+2)\times(|\calD|+2) из описанного выше набора типов квадратиков.

\text{UP}\propto \text{RP}. Пусть есть множество квадратиков, принадлежащих множеству типов T, каждого типа t по n(t) штук ( \sum_{t\in T}^{}n(t)=N ), из которых нужно сложить прямоугольник m\times k. Без ограничения общности можно считать, что N>5. Добавим квадратиков: по 2 штуки из m+k дополнительных типов c_j и r_l, чтобы выложить внешний контур прямоугольника m\times k, 4(N-mk) квадратиков еще одного типа u, чтобы можно было использовать квадратики, не вошедшие в прямоугольник, и (5N+3)^2-5N-2(m+k)+4mk квадратиков типа v для получения квадрата. Поскольку 5N+3> |T|+2(m+k)+2, ограничение числа типов длиной стороны квадрата будет выполнено.

Сформулированные условия прямо переводятся на язык букв и их сочетаний. На сторонах квадратиков типа v написана одна и та же буква v, которая может соседствовать только сама с собой; на одной стороне квадратика типа u написана буква u, которая может соседствовать со всеми буквами, а на остальных — v ; наконец, на одной стороне квадратиков типов c_j и r_j написана буква v, а на остальных сторонах написаны буквы, обеспечивающие сборку контура прямоугольника m\times k.

Таким образом, чтобы собрать квадрат (5N+3)\times(5N+3) из нового набора квадратиков 1\times1, необходимо и достаточно уметь собирать прямоугольник m\times k из некоторого подмножества исходного набора.

2.8. Поскольку умножение чисел можно произвести за полиномиальное время, Мерлин может сообщить Артуру любое разложение числа n на два множителя.

2.9 Докажем принадлежность задачи ПРОСТОТА ЧИСЛА классу NP, построив для решения этой задачи недетерминированную машину Тьюринга N, которая рекурсивно вызывает саму себя.

На вход машине N подается двоичная запись числа p, простоту которого нужно проверить. Машина недетерминированно дописывает первообразный корень g по модулю p и разложение на простые множители числа p-1, т.е. такие числа p_1, \dots, p_s, \alpha_1, \dots, \alpha_s, что

p-1= \prod_{j=1}^{s}p_j^{\alpha_j}. ( *)
После этого машина проверяет равенство (*) (на это хватит времени O(n^3), где n=\log p, даже если умножать большие числа в "столбик"), проверяет равенство g^{p-1}\equiv1\pmod p и все неравенства
g^{(p-1)/p_j}\not\equiv1\pmod p.

Для этих проверок потребуется время O(n^4), так как s=O(n), а возведение в степень q требует O(\log q) умножений. Далее машина проверяет простоту всех p_j, рекурсивно вызывая саму себя.

Описанные выше проверки гарантируют, что порядок числа g в группе (\ZZ/p\ZZ)^* равен p-1, что эквивалентно простоте p.

Оценим теперь время работы такой НМТ на входе длины n. Оно складывается из времени, затрачиваемого на детерминированные действия, и времени, затрачиваемого на недетерминированные действия. Как следует из приведенных выше оценок, количество детерминированных действий ограничено полиномом от длины записей всех чисел, проверяемых на простоту за время работы. Длина записей первообразных корней и кратностей также ограничена полиномом (и даже линейно) от длины записей всех чисел, проверяемых на простоту.

Таким образом, осталось оценить длину записей чисел, проверяемых на простоту. Если взять произведение всех чисел, проверяемых на простоту на k -м уровне рекурсии, то оно заведомо меньше исходного числа p. Поэтому суммарная длина записей этих чисел не более чем вдвое превышает длину записи p (длина записи произведения двух чисел разве что на 1 меньше суммы длин сомножителей). Максимальное из чисел, проверяемых на простоту на k -м уровне рекурсии, по крайней мере вдвое меньше, чем максимальное из чисел, проверяемых на (k-1) -м уровне. Поэтому максимальный уровень рекурсии не превосходит \log p. Следовательно, общая длина записей всех чисел, проверяемых на простоту при входе p, равна O(\log^2p).

Из раздела 4

4.1 Заметим прежде всего, что S заведомо не меньше длины входа в силу иcпользуемых определений2Бывают и другие определения. Так, например, класс log-SPACE определяется с помощью двухленточных машин, у которых на одной ленте записан вход и с нее можно только читать, а на второй ленте используется память O(\log n) . .

Предположим, что доказана верхняя оценка вида 2^{\poly(S)} на время работы недетерминированной машины. Тогда можно дословно повторить доказательство теоремы 4.2, построить игру длины \poly(S), и вычислить ее результат детерминированной машиной на памяти \poly(S).

Пусть есть НМТ, работающая на памяти S. В процессе работы она может находиться не более чем в N=|\calA|^S\cdot|\calQ|\cdot S состояниях, где \calQ,\calAмножество состояний управляющего устройства и внешний алфавит, соответственно. Хотя у НМТ может быть несколько вариантов перехода из данного состояния, из последовательности переходов всегда можно выбросить циклы (ни к чему делать вначале неправильный переход, а затем, вернувшись в то же состояние, — правильный). Так что время работы НМТ ограничено 2^{O(S)}, как и для детерминированной МТ.

4.2 Легко сообразить, как имитировать оракул F из \Sigma_k, имея возможность заказывать оракул из \Pi_k. Нужно заказать оракул \neg F, а дальше брать отрицание от каждого результата его работы.

Класс P^{\Sigma_k}, как и \P, замкнут относительно взятия дополнений. Так что осталось доказать включение P^{\Sigma_k}\subseteq \Sigma_{k+1}. Это удобно делать, используя игровое определение классов \Sigma_k.

Пусть есть предикат F\in P^{\Sigma_k}, а вычисляющий его полиномиальный алгоритм использует оракул G\in \Sigma_k. Игру, которая задает G(x), обозначим \calG(x). Опишем теперь игру \calF(x), выигрыш белых в которой (точнее, наличие выигрышной стратегии) эквивалентен F(x).

Первый ход белых в этой игре состоит в объявлении последовательности пар (f_j, x_j)_{j=1}^q. Белые утверждают, что эта последовательность есть протокол обращений к оракулу в процессе работы алгоритма с оракулом G, вычисляющего F(x). Более точно это означает, что алгоритм обращается к оракулу q раз, jзапрос делается о слове x_j, оракул отвечает на это запрос f_j, и окончательный результат F(x)=1. Следующим ходом черные объявляют индекс j и, если f_j=0, то дополнительно первый ход белых в игре \calG(x_j). Далее, если f_j=1, то разыгрывается игра \calG(x_j), а если f_j=0, то разыгрывается игра \calG(x_j) со сдвигом "на темп": (i+1) -й ход белых в \calF(x) в этом случае соответствует i -у ходу черных в \calG(x_j), а (i+1) -й ход черных — (i+1) -у ходу белых в \calG(x_j), (k+1) -й ход черных на результат влияния не оказывает.

Белые выигрывают в этой игре, если (x_j)_{j=1}^q — правильная последовательность аргументов при обращениях к оракулу, результат игры \calG(x_j) совпадает с f_j, а результат работы алгоритма для вычисления F на входе x с ответами оракула (f_j)_{j=1}^q равен 1.

Достаточно ясно, что если F(x)=1, то у белых есть выигрышная стратегия в \calF(x): первым ходом сказать правду, а дальше играть в \calG(x_j) по стратегиям, существование которых вытекает из равенства f_j=G(x_j). Если же F(x)=0, то в каком-то члене (f_m, x_m) последовательности (f_j, x_j)_{j=1}^q белые должны отклониться от истины. Черные своим ходом должны объявить m (и, дополнительно, первый ход за белых в игре \calG(x_m) при необходимости), дальнейшая их стратегия состоит в том, чтобы доказывать f_j\ne G(x_j), пользуясь соответствующими стратегиями для \calG(x_j).

Из раздела 6

6.1. Поскольку конъюнкция и отрицание образуют полный базис для обычных схем, из лемм 6.1, 6.2 следует, что достаточно реализовать функции \neg_\oplus\colon(x,y)\mapsto(x,x\oplus y\oplus 1) и \qxor. Заметим, что \neg_\oplus[1,2]\double=\neg[2]\qxor[1,2], поэтому достаточно реализовать \qxor. Для этого заведем вспомогательный бит u, содержащий константу 1 (для этого в самом начале и в самом конце применяем \neg[u] ). Тогда \qxor\:[1,2]=\wedge_\oplus[u,1,2].

< Лекция 14 || Дополнительный материал 1: 12345678910