Опубликован: 24.04.2007 | Доступ: свободный | Студентов: 722 / 35 | Оценка: 4.60 / 4.30 | Длительность: 25:56:00
Специальности: Программист
Лекция 2:

Схемы из функциональных элементов

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >

Теорема 13. Существует схема умножения двух n -разрядных чисел размера O(n^{\log_2 3}) и глубины O(\log^2 n).

Начнем с такого замечания. Вычисляя произведение двух комплексных чисел

(a+bi)(c+di)=(ac-bd)+(ad+bc)i
обычным способом, мы делаем четыре умножения. Но можно обойтись и тремя с помощью такого трюка: вычислить ac, bd и (a+b)(c+d), а потом найти ad+bc как разность (a+b)(c+d)-ac-bd.

Аналогичный фокус можно проделать и для целых чисел. Разобьем 2n -битовое число на две n -битовые части, то есть представим его в виде a2^n+b. Теперь запишем произведение двух таких чисел:

(a2^n+b)(c2^n+d)=ac2^{2n}+(ad+bc)2^n+bd.
Теперь видно, что достаточно найти три произведения ac, bd и (a+b)(c+d), чтобы определить все три слагаемых в правой части равенства. Получается, что умножение двух 2n -разрядных чисел сводится к трем умножениям n -разрядных и к нескольким сложениям и вычитаниям. (На самом деле при умножении (a+b) на (c+d) сомножители могут быть (n+1) -разрядными, но это не страшно, так как обработка лишнего разряда сводится к нескольким сложениям.)

Для размера схемы, таким образом, получается рекурсивная оценка

S(2n)\le 3S(n)+O(n),
из которой следует, что S(n)=O(n^{\log_2 3}). В самом деле, для умножения n -разрядных чисел требуется дерево рекурсивных вызовов глубины \log_2 n и степени ветвления 3. Заметим, что размер схемы в вершине пропорционален числу складываемых битов. При переходе от одного уровня к следующему (более близкому к корню) размер слагаемых растет вдвое, а число вершин уменьшается втрое, поэтому общее число элементов на этом уровне уменьшается в полтора раза. Таким образом, при движении по уровням от листьев к корню получается убывающая геометрическая прогрессия со знаменателем 2/3, сумма которой всего лишь втрое превосходит ее первый член. Остается заметить, что число листьев равно 3^{\log_2 n}=n^{\log_2 3}.

Оценка глубины также очевидна: на каждом уровне мы имеем схему сложения глубины O(\log n), а число уровней есть O(\log n).

На этом мы завершаем знакомство со схемами из функциональных элементов, выполняющими арифметические операции. О них можно прочесть в главе 29 учебника Кормена, Лейзерсона и Ривеста [18] и в книге Ахо, Хопкрофта и Ульмана [1].

Рассмотрим теперь функцию "голосования"(majority).Она имеет нечетное число аргументов, и значение ее равно 0 или 1 в зависимости от того, какое из двух значений чаще встречается среди входов.

Теорема 14. Существует схема размера O(n) и глубины O(\log n\log\log n), вычисляющая функцию голосования.

На самом деле можно даже вычислить общее число единиц среди входов. Это делается рекурсивно: считаем отдельно для каждой половины, потом складываем. Получается логарифмическое число уровней. На верхнем уровне надо складывать числа размера \log
n, на следующем— размера {(\log n -1)} и так до самого низа, где складываются однобитовые числа (то есть биты входа). Какой средний размер складываемых чисел? Половина вершин в дереве приходится на нижний уровень (числа длины 1 ), четверть — на следующий (числа длины 2 ) и т. д. Вспоминая, что ряд \sum(k/2^k) сходится, видим, что средний размер складываемых чисел есть O(1) и общий размер схемы есть O(n). А общая глубина есть O(\log n \log\log n), так как на каждом из \log n уровней стоит схема глубины O(\log\log n).

Заметим, что хотя функция голосования монотонна, построенная схема ее вычисления содержит немонотонные элементы (поскольку операция сложения не монотонна). Мы уже говорили, что всякую монотонную функцию можно составить из конъюнкций и дизъюнкций. Для функции голосования есть очевидный способ это сделать: написать дизъюнкцию всех конъюнкций размера (n+1)/2 (напомним, что число входов n предполагается нечетным). Однако при этом получится схема экспоненциального по n размера.

Теорема 15. Существует схема размера O(n^c) и глубины O(\log n), составленная только из элементов И и ИЛИ (с двумя входами), вычисляющая функцию голосования.

Для начала заметим, что ограничение на размер является следствием ограничения на глубину, так как элементы И и ИЛИ имеют только два входа и число элементов в схеме глубины d есть O(2^d).

Схема будет строиться из элементов большинства с тремя входами. (Каждый из них можно собрать из конъюнкций и дизъюнкций по формуле (a\land b)\lor (a\land c)\lor (b\land c).) Выход схемы будет большинством из трех значений, каждое из которых есть большинство из трех значений и т. д. (рис. 2.3).

Дерево из элементов 3-большинства

Рис. 2.3. Дерево из элементов 3-большинства

Продолжая эту конструкцию на k уровнях, мы получим схему с 3^k входами. (Отметим, что эта схема не будет вычислять большинство среди своих входов — по той же причине, по которой результат непрямого голосования может отличаться от мнения большинства.) Но мы сделаем вот какую странную вещь: возьмем k равным c\log n при достаточно большом коэффициенте пропорциональности c (при этом число входов такой схемы будет полиномиально зависеть от n ) и напишем на входах случайно выбранные переменные из данного нам набора x_1,\dots,x_n. (Переменные, записываемые на разных входах, выбираются независимо.) Оказывается, что с ненулевой вероятностью эта схема будет вычислять функцию большинства среди x_1,\dots,x_n, если константа c достаточно велика. Следовательно, искомая схема существует.

Обратите внимание: нам удастся доказать существование интересующей нас схемы, не предъявив ее явно. (Такое использование вероятностных методов в комбинаторных рассуждениях часто бывает полезно.)

Итак, почему же схема с положительной вероятностью вычисляет функцию большинства? Это доказывается так: рассмотрим какой-то один набор значений на входах и докажем, что на этом конкретном наборе случайная схема выдает правильный ответ с вероятностью, очень близкой к единице (равной 1-\varepsilon при очень малом \varepsilon ).

Если число \varepsilon настолько мало, что остается меньшим единицы даже после умножения на число возможных входов ( 2^n ), то получаем требуемое (каждое из 2^n событий имеет вероятность не меньше 1-\varepsilon, значит их пересечение имеет вероятность не меньше 1-2^n\varepsilon\hm>0 ).

Итак, осталось оценить вероятность того, что случайная схема даст правильный ответ на данном входе. Пусть доля единиц среди всех входов равна p. Тогда на каждый входной провод схемы подается единица с вероятностью p и нуль с вероятностью 1-p (выбор случайной переменной дает единицу с вероятностью p ), причем сигналы на всех входах независимы.

Если на трех входах элемента 3 -большинства сигналы независимы, и вероятность появления единицы на каждом входе есть p, то вероятность появления единицы на выходе есть \varphi(p)\hm=3p^2(1-p)+p^3\hm=3p^2-2p^3. На следующих уровнях вероятность появления единицы будет равна \varphi(\varphi(p)),\varphi(\varphi(\varphi(p))),\dots График функции \varphi(x) на отрезке [0,1] (рис. 2.4) показывает, что при итерациях функции \varphi дисбаланс (отклонение от середины) нарастает и последовательность стремится к краю отрезка. Надо только оценить число шагов.

Итерируемая функция

Рис. 2.4. Итерируемая функция

Если вначале единицы составляют большинство из n аргументов (напомним, n нечетно), то их как минимум (n+1)/2, так что p\ge (n+1)/2n\hm=1/2+1/(2n). Таким образом, начальный дисбаланс составляет как минимум 1/2n. А в конце нам нужно приблизиться к краю отрезка на расстояние 2^{-n}.

Итак, нам осталось доказать такую лемму (относящуюся скорее к математическому анализу):

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >