Дерево Уоллеса — различия между версиями
(→Схемная сложность) |
(math → tex) |
||
Строка 8: | Строка 8: | ||
[[file:wallace_tree.png|thumb|200px|Иллюстрация работы дерева для суммирования 9 чисел]] | [[file:wallace_tree.png|thumb|200px|Иллюстрация работы дерева для суммирования 9 чисел]] | ||
− | В отличие от ещё одной схемы для умножения --- [[Матричный умножитель|матричного умножителя]], дерево Уоллеса складывает все числа не последовательно, а с помощью специального элемента(назовём его < | + | В отличие от ещё одной схемы для умножения --- [[Матричный умножитель|матричного умножителя]], дерево Уоллеса складывает все числа не последовательно, а с помощью специального элемента(назовём его <tex>3\to2</tex>), преобразующего 3 числа <tex>x, 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 пока не осталось 2 числа. | # Повторяются пункты 1 и 2 пока не осталось 2 числа. | ||
# Оставшиеся 2 числа складываются с помощью [[Двоичный каскадный сумматор|двоичного каскадного сумматора]]. | # Оставшиеся 2 числа складываются с помощью [[Двоичный каскадный сумматор|двоичного каскадного сумматора]]. | ||
Строка 20: | Строка 20: | ||
===Элемент 3→2=== | ===Элемент 3→2=== | ||
[[file:3→2.png|thumb|200px|Элемент 3→2]] | [[file:3→2.png|thumb|200px|Элемент 3→2]] | ||
− | Теперь о том, как устроен элемент < | + | Теперь о том, как устроен элемент <tex>3\to2</tex>. |
− | Для построения элемента < | + | Для построения элемента <tex>3\to2</tex> нам потребуется элемент, который умеет складывать 3 бита и возвращать 2 бита результата. |
Основная идея реализации - отдельная обработка переносов и остатков. | Основная идея реализации - отдельная обработка переносов и остатков. | ||
− | Тогда первое число ответа < | + | Тогда первое число ответа <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_0 & = 0\\ | ||
b_{i + 1} & = \langle x_i, y_i, z_i \rangle | b_{i + 1} & = \langle x_i, y_i, z_i \rangle | ||
− | \end{cases}</ | + | \end{cases}</tex> , |
− | где < | + | где <tex>\langle x, y, z\rangle</tex> - функция медианы(она же "голосование 2 из 3"). С помощью этой функции считается перенос. |
− | Очевидно, полученные числа < | + | Очевидно, полученные числа <tex>a</tex> и <tex>b</tex> дадут в сумме <tex>x + y + z</tex> |
==Схемная сложность== | ==Схемная сложность== | ||
Строка 42: | Строка 42: | ||
Определим схемную сложность этого элемента. | Определим схемную сложность этого элемента. | ||
− | Каждый элемент < | + | Каждый элемент <tex>3\to2</tex> имеет глубину <tex>O(1)</tex> и размер <tex>O(n)</tex>. |
− | Подсчитаем количество элементов < | + | Подсчитаем количество элементов <tex>3\to2</tex>. На каждом шаге количество чисел, которые нужно просуммировать, уменьшается в <tex>1,{}5</tex> раза. Тогда глубина дерева будет равна <tex>\log_{3/2}n</tex>, и в нём будет <tex>n + \frac23n + \left(\frac23\right)^2n + \ldots = O(n)</tex> элементов <tex>3\to2</tex>. |
Тогда общая сложность равна | Тогда общая сложность равна | ||
− | < | + | <tex>depth = depth_{3\to2} \cdot \log_{3/2}n + depth_{sum} = O(\log n)</tex> |
− | < | + | <tex>size = size_{3\to2} \cdot O(n) + size_{sum} = O(n^2) </tex> |
Версия 23:59, 13 октября 2010
Определение
Дерево Уоллеса - схема для умножения двух чисел.
Принцип работы
Дерево Уоллеса
В отличие от ещё одной схемы для умножения --- матричного умножителя, дерево Уоллеса складывает все числа не последовательно, а с помощью специального элемента(назовём его ), преобразующего 3 числа и в числа и такие, что .
С помощью этого элемента на каждом шаге производятся следующие операции:
- Берутся тройки чисел , , . При этом какие-то числа могут остаться.
- Для каждой тройки применяется элемент .
- Повторяются пункты 1 и 2 пока не осталось 2 числа.
- Оставшиеся 2 числа складываются с помощью двоичного каскадного сумматора.
На выходе имеем число, которое равно сумме чисел на всех входах.
Элемент 3→2
Теперь о том, как устроен элемент
.Для построения элемента
нам потребуется элемент, который умеет складывать 3 бита и возвращать 2 бита результата. Основная идея реализации - отдельная обработка переносов и остатков.Тогда первое число ответа
может быть получена так: , где , и - входные числа, а , и - соответствующие их -е биты.Второе же число
можно получить так: , где - функция медианы(она же "голосование 2 из 3"). С помощью этой функции считается перенос.Очевидно, полученные числа
и дадут в суммеСхемная сложность
Определим схемную сложность этого элемента.
Каждый элемент
имеет глубину и размер .Подсчитаем количество элементов
. На каждом шаге количество чисел, которые нужно просуммировать, уменьшается в раза. Тогда глубина дерева будет равна , и в нём будет элементов . Тогда общая сложность равна