Изменения

Перейти к: навигация, поиск

Дерево Уоллеса

1752 байта добавлено, 19:39, 4 сентября 2022
м
rollbackEdits.php mass rollback
==Определение== '''Дерево Уоллеса ''' (англ. ''Wallace tree'') {{- --}} [[Реализация булевой функции схемой из функциональных элементов|схема ]] для умножения двух чисел. Время работы <tex>O(\log n)</tex>.
==Принцип работы==
[[file:wallace_tree.png|thumb|200px|Иллюстрация работы дерева для суммирования 9 чисел]]
В Для получения произведения, воспользуемся методом, напоминающим умножение «в столбик»: распишем произведение в сумму <tex>n</tex> чисел (как в [[Матричный умножитель|матричном умножителе]]). Однако, в отличие от ещё одной схемы для умножения --- [[Матричный умножитель|матричного умножителя]], дерево Уоллеса складывает все числа не последовательно, а с помощью специального элемента(назовём его <tex>3\to2</tex>), преобразующего <tex>3 </tex> числа <tex>x</tex>, <tex>y</tex> и <tex> z </tex> в числа <tex>a</tex> и <tex>b</tex> такие, что <tex>x + y + z = a + b</tex>.
С помощью этого элемента на каждом шаге производятся следующие операции:
# Берутся тройки чисел <tex>(x_1, x_2, x_3)</tex>, <tex>(x_4, x_5, x_6)</tex>, <tex>\ldots</tex>. При этом какие-то числа могут остаться.
# Для каждой тройки применяется элемент <tex>3\to2</tex>.
# Повторяются пункты 1 и 2 пока не осталось <tex>2 </tex> числа.# Оставшиеся <tex>2 </tex> числа складываются с помощью [[Двоичный каскадный сумматор|двоичного каскадного сумматора]].
На выходе имеем число, которое равно сумме чисел на всех входах.
===Элемент 3→2===
[[file:3→23v2.png|thumb|200px300px|Элемент 3→2]]Теперь о томДля того, чтобы представить сумму трёх чисел с помощью двух чисел, как устроен элемент воспользуемся полным сумматором. Для каждого <tex>3\to2i</tex>. Для построения элемента направим <tex>3\to2x_i</tex> нам потребуется элемент, который умеет складывать 3 бита <tex>y_i</tex> и возвращать 2 бита результата<tex>z_i</tex> на вход полного сумматора.Основная идея реализации Тогда младший бит сумматора будет <tex>i</tex>-ым битом первого числа, а старший {{---}} <tex>(i + 1)</tex>- отдельная обработка переносов и остатковым второго.
Тогда первое число ответа <tex>a</tex> может быть получена так:<tex>a_i = x_i \oplus y_i \oplus z_i</tex> Очевидно,где полученные числа в сумме дают <tex>x</tex>, <tex>+ y</tex> и <tex>+ z</tex> - входные числа, а <tex>x_i</tex>, <tex>y_i</tex> и <tex>z_i</tex> - соответствующие их <tex>i</tex>-е биты.
Второе же число На иллюстрации изображён элемент <tex>b</tex> можно получить так:<tex> \begin{cases}b_0 & = 0\\b_{i + 1} & = \langle x_i, y_i, z_i \rangle3\end{cases}to2</tex> для четырёхбитных чисел,где <tex>\langle xв верхнем прямоугольнике изображены четыре полных сумматора, y, z\rangle</tex> - функция медианы(она же "голосование 2 из 3"). С помощью этой функции считается переносвыходы которых и являются разрядами результатов.
ОчевидноПоскольку все полные сумматоры работают параллельно (выходы на каждом из них зависят только от собственных входов), полученные числа <tex>a</tex> и <tex>b</tex> дадут в сумме <tex>x + y + z</tex>то глубина такой схемы есть константа (не зависит от количества бит).
==Схемная сложность==
Определим схемную сложность этого элементаколичество элементов и глубину схемы для умножения двух чисел из <tex>n</tex> бит.
Каждый элемент <tex>3\to2</tex> имеет глубину <tex>O(1)</tex> и размер <tex>O(n)</tex>.
Подсчитаем количество элементов <tex>3\to2</tex>. На каждом шаге количество чисел, которые нужно просуммировать, уменьшается в <tex>1,{}5</tex> полтора раза. Тогда глубина дерева будет равна <tex>\log_{\frac{3/}{2}}n</tex>, и в нём будет <tex>n + \frac23n dfrac{2}{3} n + \left(\frac23dfrac{2}{3}\right)^2n + \ldots = O(n)</tex> элементов <tex>3\to2</tex>. Обозначим за <tex>size</tex> общее количество элементов в цепи; за <tex>size_{3\to2}</tex> количество элементов <tex>3\to2</tex>; за <tex>size_{sum}</tex> количество элементов двоичного каскадного сумматора в схеме; за <tex>depth</tex> глубину схемы; за <tex>depth_{3\to2}</tex> глубину каждого из элементов <tex>3\to2</tex>; за <tex>depth_{sum}</tex> глубину каждого из элементов двоичного каскадного сумматора.
Тогда общая сложность равна
<tex>size = size_{3\to2} \cdot O(n) + size_{sum} = O(n^2) </tex>
 
== См. также ==
* [[Матричный умножитель]]
* [[Сумматор]]
* [[Каскадный сумматор]]
* [[Двоичный каскадный сумматор]]
 
== Источники информации==
 
* Кормен, Т., Лейзерсон, Ч., Ривест, Р. Алгоритмы: построение и анализ — 960 с. — ISBN 5-900916-37-5
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Схемы из функциональных элементов ]]
1632
правки

Навигация