Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[234]

будет содержаться текущий номер уровня в дереве рекурсии (растущий от s = 1 для листьев до lgra для корня, когда мы получаем га-элементный результат). Вот схема программы:

1for $s \leftarrow 1$ to $\lg n$

2\quad do for $k \leftarrow 0$ to $n-l$ by $2~s$

3\qquad do преобразовать два $2~{з-1}$-элементных куска \quad\qquad $A[k..k+2~{s-l}-l]$ и $A[k+2~{s-l>..k+2~s-l]$ \quad\qquad в $2~з$-элементный кусок $A[k..k+2~s-l]$

Опишем тело цикла (строка 3) более подробно. Мы воспроизводим цикл for из процедуры Recursive-FFT, используя вместо у И кусок A[k..k + 2S~1 - 1], а вместо у№ - кусок А[к + 25"1 ..к + 2S - 1]. Значение и (используемое в преобразовании бабочки) зависит от s: оно есть ujm, где т = 2s. Временная переменную и используется в преобразовании бабочки. Таким образом, развёртывая строку 3 в предыдущей процедуре, получаем такую программу:

\textsc{FFT-Base}

1$п \leftarrow length[а]$ \qquad $п$ есть степень 2

2for $s \leftarrow 1$ to $\lg n$

3\quad do $m \leftarrow 2~s$

4\qquad $\omega m \leftarrow e~{2\pi i/m}$

5\qquad for $k \leftarrow 0$ to $n-l$ by m

6\qquad\quad do $\omega \leftarrow 1$

7\qquad\qquad for $j \leftarrow 0$ to $m/2-l$

8\qquad\qquad\quad do $t \leftarrow \omega A[k+j+m/2]$

9\qquad\qquad\qquad $u \leftarrow A[k+j]$

10\qquad\qquad\qquad $A[k+j] \leftarrow u + t$

11\qquad\qquad\qquad $A[k+j+m/2] \leftarrow u - t$

12\qquad\qquad\qquad $\omega \leftarrow \omega \omega m$

Наконец, представим окончательную версию итеративной процедуры быстрого преобразования Фурье, в которой два внутренних цикла переставлены (экономия при вычислении uj) и использована дополнительная процедура Bit-Reverse-Copy(<2, А), копирующая элементы вектора а в массив А в нужном нам порядке.

\textsc{Iterative-FFT>$(a)$

1\textsc{Bit-Reverse-Copy>$(a, А)$

2$п \leftarrow length[а]$ \quad $п$ --- степень $2$

3for $s \leftarrow 1$ to $\lg n$

4\quad do $m \leftarrow 2~s$

5\qquad $\omega m \leftarrow e~{2\pi i/m}$

6\qquad $\omega \leftarrow 1$

7\qquad for $j \leftarrow 0$ to $m/2-l$

8\qquad\quad do for $k \leftarrow j$ to $n-l$ by $m$


9\qquad\qquad\quad do $t \leftarrow \omega A [k+m/2]$

10\qquad\qquad\qquad $u \leftarrow A[k]$

11\qquad\qquad\qquad $A[k] \leftarrow u+t$

12\qquad\qquad\qquad $A[k+m/2] \leftarrow u-t$

13\qquad\qquad $\omega \leftarrow \omega \omega m$

Каким образом процедура Bit-Reverse-Copy переставляет элементы входного вектора а, помещая их в массив А? Посмотрев на листья дерева на рис. 32.4, можно заметить, что они расположены «перевёрнутом двоичном» порядке ("bit-reverse binary"). Объясним, что имеется в виду. Через rev (к) при к = 0,1, 2,... , 2п - 1 обозначим (lg га)-битовое целое число, двоичная запись которого получается, если написать двоичную запись числа к (всего lgra битов, включая начальные нули, если они есть) «задом наперёд». Так вот, процедура Bit-Reverse-Copy помещает элемент ак в А[геи(&)]. На рисунке 32.4, например, листья ао,а\,а2, ,а? появляются в позициях 0, 4, 2, 6, 1, 5, 3, 7; в двоичной системе номера позиций записываются как ООО, 100, 010, 110, 001, 101, 011, 111. (Отметим, что rev (rev (к)) = к.)

Чтобы понять, почему листья идут в перевёрнутом двоичном порядке, заметим, что в корне дерева налево идут индексы с нулевым младшим битом, а направо - с единичным, что после обращения битов соответствует обычному порядку (сначала числа с нулевым старшим битом, потом с единичным). Отбрасывая на каждом уровне младший бит, мы продолжаем этот процесс вниз по дереву, и в конце концов получаем перевёрнутый двоичный порядок в листьях.

Поскольку функцию rev(k) легко вычислять, можно записать процедуру Bit-Reverse-Copy (копирование в перевёрнутом двоичном порядке) следующим образом:

\textsc{Bit-Reverse-Copy}$(a,А)$

1$n \leftarrow length[а]$

2for $k \leftarrow 0$ to $n-l$

3\quad do $A [{\mathrm rev}(k)] \leftarrow a k$

Построенная итеративная реализация быстрого преобразования Фурье требует времени О (га lgra). В самом деле, вызов Bit-Reverse-Copy заведомо укладывается в О (га lgra) операций, поскольку цикл исполняется га раз, а целое число от 0 до га - 1 занимает lgra битов, которые могут быть обращены за время О (lgra). (На практике мы обычно заранее знаем значение га, поэтому можем изготовить таблицу значений функции rev (к) заранее и пользоваться этой таблицей. Можно также использовать приём из задачи 18-1, позволяющий обратить все га чисел от 0 до га - 1 за О (га) операций.)

Мы должны ещё проверить, что остальная часть процедуры Iterative-FFT требует времени ©(гаlgra), Это ясно: на каждом из lgra уровней дерева рекурсии (рис. 32.4) имеется га чисел, на


Рис. 31.6 32.5 Схема parralel-FFT, вычисляющая преобразование Фурье для п = 8 входов. Три уровня соответствуют значениям s = 1,2,3. Для п входов подобная схема имеет глубину 0(lgn) и размер 0(nlgn).

получение каждого из них расходуется 0(1) операций.

Параллельная схема быстрого преобразования Фурье

Изложенные идеи позволяют построить схему из функциональных элементов, эффективно выполняющую преобразование Фурье. (Схемы из функциональных элементов описаны в главе 29; в нашем случае элементы будут выполнять арифметические операции.)

Схема, выполняющая преобразование Фурье для га входов, которую мы назовём Parallel-FFT, изображена на рис. 32.5 (для п = 8). Значения на вход поступают в перевёрнутом двоичном порядке; схема содержит lg га каскадов, в каждом из которых параллельно выполняются га/2 преобразований бабочки Таким образом, глубина схемы есть в (lgra).

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

Упражнения

32.3-1

Покажите работу процедуры Iterative-FFT на примере входного вектора (0, 2, 3, -1,4, 5, 7, 9). 32.3-2

Как реализовать алгоритм быстрого преобразования Фурье, выполняя перестановку в перевёрнутом двоичном порядке в конце, а не в начале? (Указание. Рассмотрите обратное преобразование Фурье.)

32.3-3

Сколько проводов, элементов сложения, вычитания и умножения имеется в схеме Parallel-FFT описанной в этом разделе? (Каждый провод соединяет один выход с одним или несколькими входами.)

32.3-4*

Предположим, что сумматоры в схеме Parallel-FFT иногда ломаются и выдают на выходе ноль независимо от входных значений. Предположим, что сломался ровно один сумматор, и мы не знаем, какой. Как можно быстро его найти, подавая на вход схемы разные наборы значений и наблюдая за выходными значениями?

Задачи

32-1 Умножение методом разделяй и властвуй

a.Покажите, как умножить два линейных многочлена ах + Ь и cx-\-d, сделав только три умножения. (Указание: одним из умножений будет (а + Ъ) (с + d).)

b.Предложите два алгоритма для вычисления произведения двух



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]