Опубликован: 24.04.2007 | Уровень: специалист | Доступ: платный
Лекция 2:

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

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

Теорема 10. Существует схема размера O(n), осуществляющая сложение двух n -битовых чисел.

Напомним смысл обозначения O(n): нам надо построить схему сложения n -битовых чисел, имеющую размер не более cn для некоторого c и для всех n.

Вспомним, как складывают числа в столбик:

\arraycolsep=1pt
\begin{array}{rrrrr}
    &0 &1 &1 &\\
    &1 &0 &0 &1\\
    &1 &0 &1 &1\\
\hline
  1 &0 &1 &0 &0
\end{array}
Верхняя строка — биты переноса, нижняя — результат. Заметим, что каждый из битов переноса или результата определяется тремя другими битами (бит результата равен сумме двух битов слагаемых и бита переноса по модулю 2, а бит переноса равен 1, если хотя бы два из этих трех битов равны 1 ). Поэтому можно составить схему, которая вычисляет эти биты справа налево и имеет размер O(n).

Заметим, что теорему 9 легко вывести из теоремы 10: чтобы сравнить числа x и y, сложим число (2^n-1)-x (то есть число x, в котором все единицы заменены нулями и наоборот) и число y. Если в старшем разряде появится единица, то y>x, а если нет, то y\le x. Остается заметить, что и сложение, и обращение битов в числе x требуют схем линейного размера. Таким образом, сравнение чисел сводится к вычислению бита переноса. Верно и обратное: вычисление бита переноса сводится к сравнению двух чисел (обратим в одном из слагаемых все биты).

Тем не менее конструкция, использованная при доказательстве теоремы 9, имеет некоторые преимущества. Назовем глубиной схемы максимальное число элементов на пути от входа к выходу. Если представить себе, что сигнал на выходе элемента появляется не сразу после подачи сигналов на входы, а с некоторой задержкой, то глубина схемы определяет суммарную задержку. Легко понять, что рекурсивная схема сравнения имела глубину O(\log n) (число уровней пропорционально логарифму размера входа), в то время как построенная только что схема сложения имеет глубину, пропорциональную n (биты переноса вычисляются последовательно, справа налево). Но можно соединить эти два результата:

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

Как мы видели, проблема в том, что биты переноса вычисляются последовательно, а не параллельно. Если удастся их все вычислить схемой размера O(n) и глубины O(\log n), то дальнейшее очевидно.

Как мы упоминали, вычисление битов переноса равносильно сравнению, так что для доказательства теоремы достаточно научиться сравнивать параллельно все "суффиксы"двух n -битовых чисел x_1\dots x_n и y_1\dots y_n, т. е. для каждого i сравнить числа x_ix_{i+1}\dots x_n и y_iy_{i+1}\dots y_n.

Вспомним, что мы делали при сравнении чисел (скажем, длины 8 ). На нижнем уровне мы сравнивали биты:

\begin{array}{cccccccc}
x_1 &x_2 &x_3 &x_4 &x_5 &x_6 &x_7 &x_8 \\
y_1 &y_2 &y_3 &y_4 &y_5 &y_6 &y_7 &y_8
\end{array}
На следующем уровне мы сравнивали двузначные числа
\begin{array}{cccc}
x_1x_2 &x_3x_4 &x_5x_6  &x_7x_8 \\
y_1y_2 &y_3y_4 &y_5y_6  &y_7y_8
\end{array}
затем четырехзначные
\begin{array}{cc}
x_1x_2x_3x_4 &x_5x_6x_7x_8 \\
y_1y_2y_3y_4 &y_5y_6y_7y_8
\end{array}
и, наконец, восьмизначные:
\begin{array}{c}
x_1x_2x_3x_4x_5x_6x_7x_8 \\
y_1y_2y_3y_4y_5y_6y_7y_8
\end{array}
Таким образом, для суффиксов длины 8, 4, 2 и 1 результаты сравнения уже есть. Для суффикса длины 6 результат можно получить, комбинируя результат сравнения x_3x_4 ? y_3y_4 и x_5x_6x_7x_8 ? y_5y_6y_7y_8. После этого у нас есть информация о суффиксах всех четных длин, и соединяя ее с информацией с первого этапа, получаем сведения про все суффиксы. Например, для сравнения суффиксов длины 7, то есть x_2\dots x_8 и y_2\dots y_8, мы соединяем результаты сравнения x_2 и y_2 с результатами сравнения суффиксов длины 6, то есть x_3\dots x_8 и y_3\dots y_8.

В общем случае картина такая: после "сужающегося дерева" мы строим "расширяющееся"; за k шагов до конца мы знаем результаты сравнения всех суффиксов, длины которых кратны 2^k. Это дерево имеет размер O(n) и глубину O(\log n), что завершает доказательство.

14. Покажите, что вычитание двух n -битовых чисел по модулю 2^n выполняется схемой размера O(n) и глубины O(\log n). (Указание: вычитание легко сводится к сложению, если заменить нули на единицы и наоборот.)

Теперь займемся умножением. Схема умножения двух n -разрядных чисел имеет 2n входов (по n для каждого множителя) и 2n выходов для произведения.

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

Получение этих копий требует схемы размера O(n^2) (общее число цифр в копиях) и глубины O(1). Сложение двух 2n -разрядных чисел мы можем выполнить с помощью схемы размера O(n) и глубины O(\log n), так что необходимые n-1 сложений можно выполнить схемой размера O(n^2) и глубины O(\log^2n) (если складывать сначала попарно, потом результаты снова попарно и т. д.). Оказывается, этот результат можно улучшить. Наиболее экономные способы основаны на преобразовании Фурье (о них можно прочесть в книге [1]). С их помощью, например, можно построить схему умножения n -битовых чисел, имеющую размер n\log^c n.

Эти методы далеко выходят за рамки нашего обсуждения, но два улучшения мы приведем.

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

Как мы уже говорили, умножение двух n -разрядных чисел сводится к сложению n таких чисел, и остается выполнить такое сложение схемой размера O(n^2) и глубины O(\log n). Ключевым моментом здесь является сведение сложения трех чисел к сложению двух с помощью простой схемы размера O(n) и глубины O(1). В самом деле, пусть есть три числа x, y и z. Если мы будем складывать отдельно в каждом разряде, то в разряде может накопиться любая сумма от 0 до 3, то есть в двоичной записи от 00 до 11. Сформируем из младших битов этих двухбитовых сумм число u, а из старших (сдвинутых влево) — число v. Тогда, очевидно, x+y+z=u+v. Получение цифр числа u и v происходит параллельно во всех разрядах и требует размера O(n) и глубины O(1).

Теперь, если надо сложить n чисел, можно разбить их на тройки и из каждых трех чисел получить по два. В следующий круг, таким образом, выйдут (2/3)n чисел (примерно — граничные эффекты большой роли не играют). Их снова можно сгруппировать по тройкам и т. д. С каждым уровнем число слагаемых убывает в полтора раза, так что глубина схемы будет логарифмической. Каждое преобразование трех слагаемых в два требует схемы размера O(n) и уменьшает число слагаемых на единицу, так что потребуется n таких преобразований. Итак, эта конструкция имеет общий размер O(n^2) и глубину O(\log n). Надо только отметить, что в конце у нас получается не одно число, а два, и их напоследок надо сложить — что мы умеем делать с глубиной O(\log n) и размером O(n).

15. Докажите, что схема, вычисляющая булеву функцию f от n аргументов, у которой ни один аргумент не является фиктивным, имеет размер не менее cn и глубину не менее c\log n, где c>0 — некоторая константа, зависящая от выбранного набора элементов. (Аргумент функции называют фиктивным, если от него значение функции не зависит.)

Эта задача показывает, что если в процессе умножения двух n -разрядных чисел мы суммируем n слагаемых размера n, то оценки O(n^2) для размера и O(\log n) для глубины, полученные при доказательстве теоремы 12, существенно улучшить нельзя.

Однако никто не обязывает нас следовать традиционному способу умножения столбиком — отказавшись от него, мы можем уменьшить размер схемы.

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >
Алексей Васильев
Алексей Васильев
Россия, Новосибирск
David Satseradze
David Satseradze
Грузия, Тбилиси