Схемы из функциональных элементов
Теорема 10. Существует схема размера , осуществляющая сложение
двух
-битовых чисел.
Напомним смысл обозначения : нам надо построить
схему сложения
-битовых чисел, имеющую размер не
более
для некоторого
и для
всех
.
Вспомним, как складывают числа в столбик:
![\arraycolsep=1pt
\begin{array}{rrrrr}
&0 &1 &1 &\\
&1 &0 &0 &1\\
&1 &0 &1 &1\\
\hline
1 &0 &1 &0 &0
\end{array}](/sites/default/files/tex_cache/8ebc4355d0462d5ff403b614657b9f4a.png)
![2](/sites/default/files/tex_cache/c81e728d9d4c2f636f067f89cc14862c.png)
![1](/sites/default/files/tex_cache/c4ca4238a0b923820dcc509a6f75849b.png)
![1](/sites/default/files/tex_cache/c4ca4238a0b923820dcc509a6f75849b.png)
![O(n)](/sites/default/files/tex_cache/7ba55e7c64a9405a0b39a1107e90ca94.png)
Заметим, что теорему 9 легко вывести из
теоремы 10: чтобы сравнить числа и
, сложим число
(то есть число
, в котором все
единицы заменены нулями и наоборот) и число
. Если в старшем
разряде появится единица, то
, а если нет, то
.
Остается заметить, что и сложение, и обращение битов в числе
требуют схем линейного размера. Таким образом, сравнение чисел
сводится к вычислению бита переноса. Верно и обратное:
вычисление бита переноса сводится к сравнению двух чисел
(обратим в одном из слагаемых все биты).
Тем не менее конструкция, использованная при доказательстве
теоремы 9, имеет некоторые преимущества. Назовем глубиной схемы максимальное число
элементов на пути от входа к выходу. Если представить себе, что
сигнал на выходе элемента появляется не сразу после подачи
сигналов на входы, а с некоторой задержкой, то глубина схемы
определяет суммарную задержку. Легко понять, что рекурсивная
схема сравнения имела глубину (число уровней
пропорционально логарифму размера входа), в то время как
построенная только что схема сложения имеет глубину,
пропорциональную
(биты переноса вычисляются последовательно,
справа налево). Но можно соединить эти два результата:
Теорема 11. Существует схема сложения двух -битовых чисел размера
и глубины
.
Как мы видели, проблема в том, что биты переноса вычисляются
последовательно, а не параллельно. Если удастся их все
вычислить схемой размера и глубины
,
то дальнейшее очевидно.
Как мы упоминали, вычисление битов переноса равносильно
сравнению, так что для доказательства теоремы достаточно
научиться сравнивать параллельно все "суффиксы"двух -битовых
чисел
и
, т. е. для
каждого
сравнить числа
и
.
Вспомним, что мы делали при сравнении чисел (скажем, длины ).
На нижнем уровне мы сравнивали биты:
![\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}](/sites/default/files/tex_cache/44a055c97ea52e711d8ed6c7fd221057.png)
![\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}](/sites/default/files/tex_cache/cfae1bdc08c83a88a4089b51b8645653.png)
![\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}](/sites/default/files/tex_cache/99c6b396f28ae6fb4ce7642f3bfbd7c3.png)
![\begin{array}{c}
x_1x_2x_3x_4x_5x_6x_7x_8 \\
y_1y_2y_3y_4y_5y_6y_7y_8
\end{array}](/sites/default/files/tex_cache/cf6a4e594ac8402a53b628ba88fae7cd.png)
![8](/sites/default/files/tex_cache/c9f0f895fb98ab9159f51fd0297e236d.png)
![4](/sites/default/files/tex_cache/a87ff679a2f3e71d9181a67b7542122c.png)
![2](/sites/default/files/tex_cache/c81e728d9d4c2f636f067f89cc14862c.png)
![1](/sites/default/files/tex_cache/c4ca4238a0b923820dcc509a6f75849b.png)
![6](/sites/default/files/tex_cache/1679091c5a880faf6fb5e6087eb1b2dc.png)
![x_3x_4 ? y_3y_4](/sites/default/files/tex_cache/6ab8ab564dd013fec84cd2c40c831f58.png)
![x_5x_6x_7x_8 ? y_5y_6y_7y_8](/sites/default/files/tex_cache/efc967577b4c473ea74f85b3c685ee3b.png)
![7](/sites/default/files/tex_cache/8f14e45fceea167a5a36dedd4bea2543.png)
![x_2\dots x_8](/sites/default/files/tex_cache/3efde74a7e987ac8cfed21d74b1afe87.png)
![y_2\dots y_8](/sites/default/files/tex_cache/6d5cf958dd68f30e2110797f46693293.png)
![x_2](/sites/default/files/tex_cache/8732099f74d777a67257cb2f04ead3d8.png)
![y_2](/sites/default/files/tex_cache/102ab1c6749dce0c13fddf3990dfdfe7.png)
![6](/sites/default/files/tex_cache/1679091c5a880faf6fb5e6087eb1b2dc.png)
![x_3\dots x_8](/sites/default/files/tex_cache/1ee3ed3de5e4854f52a7ca03c612825f.png)
![y_3\dots y_8](/sites/default/files/tex_cache/665404966b80af8b1af3c2aa1c7796ff.png)
В общем случае картина такая: после "сужающегося дерева"
мы строим "расширяющееся"; за шагов до конца мы знаем
результаты сравнения всех суффиксов, длины которых кратны
.
Это дерево имеет размер
и глубину
,
что завершает доказательство.
14. Покажите, что вычитание двух -битовых чисел по модулю
выполняется схемой размера
и глубины
.
(Указание: вычитание легко сводится к сложению, если заменить нули на единицы и наоборот.)
Теперь займемся умножением. Схема умножения двух -разрядных
чисел имеет
входов (по
для каждого множителя) и
выходов для произведения.
Посмотрим, какие оценки дает обычный способ умножения чисел
столбиком. В нем умножение двух -разрядных чисел сводится к
сложению
копий первого числа (частично замененных на нули в
зависимости от цифр второго числа) со сдвигами.
Получение этих копий требует схемы размера (общее число
цифр в копиях) и глубины
. Сложение двух
-разрядных
чисел мы можем выполнить с помощью схемы размера
и
глубины
, так что необходимые
сложений
можно выполнить схемой размера
и глубины
(если
складывать сначала попарно, потом результаты снова попарно и т. д.).
Оказывается, этот результат можно улучшить. Наиболее
экономные способы основаны на преобразовании Фурье (о них можно
прочесть в книге [1]). С их
помощью, например, можно построить схему умножения
-битовых
чисел, имеющую размер
.
Эти методы далеко выходят за рамки нашего обсуждения, но два улучшения мы приведем.
Теорема 12. Существует схема умножения двух -разрядных
чисел размера
и глубины
.
Как мы уже говорили, умножение двух -разрядных чисел
сводится к сложению
таких чисел, и остается выполнить такое
сложение схемой размера
и глубины
.
Ключевым моментом здесь является сведение сложения трех чисел к сложению
двух с помощью простой схемы размера
и
глубины
. В самом деле, пусть есть три числа
,
и
. Если мы будем складывать отдельно в каждом разряде, то в разряде может
накопиться любая сумма от
до
, то есть в двоичной
записи от
до
. Сформируем из младших битов этих
двухбитовых сумм число
, а из старших (сдвинутых влево) — число
. Тогда, очевидно,
. Получение цифр числа
и
происходит параллельно во всех разрядах и требует размера
и глубины
.
Теперь, если надо сложить чисел, можно разбить их на тройки
и из каждых трех чисел получить по два. В следующий круг, таким
образом, выйдут
чисел (примерно — граничные эффекты
большой роли не играют). Их снова можно сгруппировать по тройкам и т. д.
С каждым уровнем число слагаемых убывает в полтора раза,
так что глубина схемы будет логарифмической. Каждое
преобразование трех слагаемых в два требует схемы размера
и уменьшает число слагаемых на единицу, так что потребуется
таких преобразований. Итак, эта конструкция имеет общий размер
и глубину
. Надо только отметить,
что в конце у нас получается не одно число, а два, и их напоследок
надо сложить — что мы умеем делать с глубиной
и
размером
.
15. Докажите, что схема, вычисляющая булеву функцию от
аргументов, у которой ни один аргумент не является фиктивным,
имеет размер не менее
и глубину не менее
,
где
— некоторая константа, зависящая от выбранного набора
элементов. (Аргумент функции называют фиктивным, если от него значение функции не зависит.)
Эта задача показывает, что если в процессе умножения двух -разрядных
чисел мы суммируем
слагаемых размера
,
то оценки
для размера и
для глубины,
полученные при доказательстве теоремы 12, существенно улучшить нельзя.
Однако никто не обязывает нас следовать традиционному способу умножения столбиком — отказавшись от него, мы можем уменьшить размер схемы.