]> mj.ucw.cz Git - ads2.git/blob - 7-fft/7-fft.tex
8037681e2877150873b66a9226536ae9e805ff2a
[ads2.git] / 7-fft / 7-fft.tex
1 \def\scharfs{\char"19}
2 \input lecnotes.tex
3 \prednaska{9}{Fourierova transformace}{}
4
5 \h{Násobení polynomù}
6
7 V~této kapitole se budeme zabývat násobením polynomù. Tento na první pohled
8 triviální algebraický problém má pøekvapivì efektivní øe¹ení, které nás
9 dovede a¾ k~Fourierovì transformaci.
10
11 \s{Znaèení:} {\I Polynomy} jsou výrazy typu
12 $$
13 P(x)=\sum_{i=0}^{n-1} p_i\cdot x^i,
14 $$
15 kde $x$ je~promìnná a $p_0$ a¾ $p_{n-1}$ jsou èísla, kterým øíkáme {\I koeficienty} polynomu.
16 Obecnì budeme znaèit polynomy velkými písmeny a jejich koeficienty pøíslu¹nými
17 malými písmeny s~indexy.
18
19 V~algoritmech polynomy obvykle reprezentujeme pomocí {\I vektoru koeficientù}
20 $(p_0,\ldots,p_{n-1})$; oproti zvyklostem lineární algebry budeme slo¾ky vektorù v~celé
21 této kapitole indexovat od~0. Poètu koeficientù~$n$ budeme øíkat {\I velikost
22 polynomu} $\vert P\vert$. Èasovou slo¾itost algoritmu budeme vyjadøovat vzhledem k~velikostem
23 polynomù na jeho vstupu.
24
25 Pokud pøidáme nový koeficient $p_n=0$, hodnota polynomu se pro ¾ádné~$x$
26 nezmìní. Stejnì tak je-li nejvy¹¹í koeficient~$p_{n-1}$ nulový, mù¾eme ho
27 vynechat. Takto mù¾eme ka¾dý polynom zmen¹it na {\I normální tvar,}
28 v~nìm¾ má buïto nenulový nejvy¹¹í koeficient, nebo nemá vùbec ¾ádné
29 koeficienty -- to je takzvaný {\I nulový polynom,} který pro ka¾dé~$x$ roven nule.
30 Nejvy¹¹í mocninì s~nenulovým koeficientem se øíká {\I stupeò polynomu} $\deg R$,
31 nulovému polynomu pøiøazujeme stupeò~$-1$.
32
33 \s{Násobení polynomù:}
34 Polynomy násobíme jako výrazy:
35 $$
36 P(x)\cdot Q(x) = \Biggl( \sum_{i=0}^{n-1} p_i\cdot x^i \Biggr) \cdot \Biggl( \sum_{j=0}^{m-1} q_j\cdot x^j \Biggr).
37 $$
38 Po~roznásobení mù¾eme tento souèin zapsat jako polynom~$R(x)$, jeho¾
39 koeficient u~$x^k$ je roven $r_k = p_0q_k + p_1q_{k-1} + \ldots + p_kq_0$.
40
41 Snadno nahlédneme, ¾e polynom~$R$ má stupeò $\deg P + \deg Q$ a velikost
42 $\vert P\vert + \vert Q\vert - 1$.
43
44 Algoritmus, který poèítá souèin dvou polynomù velikosti~$n$ pøímo podle definice,
45 proto spotøebuje èas $\Theta(n)$ na výpoèet ka¾dého koeficientu, celkem
46 tedy $\Theta(n^2)$. Pokusíme se nalézt efektivnìj¹í zpùsob.
47
48 \s{Rovnost polynomù:}
49 Odboème na chvíli a uva¾ujme, kdy dva polynomy pova¾ujeme za stejné.
50 Na to se dá nahlí¾et více zpùsoby. Buïto se na polynomy mù¾eme dívat
51 jako na výrazy a porovnávat jejich symbolické zápisy. Pak jsou si dva
52 polynomy rovny právì tehdy, mají-li po~normalizaci stejné vektory koeficientù.
53 Tomu se øíká {\I identická rovnost} polynomù a obvykle se znaèí $P\equiv Q$.
54
55 Druhá mo¾nost je porovnávat polynomy jako reálné funkce. Polynomy $P$ a~$Q$
56 si tedy budou rovny ($P=Q$) právì tehdy, je-li $P(x)=Q(x)$ pro v¹echna $x\in{\bb R}$.
57 Identicky rovné polynomy si jsou rovny i jako funkce, ale musí to platit i naopak?
58 Následující vìta uká¾e, ¾e ano a ¾e dokonce staèí rovnost pro koneèný poèet~$x$.
59
60 \s{Vìta:} Buïte $P$ a~$Q$ polynomy stupnì nejvý¹e~$d$. Pokud platí $P(x_i) = Q(x_i)$
61 pro navzájem rùzná èísla $x_0,\ldots,x_d$, pak jsou $P$ a~$Q$ identické.
62
63 \proof
64 Pøipomeòme nejprve následující standardní lemma o~koøenech polynomù:
65
66 {\narrower\s{Lemma:}
67 Polynom~$R$ stupnì~$t\ge 0$ má nejvý¹e $t$ koøenù (èísel~$\alpha$, pro nì¾ je $P(\alpha)=0$).
68
69 \proof
70 Z~algebry víme, ¾e je-li èíslo $\alpha$ koøenem polynomu~$R(x)$, mù¾eme $R(x)$ beze zbytku vydìlit
71 výrazem $x-\alpha$. To znamená, ¾e $R(x)\equiv (x-\alpha)\cdot R'(x)$ pro nìjaký polynom $R'(x)$
72 stupnì $t-1$. Dosazením ovìøíme, ¾e koøeny polynomu~$R'$ jsou pøesnì tyté¾ jako koøeny polynomu~$R$,
73 s~mo¾nou výjimkou koøene~$\alpha$.
74
75 Budeme-li tento postup opakovat $t$-krát, buïto nám v~prùbìhu dojdou koøeny
76 (a~pak lemma jistì platí), nebo dostaneme rovnost $R(x) \equiv (x-\alpha_1)\cdot\ldots\cdot(x-\alpha_t)\cdot R''(x)$,
77 kde $R''$ je polynom nulového stupnì. Takové polynomy ov¹em nemohou mít ¾ádný
78 koøen, a~tím pádem nemù¾e mít ¾ádné dal¹í koøeny ani~$R$.
79 \qed
80
81 }
82
83 \smallskip
84
85 \>Abychom dokázali vìtu, staèí uvá¾it polynom $R(x)\equiv P(x)-Q(x)$.
86 Tento polynom má stupeò nejvý¹e~$d$, ov¹em ka¾dé z~èísel $x_0,\ldots,x_d$
87 je jeho koøenem. Podle lemmatu musí tedy být identicky nulový, a~proto
88 $P\equiv Q$.
89 \qed
90
91 \s{Zpìt k~násobení:}
92 Vìta, ji¾ jsme právì dokázali, vlastnì øíká, ¾e polynomy mù¾eme reprezentovat
93 nejen vektorem koeficientù, ale také {\I vektorem funkèních hodnot} v~nìjakých smluvených
94 bodech -- tomuto vektoru budeme øíkat {\I graf polynomu.} Pokud zvolíme dostateènì
95 mnoho bodù, je polynom svým grafem jednoznaènì urèen.
96
97 V~této reprezentaci je pøitom násobení polynomù triviální: Souèin polynomù
98 $P$ a~$Q$ má v~bodì~$x$ hodnotu $P(x)\cdot Q(x)$. Staèí tedy grafy vynásobit
99 po~slo¾kách, co¾ zvládneme v~lineárním èase. Jen je potøeba dát pozor na to,
100 ¾e souèin má vy¹¹í stupeò ne¾ jednotliví èinitelé, tak¾e si potøebujeme poøídit
101 dostateèný poèet bodù.
102
103 \s{Algoritmus pro násobení polynomù:}
104 \algo
105 \:Jsou dány polynomy $P$ a~$Q$ velikosti~$n$, urèené svými koeficienty.
106   Bez újmy na obecnosti pøedpokládejme, ¾e horních $n/2$ koeficientù je
107   u~obou polynomù nulových, tak¾e souèin $R=P\cdot Q$ bude také polynom
108   velikosti~$n$.
109 \:Zvolíme navzájem rùzná èísla $x_0,\ldots,x_{n-1}$.
110 \:Spoèítáme grafy polynomù~$P$ a~$Q$, tedy vektory $(P(x_0),\ldots,P(x_{n-1}))$
111   a $(Q(x_0),\ldots,Q(x_t))$.
112 \:Z~toho vypoèteme graf souèinu~$R$ vynásobením po~slo¾kách: $R(x_i)=P(x_i)\cdot Q(x_i)$.
113 \:Nalezneme koeficienty polynomu~$R$ tak, aby odpovídaly grafu.
114 \endalgo
115
116 \>Krok~4 trvá $\Theta(n)$, tak¾e rychlost celého algoritmu stojí a padá s~efektivitou
117 pøevodù mezi koeficientovou a hodnotovou reprezentací polynomù. To obecnì neumíme
118 v~lep¹ím ne¾ kvadratickém èase, ale zde máme mo¾nost volby bodù $x_0,\ldots,x_{n-1}$,
119 tak¾e si je zvolíme tak ¹ikovnì, aby pøevod ¹el provést rychle.
120
121 \h{Pokus o~vyhodnocení polynomu metodou Rozdìl a panuj}
122
123 Uva¾ujme polynom $P$ velikosti~$n$, který chceme vyhodnotit v~$n$~bodech.
124 Body si zvolíme tak, aby byly {\I spárované,} tedy aby tvoøily dvojice li¹ící
125 se pouze znaménkem: $\pm x_{0}, \pm x_{1}, \ldots, \pm x_{n/2-1}$.
126
127 Polynom $P$ mù¾eme rozlo¾it na~èleny se sudými exponenty a ty s~lichými:
128 $$P(x) = (p_{0}x^{0} + p_{2}x^{2} + \ldots + p_{n-2}x^{n-2}) + (p_{1}x^{1} +
129         p_{3}x^{3} + \ldots + p_{n-1}x^{n-1}).$$
130 Navíc mù¾eme z~druhé závorky vytknout~$x$:
131 $$P(x) = (p_{0}x^{0} + p_{2}x^{2} + \ldots + p_{n-2}x^{n-2}) + x\cdot (p_{1}x^{0} +
132         p_{3}x^{2} + \ldots + p_{n-1}x^{n-2}).$$
133 V~obou závorkách se nyní vyskytují pouze sudé mocniny~$x$. Proto mù¾eme
134 ka¾dou závorku pova¾ovat za~vyhodnocení nìjakého polynomu velikosti~$n/2$
135 v~bodì~$x^2$, tedy:
136 $$P(x) = P_s(x^2) + x\cdot P_\ell(x^2),$$
137 kde:
138 $$\eqalign{
139 P_s(t) &= p_0t^0 + p_{2}t^{1} + \ldots + p_{n - 2}t^{n - 2\over 2}, \cr
140 P_\ell(t) &= p_1t^0 + p_3t^1 + \ldots + p_{n - 1}t^{n - 2\over 2}. \cr
141 }$$
142 Navíc pokud podobným zpùsobem dosadíme do~$P$ hodnotu~$-x$, dostaneme:
143 $$P(-x) = P_s(x^2) - x\cdot P_\ell(x^2).$$
144
145 Vyhodnocení polynomu~$P$ v~bodech $\pm x_0,\ldots,\pm x_{n-1}$ tedy
146 mù¾eme pøevést na vyhodnocení polynomù $P_s$ a~$P_\ell$ polovièní velikosti
147 v~bodech $x_0^2,\ldots,x_{n-1}^2$.
148
149 To naznaèuje algoritmus s~èasovou slo¾itostí $T(n) = 2T(n/2) + \Theta(n)$
150 a z~Kuchaøkové vìty víme, ¾e tato rekurence má øe¹ení $T(n) = \Theta(n\log n)$.
151 Jediný problém je, ¾e tento algoritmus nefunguje: druhé mocniny, které pøedáme
152 rekurzivnímu volání, jsou v¾dy nezáporné, tak¾e u¾ nemohou být správnì spárované.
153 Ouvej.
154
155 Tedy \dots{} alespoò dokud poèítáme s~reálnými èísly. Uká¾eme, ¾e v~oboru
156 komplexních èísel u¾ mù¾eme zvolit body, které budou správnì spárované
157 i po~nìkolikerém umocnìní na druhou.
158
159 \h{Intermezzo: Pøipomenutí komplexních èísel}
160 \def\ii{\mkern 0.5mu{\bf i}}
161 \def\im{{\bf i}}
162 \def\e{{\rm e}}
163 \def\\{\hfil\break}
164
165 \s{Základní operace}
166
167 \itemize\ibull
168 \:Definice: ${\bb C} = \{a + b\ii \mid a,b \in {\bb R}\}$, $\im^2=1$.
169
170 \:Sèítání: $(a+b\ii)\pm(p+q\ii) = (a\pm p) + (b\pm q)\ii$.
171
172 \:Násobení: $(a+b\ii)(p+q\ii) = ap + aq\ii + bp\ii + bq\ii^2 = (ap-bq) + (aq+bp)\ii$.
173 Pro $\alpha\in{\bb R}$ je $\alpha(a+b\ii) = \alpha a + \alpha b\ii$.
174
175 \:Komplexní sdru¾ení: $\overline{a+b\ii} = a-b\ii$. \\
176 $\overline{\overline x} = x$, $\overline{x\pm y} = \overline{x} \pm
177 \overline{y}$, $\overline{x\cdot y} = \overline x \cdot \overline y$, $x
178 \cdot \overline x  = (a+b\ii)(a-b\ii) = a^2+b^2 \in {\bb R}$.
179
180 \:Absolutní hodnota: $\vert x \vert = \sqrt{x\cdot\overline{x}}$, tak¾e $\vert
181 a+b\ii \vert = \sqrt{a^2+b^2}$. \\
182 Také $\vert \alpha x \vert = \vert \alpha\vert \cdot \vert x \vert$.
183
184 \:Dìlení: $x/y = (x\cdot \overline{y}) / (y \cdot \overline{y})$.
185 \endlist
186
187 \s{Gau{\scharfs}ova rovina a goniometrický tvar}
188
189 \itemize\ibull
190 \:Komplexním èíslùm pøiøadíme body v~${\bb R}^2$: $a+b\ii \leftrightarrow (a,b)$.
191
192 \:$\vert x\vert$ je vzdálenost od~bodu $(0,0)$.
193
194 \:$\vert x\vert = 1$ pro èísla le¾ící na~jednotkové kru¾nici ({\I komplexní jednotky}). \\
195 Pak platí $x=\cos\varphi + \im\sin\varphi$ pro nìjaké $\varphi\in\left[
196 0,2\pi \right)$.
197
198 \:Pro libovolné $x\in{\bb C}$: $x=\vert x \vert \cdot (\cos\varphi(x) +
199 \im\sin\varphi(x))$. \\
200 Èíslu $\varphi(x)\in\left[ 0,2\pi \right)$ øíkáme {\I argument}
201 èísla~$x$, nìkdy znaèíme $\mathop{\rm arg} x$.
202
203 \:Navíc $\varphi({\overline{x}}) = -\varphi(x)$.
204 \endlist
205
206 \s{Exponenciální tvar}
207
208 \itemize\ibull
209 \:Eulerova formule: $\e^{\im\varphi} = \cos\varphi + \im\sin\varphi$.
210
211 \:Ka¾dé $x\in{\bb C}$ lze tedy zapsat jako $\vert x\vert \cdot \e^{\ii \varphi(x)}$.
212
213 \:Násobení: $xy = \left(\vert x\vert\cdot \e^{\ii\varphi(x)}\right) \cdot
214         \left(\vert y\vert\cdot \e^{\ii\varphi(y)}\right) = \vert x\vert
215         \cdot \vert y\vert \cdot \e^{\ii(\varphi(x) + \varphi(y))}$ \\
216 (absolutní hodnoty se násobí, argumenty sèítají).
217
218 \:Umocòování: $x^\alpha = \left(\vert x\vert\cdot \e^{\ii\varphi(x)}\right)^
219         \alpha = {\vert x\vert}^\alpha\cdot \e^{\ii \alpha \varphi(x)}$.
220 \endlist
221
222 \s{Odmocniny z~jednièky}
223
224 \smallskip
225
226 Odmocòování v~komplexních èíslech obecnì není jednoznaèné: jestli¾e tøeba
227 budeme hledat ètvrtou odmocninu z~jednièky, toti¾ øe¹it rovnici $x^4=1$, nalezneme
228 hned ètyøi øe¹ení: 1, $-1$, $\im$ a $-\im$.
229
230 Prozkoumejme nyní obecnìji, jak se chovají $n$-té odmocniny z~jednièky, tedy
231 komplexní koøeny rovnice $x^n=1$:
232
233 \itemize\ibull
234 \:Jeliko¾ $\vert x^n \vert = \vert x \vert ^n$, musí být $\vert x \vert = 1$.
235   Proto $x=\e^{\ii\varphi}$ pro nìjaké~$\varphi$.
236 \:Má platit $1 = x^n = \e^{\ii\varphi n} = \cos{\varphi n} + \im\sin\varphi n$.
237   To nastane, kdykoliv $\varphi n = 2k\pi$ pro nìjaké $k\in{\bb Z}$.
238 \endlist
239
240 \>Dostáváme tedy $n$ rùzných $n$-tých odmocnin z~1, toti¾
241 $\e^{2k\pi/n}$ pro $k=0,\ldots,n-1$.
242 Nìkteré z~tìchto odmocnin jsou ov¹em speciální:
243
244 \s{Definice:} Komplexní èíslo~$x$ je {\I primitivní} $n$-tá odmocnina z~1, pokud $x^n=1$
245 a ¾ádné z~èísel $x^1,x^2,\ldots,x^{n-1}$ není rovno~1.
246
247 \s{Pøíklad:} Ze~ètyø zmínìných ètvrtých odmocnin z~1 jsou $\im$ a $-\im$ primitivní
248 a druhé dvì nikoliv (ovìøte sami dosazením). Pro obecné~$n>2$ v¾dy existují alespoò
249 dvì primitivní odmocniny, toti¾ èísla $\omega = \e^{2\pi \ii / k}$ a $\overline\omega = \e^{-2\pi\ii/k}$.
250 Platí toti¾, ¾e $\omega^j = \e^{2\pi\ii j/k}$, a~to je rovno~1 právì tehdy,
251 je-li $j$ násobkem~$k$ (jednotlivé mocniny èísla~$\omega$ postupnì obíhají
252 jednotkovou kru¾nici). Analogicky pro~$\overline\omega$.
253
254 \s{Pozorování:} Pro sudé~$n$ a libovolné èíslo~$\omega$, které je primitivní
255 $n$-tou odmocninou z~jednièky, platí:
256
257 \itemize\ibull
258 \:$\omega^j \neq \omega^k$, kdykoliv $0\le j<k<n$. Staèí se podívat na podíl
259   $\omega^k / \omega^j = \omega^{k-j}$. Ten nemù¾e být roven jedné,
260   proto¾e $0 < k-j < n$ a $\omega$ je primitivní.
261 \:Pro sudé~$n$ je $\omega^{n/2} = -1$. Platí toti¾ $(\omega^{n/2})^2 = \omega^n = 1$,
262   tak¾e $\omega^{n/2}$ je druhá odmocnina z~1. Takové odmocniny jsou jenom dvì:
263   1 a $-1$, ov¹em 1 to být nemù¾e, proto¾e $\omega$ je primitivní.
264 \endlist
265
266 \h{Vyhodnocení polynomù podruhé -- algoritmus FFT}
267
268 Uká¾eme, ¾e primitivních odmocnin lze vyu¾ít k~záchranì na¹eho párovacího
269 algoritmu na vyhodnocování polynomù.
270
271 Nejprve polynomy doplníme nulami tak, aby jejich velikost~$n$ byla mocninou dvojky.
272 Poté zvolíme nìjakou primitivní $n$-tou odmocninu z~jednièky~$\omega$ a budeme
273 polynom vyhodnocovat v~bodech $\omega^0,\omega^1,\ldots,\omega^{n-1}$. To jsou
274 navzájem rùzná komplexní èísla, která jsou správnì spárovaná -- hodnoty $\omega^{n/2},
275 \ldots,\omega^{n-1}$ se od $\omega^0,\ldots,\omega^{n/2-1}$ li¹í pouze znaménkem.
276 To snadno ovìøíme: pro $0\le j<n/2$ je $\omega^{n/2+j} = \omega^{n/2} \omega^j = -\omega^j$.
277 Navíc $\omega^2$ je primitivní $(n/2)$-tá odmocnina z~jednièky, tak¾e se rekurzivnì opìt
278 voláme na problém tého¾ druhu, a~ten je opìt správnì spárovaný.
279
280 Ná¹ plán pou¾ít metodu Rozdìl a panuj tedy vy¹el, opravdu máme algoritmus o~slo¾itosti
281 $\Theta(n\log n)$ pro vyhodnocení polynomu. Je¹tì ho upravíme tak, aby místo s~polynomy pracoval
282 s~vektory jejich koeficientù èi hodnot. Tomuto algoritmu se øíká FFT, vzápìtí
283 prozradíme, proè.
284
285 \s{Algoritmus FFT:}
286 \algo
287 \algin Èíslo~$n=2^k$, primitivní $n$-tá odmocnina z~jednièky~$\omega$
288   a vektor $(p_0,\ldots,p_{n-1})$ koeficientù polynomu~$P$.
289 \:Pokud $n=1$, polo¾íme $y_0\leftarrow p_0$ a skonèíme.
290 \:Jinak se rekurzivnì zavoláme na sudou a lichou èást koeficientù:
291 \::$(s_0,\ldots,s_{n/2-1}) \leftarrow {\rm FFT}(n/2,\omega^2,(p_0,p_2,p_4,\ldots,p_{n-2}))$.
292 \::$(\ell_0,\ldots,\ell_{n/2-1}) \leftarrow {\rm FFT}(n/2,\omega^2,(p_1,p_3,p_5,\ldots,p_{n-1}))$.
293 \:Z~grafù obou èástí poskládáme graf celého polynomu:
294 \::Pro $j=0,\ldots,n/2-1$:
295 \:::$y_j \leftarrow s_j + \omega^j\cdot \ell_j$.
296 \:::$y_{j+n/2} \leftarrow s_j - \omega^j\cdot \ell_j$.
297 \algout Graf polynomu~$P$, tedy vektor $(y_0,\ldots,y_{n-1})$, kde $y_j = P(\omega^j)$.
298 \endalgo
299
300 \h{Diskrétní Fourierova transformace}
301
302 Vyhodnotit polynom v~mocninách èísla~$\omega$ umíme, ale je¹tì nejsme v~cíli.
303 Potøebujeme umìt provést dostateènì rychle i opaèný pøevod -- z~hodnot na~koeficienty. K~tomu nám pomù¾e
304 podívat se na vyhodnocování polynomu trochu abstraktnìji jako na nìjaké zobrazení,
305 které jednomu vektoru komplexních èísel pøiøadí jiný vektor. Toto zobrazení
306 matematici v~mnoha rùzných kontextech potkávají u¾ nìkolik staletí a nazývají
307 ho Fourierovou transformací.
308
309 \s{Definice:}
310 {\I Diskrétní Fourierova transformace (DFT)} je zobrazení ${\cal F}: { {\bb C} ^n} \rightarrow { {\bb C} ^n}$,
311 které vektoru ${\bf x}$ pøiøadí vektor ${\bf y}$, jeho¾ slo¾ky jsou dány
312 pøedpisem $$y_j = \sum_{k=0}^{n-1} x_k \cdot \omega^{jk},$$
313 kde $\omega$ je nìjaká pevnì zvolená primitivní $n$-tá odmocnina z~jedné.
314
315 \s{Pozorování:}
316 Pokud oznaèíme ${\bf p}$ vektor koeficientù nìjakého polynomu~$P$, pak jeho
317 Fourierova transformace ${\cal F}({\bf p})$ není nic jiného ne¾ graf tohoto polynomu
318 v~bodech $\omega^0,\ldots,\omega^{n-1}$. To snadno ovìøíme dosazením do definice.
319
320 Ná¹ algoritmus tedy poèítá diskrétní Fourierovu transformaci v~èase $\Theta(n\log n)$.
321 Odtud pramení jeho název FFT -- Fast Fourier Transform.
322
323 \def\OO{{\bf\Omega}}
324
325 Také si v¹imnìme, ¾e DFT je lineární zobrazení. Mù¾eme ho proto zapsat
326 jako násobení nìjakou maticí~$\OO$, kde $\OO_{jk} = \omega^{jk}$.
327 Pro pøevod grafu na~koeficienty tedy potøebujeme najít inverzní zobrazení
328 urèené inverzní maticí $\OO^{-1}$.
329
330 Jeliko¾ $\omega^{-1} = \overline{\omega}$, pojïme zkusit, zda $\overline{\OO}$
331 není hledanou inverzní maticí.
332
333 \s{Lemma:} $\OO \cdot \overline{\OO} = n\cdot{\bf E}$, kde ${\bf E}$ je jednotková matice.
334
335 \proof
336 Dosazením do definice a elementárními úpravami:
337 $$\eqalign{
338 (\OO\cdot \overline{\OO})_{jk}
339 &= \sum_{\ell=0}^{n-1} \OO_{j\ell}\cdot\overline{\OO}_{\ell k}
340 = \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \overline{\omega^{\ell k}}
341 = \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \overline{\omega}^{\ell k}\cr
342 &= \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot (\omega^{-1})^{\ell k}
343 = \sum_{\ell=0}^{n-1} \omega^{j\ell} \cdot \omega^{-\ell k}
344 = \sum_{\ell=0}^{n-1} \omega^{(j-k)\ell}.\cr
345 }$$
346 To je ov¹em geometrická øada. Pokud je $j=k$, jsou v¹echny èleny øady
347 jednièky, tak¾e se seètou na~$n$. Pro $j\ne k$ pou¾ijeme známý vztah
348 pro souèet geometrické øady s~kvocientem $q=\omega^{j-k}$:
349 $$
350 \sum_{\ell=0}^{n-1} q^\ell
351 = {q^n - 1 \over q-1}
352 = {\omega^{(j-k)n} - 1 \over \omega^{j-k} - 1}
353 = 0.
354 $$
355 Poslední rovnost platí díky tomu, ¾e
356 $\omega^{(j-k)n} = (\omega^n)^{j-k} = 1^{j-k} = 1$, tak¾e
357 èitatel zlomku je nulový; naopak jmenovatel urèitì nulový není, jeliko¾
358 $\omega$ je primitivní a $0<\vert j-k\vert <n$.
359 \qed
360
361 \s{Dùsledek:} $\OO^{-1} = (1/n)\cdot\overline{\OO}$.
362
363 Matice~$\OO$ tedy je regulární a její inverze se kromì vydìlení~$n$
364 li¹í pouze komplexním sdru¾ením. Navíc $\overline{\omega} = \omega^{-1}$
365 je také primitivní $n$-tou odmocninou z~jednièky, tak¾e a¾ na faktor $1/n$
366 se jedná opìt o~Fourierovu transformaci, kterou mù¾eme spoèítat stejným
367 algoritmem FFT. Shròme, co jsme zjistili, do následující vìty:
368
369 \s{Vìta:} Je-li $n$ mocnina dvojky, lze v~èase $\Theta(n\log n)$ spoèítat
370 diskrétní Fourierovu transformaci v~${\bb C}^n$ i její inverzi.
371
372 Tím jsme také doplnili poslední èást algoritmu na násobení polynomù:
373
374 \s{Vìta:} Polynomy velikosti~$n$ nad tìlesem ${\bb C}$ lze násobit v~èase
375 $\Theta(n\log n)$.
376
377 V~obou vìtách pøitom èiníme pøedpoklad, ¾e základní operace s~komplexními
378 èísly umíme provést v~konstantním èase. Pokud tomu tak není, staèí slo¾itost
379 vynásobit slo¾itostí jedné operace.
380
381 \s{Dal¹í pou¾ití FFT:}
382 Dodejme je¹tì, ¾e Fourierova transformace se hodí i k~jiným vìcem ne¾
383 k~násobení polynomù. Své uplatnìní nachází i v~dal¹ích algebraických algoritmech,
384 tøeba v~násobení velkých èísel (lze se dostat a¾ ke~slo¾itosti $\Theta(n)$).
385 Mimo to skýtá i lecjaké fyzikální aplikace -- odpovídá toti¾ spektrálnímu
386 rozkladu signálu na siny a cosiny o~rùzných frekvencích. Na tom jsou zalo¾eny
387 napøíklad algoritmy pro filtrování zvuku, také pro kompresi zvuku a obrazu (MP3, JPEG)
388 nebo rozpoznávání øeèi.
389
390 \h{Paralelní implementace FFT}
391
392 Zkusme si je¹tì prùbìh algoritmu FFT znázornit graficky
393 Na~levé stranì následujícího obrázku se nachází vstupní vektor $x_0,\ldots,x_{n-1}$
394 (v~nìjakém poøadí), na~pravé stranì pak výstupní vektor $y_0,\ldots,y_{n-1}$.
395 Sledujme chod algoritmu pozpátku: Výstup spoèítáme z~výsledkù \uv{polovièních}
396 transformací vektorù $x_0,x_2,\ldots,x_{n-2}$ a $x_1,x_3,\ldots,x_{n-1}$.
397 Èerné krou¾ky pøitom odpovídají výpoètu lineární kombinace $a+\omega^kb$,
398 kde $a,b$ jsou vstupy krou¾ku a $k$~nìjaké pøirozené èíslo závislé na poloze
399 krou¾ku. Ka¾dá z~polovièních transformací se poèítá analogicky z~výsledkù
400 transformace velikosti $n/4$ atd. Celkovì výpoèet probíhá v~$\log_2 n$ vrstvách
401 po~$\Theta(n)$ operacích.
402
403 \figure{img.eps}{Pøíklad prùbìhu algoritmu pro~vstup velikosti 8}{3in}
404
405 Na obrázek se také mù¾eme dívat jako na schéma hradlové sítì pro výpoèet DFT.
406 Krou¾ky jsou pøitom \uv{hradla} pracující s~komplexními èísly. V¹echny operace
407 v~jedné vrstvì jsou na sobì nezávislé, tak¾e je sí» poèítá paralelnì. Sí» proto
408 pracuje v~èase $\Theta(\log n)$ a prostoru $\Theta(n)$, opìt pøípadnì násobeno
409 slo¾itostí jedné operace s~komplexními èísly
410
411 \s{Cvièení:} Doka¾te, ¾e permutace vektoru $x_0,\ldots,x_{n-1}$ na levé stranì
412 hradlové sítì odpovídá bitovému zrcadlení, tedy ¾e na pozici~$b$ shora se vyskytuje
413 prvek $x_d$, kde~$d$ je èíslo~$b$ zapsané ve~dvojkové soustavì pozpátku.
414
415 \h{Nerekurzivní FFT}
416
417 Obvod z~pøedchozího obrázku také mù¾eme vyhodnocovat po~hladinách zleva doprava,
418 èím¾ získáme elegantní nerekurzivní algoritmus pro výpoèet FFT v~èase $\Theta(n\log n)$
419 a prostoru $\Theta(n)$:
420
421 \algo
422 \algin $x_0,\ldots,x_{n-1}$
423 \:Pro $k=0,\ldots,n-1$ polo¾íme $y_k\= x_{r(k)}$, kde $r$ je funkce bitového zrcadlení.
424 \:Pøedpoèítáme tabulku hodnot $\omega^0,\omega^1,\ldots,\omega^{n-1}$.
425 \:$b\= 1$ \cmt{velikost bloku}
426 \:Dokud $b<n$, opakujeme:
427 \::Pro $j=0,\ldots,n-1$ s~krokem~$2b$ opakujeme: \cmt{zaèátek bloku}
428 \:::Pro $k=0,\ldots,b-1$ opakujeme: \cmt{pozice v~bloku}
429 \::::$\alpha\=\omega^{nk/2b}$
430 \::::$(y_{j+k},y_{j+k+b}) \= (y_{j+k}+\alpha\cdot y_{j+k+b}, y_{j+k}-\alpha\cdot y_{j+k+b})$.
431 \::$b\= 2b$
432 \algout $y_0,\ldots,y_{n-1}$
433 \endalgo
434
435 \h{FFT v~koneèných tìlesech}
436
437 Nakonec dodejme, ¾e Fourierovu transformaci lze zavést nejen nad tìlesem
438 komplexních èísel, ale i v~nìkterých koneèných tìlesech, pokud zaruèíme
439 existenci primitivní $n$-té odmocniny z~jednièky. Napøíklad v~tìlese ${\bb
440 Z}_p$ pro prvoèíslo $p=2^k+1$ platí $2^k=-1$, tak¾e $2^{2k}=1$
441 a $2^0,2^1,\ldots,2^{2k-1}$ jsou navzájem rùzná. Èíslo~2 je tedy primitivní
442 $2k$-tá odmocnina z~jedné. To se nám ov¹em nehodí pro algoritmus FFT, nebo»
443 $2k$ bude málokdy mocnina dvojky.
444
445 Zachrání nás ov¹em algebraická vìta, která øíká, ¾e multiplikativní grupa\foot{To je
446 mno¾ina v¹ech nenulových prvkù tìlesa s~operací násobení.}
447 libovolného koneèného tìlesa je cyklická, tedy ¾e v¹echny nenulové prvky tìlesa lze
448 zapsat jako mocniny nìjakého èísla~$g$ (generátoru grupy). Napøíklad pro $p=2^{16}+1=65\,537$
449 je jedním takovým generátorem èíslo~$3$. Jeliko¾ mezi èísly $g^1,g^2,\ldots,g^{p-1}$
450 se musí ka¾dý nenulový prvek tìlesa vyskytnout právì jednou, je~$g$ primitivní
451 $2^k$-tou odmocninou z~jednièky, tak¾e mù¾eme poèítat FFT pro libovolný vektor,
452 jeho¾ velikost je mocnina dvojky men¹í nebo rovná $2^k$.
453
454 Bli¾¹í prùzkum
455 na¹ich úvah o~FFT dokonce odhalí, ¾e není ani potøeba tìleso. Postaèí libovolný
456 komutativní okruh, ve~kterém existuje pøíslu¹ná primitivní odmocnina
457 z~jednièky, její multiplikativní inverze (ta ov¹em existuje v¾dy, proto¾e
458 $\omega^{-1} = \omega^{n-1}$) a multiplikativní inverze èísla~$n$. To nám
459 poskytuje je¹tì daleko více volnosti ne¾ tìlesa, ale není snadné takové okruhy
460 hledat.
461
462 Výhodou tìchto podob Fourierovy transformace je, ¾e na rozdíl od~té klasické komplexní
463 nejsou zatí¾eny zaokrouhlovacími chybami (komplexní odmocniny z~jednièky mají obì slo¾ky
464 iracionální). To se hodí napøíklad ve~zmiòovaných algoritmech na násobení velkých èísel.
465
466 \h{Cvièení}
467
468 \itemize\ibull
469 \:O~jakých vlastnostech vektoru vypovídá nultý a $(n/2)$-tý koeficient jeho
470   Fourierova obrazu (výsledku Fourierovy transformace)?
471 \:Spoèítejte Fourierovy obrazy následujících vektorù z~${\bb C}^n$:
472     \itemize\ibull
473     \:$(x,\ldots,x)$
474     \:$(1,-1,1,-1,\ldots,1,-1)$
475     \:$(\omega^0,\omega^1,\omega^2,\ldots,\omega^{n-1})$
476     \:$(\omega^0,\omega^2,\omega^4,\ldots,\omega^{2n-2})$
477     \endlist
478 \:Roz¹íøením výsledkù z~pøedchozího cvièení najdìte pro ka¾dé~$j$ vektor, jeho¾
479   Fourierova transformace má na $j$-tém místì jednièku a v¹ude jinde nuly. Z~toho lze pøímo
480   sestrojit inverzní transformaci.
481 \:Uka¾te, ¾e je-li $\bf x$ reálný vektor z~${\bb R}^n$, je jeho Fourierova transformace ${\bf y}={\cal F}({\bf x})$
482   {\I antisymetrická:} ${\bf y}_j = \overline{{\bf y}_{n-j}}$ pro v¹echna~$j$.
483 \:Podobnì uka¾te, ¾e Fourierova transformace ka¾dého antisymetrického vektoru je reálná.
484 \:Uva¾ujme reálnou funkci~$f$ definovanou na intervalu $[0,2\pi)$. Pokud její
485   hodnoty {\I navzorkujeme} v~$n$ pravidelnì rozmístìných bodech, získáme vektor
486   ${\bf f}\in {\bb R}^n$ o~slo¾kách ${\bf f}_j = f(2\pi j/n)$. Jak vypadá Fourierova
487   transformace tohoto vektoru pro následující funkce?
488     \itemize\ibull
489     \:$\e^{\im kx}$ pro $k\in{\bb N}$
490     \:$\cos kx$
491     \:$\sin kx$
492     \endlist
493   Nápovìda: sinus a cosinus mù¾ete zapsat jako lineární kombinaci dvou komplexních exponenciál.
494 \:Pomocí pøedchozího cvièení doka¾te, ¾e libovolnou reálnou funkci na $[0,2\pi)$
495   existuje lineární kombinace funkcí $\sin kx$ a $\cos kx$, která pøi vzorkování
496   v~$n$ bodech není od zadané funkce rozli¹itelná.
497
498   Pøesnìji øeèeno, pro ka¾dý vektor~${\bf f}\in {\bb R}^n$ existují vektory ${\bf a},{\bf b}\in {\bb R}^n$
499   takové, ¾e platí:
500   $$
501   {\bf f}_j = \sum_{k=0}^{n-1} {\bf a}_k \sin {2jk\pi \over n} + {\bf b}_k \cos {2jk\pi \over n}.
502   $$
503   Koeficienty $a_k$ a $b_k$ lze pøítom snadno získat z~Fourierova obrazu vektoru~${\bf f}$.
504 \endlist
505
506 \bye