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

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

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

1.9 Приведем идею написания такой программы.

Будем писать программу, моделирующую работу универсальной машины Тьюринга. Поскольку значение переменной может быть сколь угодно велико, то в одной переменной можно хранить всю ленту машины (цифры |\calS| -ичного представления числа, где \calSалфавит машины). Указатель положения головки — это еще одна переменная, состояние управляющего устройства — третья.

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

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

Замечание. Когда значения переменных не ограничены, в одной переменной можно хранить целый массив таких переменных:

(x_1,\dots, x_n) \mapsto 2^{x_1}3^{x_2}\dots p_n^{x_n},
p_j — простые числа. Поэтому ограничение на число переменных несущественно.

1.10 Будем искать все функции от двух переменных, которые выражаются формулами в базисе \calF. Вначале есть две такие функции (проекции): p_1(x,y)=x и p_2(x,y)=y. Далее к множеству уже построенных функций \calF' применяется следующая процедура. Добавляем к множеству \calF' все функции вида f(g_1(x_1,x_2),g_2(x_3,x_4),\dots,g_k(x_{2k-1},x_{2k})), где x_j\in\{x,y\}, g_j\in\calF', f\in\calF. Если множество \calF' увеличилось, повторяем процедуру еще раз. В противном случае возможны два варианта: либо уже получены все функции от двух переменных (тогда базис полон), либо — нет (тогда базис не является полным).

Оценим время работы этого алгоритма. Расширять множество \calF' можно лишь 14 раз (всего есть 16 булевых функций от двух переменных). Каждый раз нужно проверить не более |\calF'|^m\cdot2^m=(2^m)^{1+\log|\calF'|} вариантов, где m — максимальное количество аргументов у базисных функций. Длина входа (длина записи базиса) не превосходит |\calF|2^m, а |\calF'|=O(1). Так что алгоритм работает за время, ограниченное полиномом от длины входа.

1.11 Верхняя оценка n2^n<2{,}01^{n} (при n\geq2000 ) для c_n сразу следует из представления функции в дизъюнктивной нормальной форме (см. 1.1).

Для получения нижней оценки подсчитаем число различных схем размера s и сравним его с количеством функций от n переменных. Для определенности считаем, что используется стандартный полный базис. Тогда для k -го присваивания схемы есть не более

2\cdot(n+k)(n+k-1)/2+(n+k-1)<(n+k)^2
возможностей (конъюнкция и дизъюнкция — симметрические функции, а выбирать мы можем из n+k-1 переменной), поэтому количество N_s различных схем размера s не больше, чем
\prod_{k=1}^{s}(n+k)^2\leq \prod_{k=1}^{s}2n^2k^2\leq (2n^2)^s (s!)^2\leq 2^{s(1+2\log n)+2s\log s}.

А число булевых функций от n переменных равно 2^{2^n}. При

2^n>s(1+2\log n)+2s\log s ( *)
функций больше, чем схем, поэтому c_n>s. Если s=1{,}99^n, то неравенство (*) выполняется при n\geq3000.

1.12 Снова используем дизъюнктивную нормальную форму. Если строить по формуле 1.1 схему из элементов \AND и \OR, имеющих произвольное число входов, то понадобится не более 3 слоев элементов: один слой на отрицания, один — на конъюнкции, и один — на итоговую дизъюнкцию.

1.13 Как говорилось в "Что такое алгоритм?" , схему можно представлять в виде графа. Из каждой невыходной вершины графа схемы есть хотя бы один ориентированный путь в одну из выходных вершин. Поэтому размер схемы ограничен сверху суммой числа выходных вершин и числа таких путей.

Длина ориентированного пути в графе схемы не превосходит глубины схемы d. Для схемы в стандартном базисе входная степень каждой вершины не больше 2. Поэтому ориентированных путей, ведущих в выходные вершины, не больше чем 2^d=O(n^{O(1)}) (двигаемся от выходной вершины против направления стрелок и применяем индукцию).

1.14. Результатов сравнения двух чисел x и y три — x>y, или x=y, или x<y. Будем строить схему, которая выдает два бита результата, кодирующие эти три возможности.

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

Схему сравнения n -разрядных чисел будем собирать из двух схем, сравнивающих числа, образованные первыми n/2 разрядами и последними n/2 разрядами. Зная результаты сравнения этих двух пар чисел, можно восстановить и результат сравнения исходных чисел.

Конструкция схемы изображена на рис. 15.1 .


Рис. 15.1.

Схема Cmp_n для сравнения n -разрядных чисел (размер схемы O(n), глубина — O(\log n) )

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

Схему сравнения n-разрядных чисел будем собирать из двух схем, сравнивающих числа, образованные первыми n/2 разрядами и последними n/2 разрядами. Зная результаты сравнения этих двух пар чисел, можно восстановить и результат сравнения исходных чисел.

Конструкция схемы изображена на рис. 15.1. Оценим ее размер и глубину. Выполняются следующие рекуррентные соотношения

s_n=2s_{n/2}+3,\qquad h_n=h_{n/2}+2.
Из них получаем s_n= O(n) и h_n=O(\log n).

Замечание. Сравнение n -значных двоичных чисел x и y равносильно определению старшего разряда числа x+(2^n-1-y), а число 2^n-1-y находится по y схемой глубины O(1) линейного размера (нужно применить отрицание ко всем переменным). Поэтому достаточно было бы решить следующую задачу 1.15. Мы, наоборот, будем использовать сравнение чисел для сложения.

1.15. Введем обозначения: пусть x_{n-1}, \dots,x_0 — двоичные разряды первого слагаемого; y_{n-1}, \dots,y_0 — второго; s_n,s_{n-1}, \dots,s_0 — разряды результата; r_{n-1}, \dots,r_0 — биты переноса в следующий разряд. Введем дополнительные переменные t_i=x_i\oplus y_i, t_0=0. Тогда s_0=t_0, s_i= r_{i-1}\oplus t_i при i>0 ; r_{-1}=0, r_i=(r_{i-1}\wedge t_i)\vee x_i при i\geq0 (если биты в слагаемых различны, то бит переноса такой же, как в предыдущем разряде; если одинаковы — бит переноса совпадает с их (общим) значением).

Пока мы вводили обозначения, мимоходом решилась задача пункта а). Действительно, присваиваний по приведенным выше формулам нужно сделать O(n) штук.

Для пункта б) используем предыдущую задачу.

Заметим, что если есть схема размера S и глубины H, вычисляющая биты переноса, то из нее легко строится схема размера S+O(n) и глубины H+O(1), вычисляющая сумму (все t_i могут быть найдены параллельно, и, при известных битах переноса r_i, все s_i также могут быть найдены параллельно).

Вычисление битов переноса равносильно сравнению, так что достаточно научиться сравнивать параллельно все "суффиксы" чисел, т.е. для каждого i сравнить числа x_ix_{i-1}\dots x_0 и \neg y_i\neg y_{i-1}\dots\neg y_0.

Вначале сравним числа x_{n-1}x_{n-2}\dots x_0 и \neg y_{n-1}\neg y_{n-2}\dots\neg y_0 по схеме, описанной в предыдущей задаче. Заметим, что при работе этой схемы на нижнем уровне мы сравниваем биты, на следующем — двузначные числа, затем — четырехзначные и т.д. Получаем "сужающееся дерево". Оно дает результаты сравнения блоков по 2^k битов, в частности, для суффиксов длин 1, 2, \dots, 2^m=n. Это числа, двоичная запись которых содержит ровно одну единицу. Комбинируя результаты сравнения суффиксов длины 2^k и соседних с ними блоков, получим результаты сравнения суффиксов, двоичная запись длин которых содержит две единицы. Продолжая этот процесс, мы получим результаты сравнения всех суффиксов. Поскольку количество единиц в двоичной записи длины суффикса не превосходит \log n, глубина полученной схемы O(\log n). Размер схемы линеен — помимо схемы сравнения x и 2^n-1-y (линейного размера) мы используем дополнительно для каждого суффикса один блок, изображенный в центре рис. 15.1, который комбинирует результаты предыдущих сравнений.

1.16 Для вычисления функции \MAJ достаточно научиться подсчитывать число единиц среди значений переменных: дальше можно использовать схему из задачи 1.14. Общее число единиц равно сумме числа единиц среди значений переменных от x_1 до x_{\lfloor n/2\rfloor} и числа единиц среди значений переменных от x_{\lfloor n/2\rfloor+1} до x_n. Представляя это в виде схемы, получим схему глубины \log n, элементами которой должны быть функции, вычисляющие сумму двух чисел. Поскольку эти числа не превосходят n, их двоичная длина не превосходит \log n. Из решения задачи 1.15 вытекает, что глубина таких схем O(\log\!\log n). Глубина всей схемы поэтому O(\log n\log\!\log n) (а размер O(n) ).

1.17 Для графов можно определить операцию возведения в степень. В графе G^k столько же вершин, сколько и в G, а две вершины связаны ребром, если в G их можно соединить путем не длиннее k (в частности, G^1=G ).

Графы будем задавать матрицами смежности. Строки и столбцы матрицы смежности A(G) графа G индексированы вершинами графа. Если (jk)ребро G, то a_{jk}=1, в противном случае a_{jk}=0. Нам будет удобно полагать a_{jj}=1 и считать элементы матрицы булевыми переменными.

Легко понять, что если между вершинами в графе G есть путь, то есть и путь не длиннее n, где n — число вершин в графе G. Так что для решения задачи достаточно построить схему, вычисляющую матрицу A(G^k) для какого-нибудь k\geq n, и схему, выбирающую матричный элемент по заданным номерам строки и столбца.

Для любых положительных k, j, m, таких что k=j+m, справедливо тождество

A(G^k)_{uv}=\bigvee_{w\in V(G)} A(G^j)_{uw}\wedge A(G^m)_{wv}. ( *)

Если сказать словами, то это тождество означает, что на любом пути длины k в графе G, связывающем вершины u и v, есть вершина w такая, что длина пути от u до w равна j, а длина пути от w до v равна m. В обратную сторону, если есть пути между u и w, w и v длины j и m соответственно, то их объединение дает путь длины j+m=k из u в v.

Вычисление матричного элемента по формуле (*) легко записать в виде схемы глубины O(\log n). Вычисляя последовательность матриц A(G^1), A(G^2), A(G^4), \dots последовательным возведением в квадрат, через \lceil \log n\rceil шагов мы получим матрицу A(G^{2^k}), где 2^k\geq n. Глубина построенной схемы \log^2n, а размер полиномиален по n.

Теперь покажем, как извлекать из набора матричных элементов элемент a_{jk}, если j и k заданы двоичными представлениями \overline{j_l\dots j_0}, \overline{k_l\dots k_0}, l=\lceil \log n\rceil. Заметим, что равенство двух битов x и y проверяется в стандартном базисе формулой x\eqrel y\bydef (\neg x\wedge\neg y)\vee (x\wedge y). Поэтому значение, вычисленное по формуле

\bigvee_{s_l\dots s_0, t_l\dots t_0} a_{\overline{s_l\dots s_0}, \overline{t_l\dots t_0}} \bigwedge_{m=0}^{l} \left(s_m\eqrel j_m\right)\wedge\left(t_m\eqrel k_m\right), ( **)
всегда равно a_{\overline{j_l\dots j_0}, \overline{k_l\dots k_0}}. Размер формулы (**) полиномиален по n. Легко представить эту формулу схемой глубины O(\log n). Можно также сослаться на результат задачи 1.19.

1.18 Используя тождества де Моргана

\neg  \bigvee x_i=\bigwedge \neg x_i, \qquad \neg \bigwedge x_i=\bigvee \neg x_i,
можно добиться, чтобы отрицания применялись первыми. А поскольку \neg f=f\oplus1, применяя при необходимости тождества де Моргана еще раз, можно добиться, чтобы последней применялась дизъюнкция.

После таких преобразований мы получим схему, которая есть ДНФ. И задача свелась к тому, чтобы убедиться, что количество конъюнктов (аргументов дизъюнкции) в любой ДНФ, задающей функцию \PARITY, экспоненциально велико.

Легко понять, что любой конъюнкт в такой ДНФ должен содержать n сомножителей (в противном случае функция, которую задает эта ДНФ, иногда не будет меняться при изменении ровно одного из ее аргументов). Конъюнкт, содержащий n сомножителей, равен 1 ровно на одном наборе значений переменных. Поэтому число конъюнктов не меньше числа единиц функции \PARITY, которое равно 2^{n-1}.

Замечание. Можно доказать, что схемы любой фиксированной глубины из элементов \NOT и \OR, \AND с произвольным числом входов, вычисляющие функцию \PARITY, имеют экспоненциальный размер. Доказательство строится по индукции, основание которой дают схемы глубины 2 и 3 (изложенный выше случай).

Доказательство этого утверждения можно найти в [24]. Приведем краткое изложение основной идеи. Заметим, что применение дизъюнкции и конъюнкции в схеме минимального размера должно чередоваться. Заменяя дизъюнкцию конъюнкций на конъюнкцию дизъюнкций, можно уменьшить глубину схемы на 2. Однако размер схемы может при этом увеличиться квадратично, поэтому никакой разумной оценки так не получается. Для получения оценки случайным образом присвоим значения части переменных. Полученная функция от меньшего числа переменных — либо \PARITY, либо ее отрицание. Схемная сложность для отрицания \PARITY такая же, как и для самой \PARITY. А с некоторой вероятностью наша схема упростится и перестановка конъюнкций и дизъюнкций не приведет к большому увеличению размера схемы.

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