]> mj.ucw.cz Git - ads2.git/blob - 5-addsort/5-addsort.tex
Geometrie: Korektury.
[ads2.git] / 5-addsort / 5-addsort.tex
1 \input ../lecnotes.tex
2
3 \prednaska{5}{Paralelní sèítání, bitonické tøídìní}{(zapsal: Petr Jankovský)}
4
5 Minule jsme si zavedli paralelní výpoèetní model, ve kterém si nyní nìco naprogramujeme \dots
6
7 \h{Sèítání binárních èísel}
8
9 Mìjme dvì èísla $x$ a $y$ zapsané ve~dvojkové soustavì. Jejich èíslice oznaème
10 $x_{n-1}\ldots x_0$ a $y_{n-1}\ldots y_0$, kde $i$-tý øád má váhu $2^i$. Nyní budeme chtít tato èísla
11 seèíst.
12
13 K tomuto úèelu se~ihned nabízí pou¾ít starý dobrý \uv{¹kolní algoritmus}, který
14 funguje ve~dvojkové soustavì stejnì dobøe jako v~desítkové. Zkrátka sèítáme èísla
15 z~prava doleva. V¾dy seèteme pøíslu¹né èíslice pod~sebou a~pøièteme pøenos z~ni¾¹ího
16 øádu. Tím dostaneme jednu èíslici výsledku a~pøenos do~vy¹¹ího øádu. Formálnì
17 bychom to mohli zapsat tøeba takto:
18 $$
19 z_i=x_i \oplus y_i \oplus c_i,
20 $$
21 kde $z_i$ je $i$-tá èíslice souètu, $\oplus$ znaèí operaci {\sc xor} (souèet modulo~2) a~$c_i$ je {\I pøenos}
22 z~$(i-1)$-ního øádu do~$i$-tého. Pøenos pøitom nastane tehdy, pokud se~nám potkají
23 dvì jednièky pod~sebou, nebo kdy¾ se~vyskytne alespoò jedna jednièka a~k~tomu
24 pøenos z~ni¾¹ího øádu. Jinými slovy tehdy, kdy¾ ze~tøí xorovaných èíslic jsou alespoò
25 dvì jednièky (pomocí obvodu pro majoritu z minulé pøedná¹ky lehce zkonstruujeme):
26 $$
27 \eqalign{
28 c_{0} &= 0, \cr
29 c_{i+1} &= (x_i~\&~y_i)\lor(x_i~\&~c_i)\lor(y_i~\&~c_i).\cr
30 }
31 $$
32
33 Takovéto sèítání sice perfektnì funguje, nicménì je bohu¾el pomìrnì pomalé.
34 Pokud bychom stavìli hradlovou sí» podle tohoto pøedpisu, byla by slo¾ená z~nìjakých
35 podsítí (\uv{krabièek}), které budou mít na~vstupu $x_i$, $y_i$ a~$c_i$ a jejich výstupem
36 bude $z_i$ a~$c_{i+1}$. 
37
38 \figure{hloupe_scitani.eps}{Sèítání ¹kolním algoritmem.}{1.5in}
39
40 V¹imìme si, ¾e~ka¾dá krabièka závisí na~výstupu té pøedcházející. Jednotlivé
41 krabièky tedy musí urèitì le¾et na~rùzných hladinách. Celkovì bychom museli pou¾ít
42 $\Theta{(n)}$ hladin a~jeliko¾ je ka¾dá krabièka konsantnì velká, také $\Theta{(n)}$ hradel. To dává
43 lineární èasovou i~prostorovou slo¾itost, èili oproti sekvenènímu algoritmu jsme si nepomohli.
44
45 Zamysleme se nad tím, jak by se proces sèítání mohl zrychlit.
46
47 \h{Pøenosy v~blocích}
48 Jediné, co nás pøi sèítání brzdí, jsou pøenosy mezi jednotlivými øády. Ka¾dý øád,
49 aby~vydal souèet, musí poèkat na~to, a¾~dopoèítají v¹echny pøedcházející øády.
50 Teprve pak se~toti¾ dozví pøenos. Kdybychom ov¹em pøenosy dokázali spoèítat
51 nìjakým zpùsobem paralelnì, máme vyhráno. Jakmile známe v¹echny pøenosy, souèet
52 u¾~zvládneme dopoèítat na~konstantnì mnoho hladin -- tedy v~konstantním èase.
53
54 Podívejme se na~libovolný {\I blok} v~na¹em souètu. Tak budeme øíkat èíslùm
55 $x_j\ldots x_i$ a $y_j\ldots y_i$ v~nìjakém intervalu indexù $\left<i,j\right>$. Pøenos $c_{j+1}$ vystupující z~tohoto bloku závisí mimo hodnot sèítancù u¾ pouze na~pøenosu $c_{i}$, který do bloku vstupuje.
56
57 \figure{blok_scitani.eps}{Blok souètu.}{3in}
58
59 Z tohoto pohledu se mù¾eme na blok také dívat jako na nìjakou funkci, která
60 dostane jednobitový vstup a vydá jednobitový výstup. To je nám pøíjemné, nebo» 
61 takových funkcí existují jenom ètyøi typy:
62 \numlist\ndotted
63 \:$f(x) = 0$,  ~~~~(0)
64 \:$f(x) = 1$,  ~~~~(1)
65 \:$f(x) = x$,  ~~~~($<$ -- kopírování)
66 \:$f(x) = \neg{x}$.
67 \endlist
68 Jak se za~chvíli uká¾e, poslední pøípad, kdy by~nìjaký blok pøedával opaèný
69 pøenos, ne¾ do~nìj vstupuje, navíc nikdy nemù¾e nastat. Pojïme si to rozmyslet.
70 Jednobitové bloky se chovají velice jednodu¹e:
71
72 \figure{bloky_1bit.eps}{Tabulka triviálních blokù.}{1.1in}
73
74 Z prvního bloku evidentnì v¾dy vyleze 0, a»~do~nìj vstoupí jakýkoli pøenos.
75 Poslední blok naopak sám o~sobì pøenos vytváøí, a»~ji¾ do~nìj vleze jakýkoliv.
76 Bloky prostøední se chovají stejnì, a~to tak, ¾e~samy o~sobì ¾ádný pøenos nevytvoøí,
77 ale~pokud do~nich nìjaký pøijde, tak~také odejde.
78
79 Mìjme nyní nìjaký vìt¹í blok~$C$ slo¾ený ze~dvou men¹ích podblokù $A$ a~$B$, jejich¾
80 chování u¾ známe. Z~toho mù¾eme odvodit, jak se chová celý blok:
81
82 \figure{tabulka_skladani_bloku.eps}{Skládání chování blokù.}{1.3in}
83
84 Pokud vy¹¹í blok pøenos pohlcuje, pak a»~se u¾~ni¾¹í blok chová jakkoli, slo¾ení
85 tìchto blokù musí v¾dy pohlcovat. V~prvním øádku tabulky jsou tudí¾ nuly. Analogicky,
86 pokud vy¹¹í blok generuje pøenos, tak~ten ni¾¹í na~tom nic nezmìní. V~druhém
87 øádku tabulky jsou tedy samé jednièky. Zajímavìj¹í pøípad nastává, pokud vy¹¹í blok
88 kopíruje -- tehdy zále¾í èistì na~chování ni¾¹ího bloku.
89
90 V¹imnìme si, ¾e~skládání chování blokù je vlastnì úplnì obyèejné skládání
91 funkcí. Nyní bychom mohli prohlásit, ¾e~budeme poèítat nad~tøíprvkovou abecedou,
92 a~¾e~celou tabulku doká¾eme spoèítat jedním jediným hradlem. Pojïmì si v¹ak
93 rozmyslet, jak~bychom takovouto vìc popsali èistì binárnì. Jak tedy tyto tøi stavy
94 popisovat pouze nìkolika bity?
95
96 Evidentnì nám k tomuto binárnímu zakódování tøí stavù budou staèit bity dva.
97 Oznaème si je jako $p$ a $q$. Tato dvojice mù¾e nábývat hned ètyø mo¾ných hodnot,
98 kterým pøiøadíme tøi mo¾ná chování bloku. Toto kódování mù¾eme zvolit zcela
99 libovolnì, ale pokud si ho zvolíme ¹ikovnì, u¹etøime si dále práci pøi kompozici.
100 Zvolme si tedy kódování takto:
101
102 \itemize\ibull
103 \:$(1,*) = <$,
104 \:$(0,0) = 0$,
105 \:$(0,1) = 1$
106 \endlist
107
108 Tomu, ¾e blok kopíruje, odpovídá dvojice $p = 1$; $q =$ \<cokoliv>. V~ostatních
109 pøípadech bude~$p$ nulové a~$q$ nám bude øíkat, co je na~výstupu pøíslu¹ného bloku.
110 Jinými slovy $p = 0$ znamená, ¾e funkce je konstanta, pøièem¾ $q$ øíká jaká; naproti
111 tomu $p = 1$~znamená, ¾e funkce je identita, a»~u¾~je $q$ cokoli.
112
113 Pojïme si nyní ukázat, jak bude celé skládání blokù vypadat. Rozmysleme si,
114 kdy je~$p$ celého dvojbloku jednièkové, tedy kdy celý dvojblok kopíruje. To nastane
115 tehdy, pokud kopírují obì jeho èásti, a tedy  $p = p_a~\&~p_b$. Dále $q$ bude rovno jednièce,
116 pokud $q = (\neg{p_a}~\&~q_a) \lor (p_a~\&~q_b)$.
117
118 Skládání chování blokù lze tedy popsat buï ternárnì -- tabulkou, ale lze to
119 i~binárnì vý¹e uvedeným pøedpisem.
120
121 Nyní si tedy mù¾eme dopøedu vypoèítat chování bloku velikosti jedna, poté
122  z~nich skládáním blokù velikosti dva, dál velikosti ètyøi, osm, atd \dots
123
124 \h{Paralelní sèítání}
125
126 Paralelní algoritmus na~sèítání u¾~zkonstruujeme pomìrnì snadno. Bez újmy
127 na~obecnosti budeme pøedpokládat, ¾e~poèet bitù vstupních èísel je mocnina dvojky,
128 jinak si vstup doplníme nulami, co¾ výsedný èas bìhu algoritmu zhor¹í maximálnì
129 konstanta-krát.
130
131 \algo
132 \:Spoèteme chování blokù velikosti~1. ($\O(1)$ hladin)
133 \:Postupnì poèítáme chování blokù\foot{myslíme \uv{pøirozenì zarovnané} bloky, tedy takové, jejich¾ poloha je násobkem velikosti} velikosti 2, 4, 8, ..., $2^k$. 
134   ($\O(\log n)$ hladin, na~nich¾ se skládají bloky)
135 \:$c_0 \leftarrow 0$ (pøenos do nejni¾¹ího øádu je v¾dy 0)
136 \:Urèíme $c_n$ podle $c_0$ a chování (jediného) bloku velikosti~$n$.
137 \:Postupnì dopoèítáme pøenosy na~hranicích dìlitelných $2^k$ \uv{zahu¹»ováním}:
138   jakmile víme $c_{2^k}$, mù¾eme dopoèítat $c_{2^k+2^{k-1}}$ podle
139   chování bloku $\left< 2^k, 2^k+2^{k-1}\right>$. ($\O(\log n)$ hladin,
140   na~nich¾ se dosazuje)
141 \:Seèteme: $\forall i: z_i = x_i \oplus y_i \oplus c_i$.
142 \endalgo
143
144 \figure{1_9_deleni_bloku.eps}{Výpoèet pøenosu.}{2.5in}
145
146 Algoritmus pracuje v~èase $\O(\log n)$. Hradel je pou¾ito lineárnì: na~jednotlivých
147 hladinách kroku~2 poèet hradel exponenciálnì klesá od~$n$ k~1, na~hladinách kroku~5
148 exponenciálnì stoupá od~1 k~$n$, tak¾e dohromady se seète na~$\Theta(n)$.
149
150 \h{Tøídìní}
151
152 Nyní se podíváme na~druhý problém, a~to na~problém tøídìní. Ji¾ známe pomìrnì efektivní sekvenèní algoritmy, které dovedou tøídit v~èase $\O(n\log n)$. Byli bychom jistì rádi, kdybychom to zvládli je¹tì rychleji. Pojïme se podívat, zda by nám v tom nepomohlo problém paralelizovat.
153
154 Budeme pøi tom pracovat ve~výpoèetním modelu, kterému se øíká komparátorová sí». Ta je postavená z~hradel, kterým se øíká komparátory.
155
156 \s{Definice:} {\I Komparátorová sí»} je kombinaèní obvod, jeho¾ hradla jsou
157 komparátory.
158
159 \figure{sortnet.0}{Komparátor}{0.7in}
160
161 Komparátor umí porovnat dvì hodnoty a~rozhodnout, která z~nich je vìt¹í
162 a~která men¹í. Nevrací v¹ak booleovský výsledek jako bì¾né hradlo, ale má dva
163 výstupy, pøièem¾ na~jednom vrátí men¹í ze~vstupních hodnot a~na~druhém vìt¹í.
164
165 Výstupy komparátorù se nevìtví. Nemù¾eme tedy jeden výstup \uv{rozdvojit} a~pøipojit ho na~dva vstupy. (Vìtvení by dokonce ani nemìlo smysl, proto¾e zatímco rozdvojit bychom mohli, slouèit u¾~ne. Pokud tedy chceme aby sí» mìla $n$~vstupù i~$n$~výstupù, rozdvojení stejnì nesmíme provést, i kdybychom jej mìli povolené.)
166
167 \s{Pøíklad:} {\sl Bubble sort}
168
169 Obrázek Bubble 1 ilustruje pou¾ití komparátorù pro tøídìní Bubble sortem.
170 ©ipky pøedstavují jednotlivé komparátory. Výpoèet v¹ak je¹tì mù¾eme vylep¹it.
171
172 \twofigures{sortnet.1}{Bubble 1}{143pt}{sortnet.2}{Bubble 2}{143pt}
173
174 Sna¾íme se výpoèet co nejvíce paralelizovat (viz obrázek Bubble 2).
175 Jak je vidìt, komparátory na sebe nemusejí èekat. Tím mù¾eme výpoèet urychlit a místo èasu $\Theta{(n^2)}$ docílit èasové slo¾itosti $\Theta{(n)}$. V obou pøípadech je zachován kvadratický prostor.
176
177 Nyní si uká¾eme je¹tì rychlej¹í tøídící algoritmus. Pùjdeme na nìj v¹ak trochu \uv{od lesa}. Nejdøíve vymyslíme sí», která bude umìt tøídit jenom nìco - toti¾ bitonické posloupnosti.
178
179 \medskip
180 \s{Definice:} Øekneme, ¾e posloupnost $x_0,\dots,x_{n-1} $ je {\I èistì bitonická} právì tehdy, kdy¾
181 pro nìjaké $x_k\in\{0, \dots, n-1\} $ platí, ¾e~v¹echny prvky pøed ním (vèetnì jeho samotného)
182 tvoøí rostoucí poslopnost, kde¾to prvky stojící za~ním tvoøí poslopnost klesající.
183 Formálnì zapsáno musí platit, ¾e:
184 $$x_0\leq x_1\leq \dots \leq x_k \geq x_{k+1}\geq\dots \geq x_{n-1}.$$
185
186 \s{Definice:} Posloupnost $x_0 \dots x_{n-1}$je {\I bitonická}, právì kdy¾ $\exists~j\in \{0,\dots ,n-1\}$, pro
187 které je rotace pùvodní posloupnosti o $j$ prvkù (posloupnost
188 $x_j,x_{(j+1) \bmod n},\dots, x_{(j+n-1) \bmod n}$) èistì bitonická.
189
190 \s{Definice:} {\I Separátor $S_n$} je sí», ve které jsou v¾dy~$i$-tý a~$(i+{n/2})$-tý prvek vstupu
191 (pro $i=0,\dots, {n/2}-1$) propojeny komparátorem. Minimum se pak stane~$i$-tým,
192 maximum  $(i+{n/2})$-ním prvkem výstupu.
193 \figure{sortnet.3}{$(y_i, y_{i+{n/2}}) = \<CMP>(x_i, x_{i+{n/2}})$} {300pt}
194
195 \s{Lemma:} Pokud je vstup separátoru bitonická posloupnost, pak jeho výstup $y_0, \dots, y_{n-1}$
196 splòuje:
197
198 (i) $y_0,\dots, y_{n/2 -1}$ a~$y_{n/2},\dots, y_{n-1}$ jsou 
199 bitonické posloupnosti,
200
201 (ii) Pro v¹echna $i,j< {n/2}$ platí $y_i < y_{j + {n/2}}$.
202
203 Separátor nám tedy jednu bitonickou posloupnost na~vstupu rozdìlí na~dvì
204 bitonické posloupnosti, pøièem¾ navíc ka¾dý prvek první posloupnosti ($y_0,\dots, y_{n/2 -1}$)
205 je men¹í nebo roven prvkùm druhé posloupnosti ($y_{n/2}, \dots, y_{n-1}$).
206
207 \>Ne¾ pøistoupíme k dùkazu lemmatu, uka¾me si, k èemu se nám bude hodit.
208
209
210 \s{Definice:} {\I Bitonická tøídièka $B_n$} je obvod sestavený ze separátorù, který dostane-li na vstupu bitonickou posloupnost délky $n$ (BÚNO konstruujeme tøídièku pro $n=2^k$), vydá setøídìnou zadanou posloupnost délky $n$. 
211
212 Tøídièka dostane na~vstupu bitonickou posloupnost. Separátor~$S_n$ ji pak dle lemmatu rozdìlí na~dvì bitonické posloupnosti, kdy je ka¾dý prvek z~první posloupnosti men¹í ne¾ libovolný prvek z~druhé. Tyto poloviny pak dal¹í separátory rozdìlí na~ètvrtiny, ..., a¾~na~konci zbudou pouze jednoduché posloupnosti délky jedna (zjevnì setøídìné), které mezi sebou mají po¾adovanou nerovnost -- tedy ka¾dá posloupnost (nebo spí¹e prvek) nalevo je $\leq$ ne¾ prvek napravo od~nìj.
213
214 \centerline{\epsfbox{sortnet.5}}
215
216 Jak je vidìt, bitonická tøídièka nám libovolnou bitonickou posloupnost délky~$n$
217 setøídí na~$\Theta(\log n)$ hladin.
218
219 Nyní se dá odvodit, ¾e pokud umíme tøídit bitonické posloupnosti, umíme setøídit v¹echno.
220 Vzpomeòme si na~tøídìní sléváním -- Merge sort. To funguje tak, ¾e zaène s~jednoprvkovými posloupnostmi, které jsou evidentnì setøídìné, a~poté v¾dy dvì setøídìné posloupnosti slývá do~jedné. Kdybychom nyní umìli paralelnì slévat, mohli bychom vytvoøit i~paralelní Merge sort. Jinými slovy, potøebujeme dvì rostoucí posloupnosti nìjak efektivnì slít do~jedné setøídìné. Uvìdomme si, ¾e to zvládneme jednodu¹e -- staèí druhou z~posloupností obrátit a~\uv{pøilepit} za~první, èím¾ vznikne bitonická posloupnost, kterou poté mù¾eme setøídit na¹í bitonickou tøídièkou.
221
222 \s{Pøíklad:} {\sl Merge sort}
223
224 Bitonická tøídièka se tedy dá pou¾ít ke~slévání setøídìných posloupností. 
225 Uka¾me si, jak s~její pomocí sestavíme souèástky {\I slévaèky} $M_n$:
226
227 Setøídìné posloupnosti $x_0,\dots, x_{n-1}$ a~$y_0,\dots, y_{n-1}$ spojíme do jedné bitonické
228 posloupnosti $x_0,\dots, x_{n-1},y_{n-1},\dots, y_0$. Z~této posloupnosti vytvoøíme pomocí bitonické tøídièky
229 $B_{2n}$ setøídìnou posloupnost. Vytvoøíme tedy blok $M_{2n}$, který se ov¹em sestává de~facto pouze z~bloku $B_{2n}$, jeho¾ druhá polovina vstupù je zapojena v~obráceném poøadí.
230 \figure{sortnet.6}{Paralelní MergeSort.}{3in}
231
232 Nyní se pokusme odhadnout èasovou slo¾itost. Ná¹ MergeSort bude mít øádovì hloubku blokù $\log n$.
233 V ka¾dém bloku $M_n$ je navíc ukryta bitonická tøídièka s takté¾ logaritmickou hloubkou.
234 Celková hloubka tedy bude $\log 2 + \log4 + \dots + \log 2^k + \dots + \log n$.
235 Po seètení nakonec dostáváme výslednou èasovou slo¾itost $\Theta (\log^2 n)$.
236
237 Dodejme je¹tì, ¾e existuje i~tøídicí algoritmus, kterému staèí jen ${\O}(\log n)$ hladin.
238 Jeho multiplikativní konstanta je v¹ak pøíli¹ veliká, tak¾e je v~praxi nepou¾itelný.
239
240 Vra»me se nyní k dùkazu lemmatu, který jsme na pøedminulé stránce vynechali.
241
242 \h{Dùkaz Lemmatu:}
243 (i) Nejprve nahlédneme, ¾e lemma platí, je-li vstupem èistì bitonická
244 posloupnost. Dále BÚNO pøedpokládejme, ¾e vrchol posloupnosti je v~první polovinì (kdyby
245 byl vrchol za~polovinou, staèilo by zrcadlovì obrátit posloupnost i~komparátory a~øe¹ili
246 bychom stejný problém). Nyní si definujme $k := \min j: x_j > x_{j+n/2}$. (Pokud
247 by~takové~$k$ neexistovalo, znamenalo by~to, ¾e vstupní posloupnost je monotónní.
248 Separátor by tedy nic nedìlal a~pouze zkopíroval vstup na~výstup, co¾ jistì lemma splòuje.) Nyní si v¹imìme,
249 ¾e jakmile jednou zaène platit, ¾e prvek na~levé stranì je men¹í ne¾ na~pravé, bude
250 nám tato relace platit a¾~do~konce. Oznaème vrchol vstupní posloupnosti jako~$x_m$.
251 Pak~$k$ bude jistì men¹í ne¾~$m$ a~$k+{n/2}$ bude vìt¹í ne¾~$m$. Mezi~$k$ a~$m$ je tedy
252 vstupní posloupnost neklesající, mezi $k+{n/2}$ a~$n-1$ nerostoucí.
253
254 Do pozice~$k$ tedy separátor bude pouze kopírovat vstup na~výstup, od~pozice~$k$
255 dál u¾~jen prohazuje. Pro ka¾dé~$i$, $(k\leq i\leq {n/2}-1)$ se prvky
256 $x_i$ a~$x_{i+{n/2}}$ prohodí. Úsek mezi~$k$ a~${n/2}-1$ tedy
257 nahradíme nerostoucí posloupností, první polovina výstupu tedy bude
258 (dokonce èistì) bitonická. Podobnì úsek $k+{n/2}$ a¾~$n-1$ nahradíme èistì
259 bitonickou posloupností. Obì poloviny tedy budou bitonické.
260
261 Dostaneme-li na vstupu obecnou bitonickou posloupnost, pøedstavíme si,
262 ¾e je to èistì bitonická posloupnost zrotovaná o~$r$ prvkù (BÚNO
263 doprava). Zjistíme, ¾e v~komparátorech se porovnávají tyté¾ prvky,
264 jako kdyby zrotovaná nebyla. Výstup se od výstupu èistì bitonické
265 posloupnosti zrotovaného o~$r$ bude li¹it prohozením úsekù $x_0$ a¾
266 $x_{r-1}$ a~$x_{n/2}$ a¾ $x_{{n/2}+r-1}$. Obì výstupní
267 posloupnosti tedy budou zrotované o~$r$ prvkù, ale na jejich
268 bitoniènosti se nic nezmìní.
269
270 (ii) Z dùkazu (i) pro èistì bitonickou posloupnost víme, ¾e $y_0\dots y_{n/2-1}$ je èistì bitonická a bude rovna $x_0\dots x_{k-1},x_{k+n/2}\dots x_{n-1}$ pro vhodné $k$ a navíc bude mít maximum v $x_{k-1}$ nebo $x_k+{n/2}$. Mezi tìmito body ov¹em ve vstupní posloupnosti urèitì nele¾el ¾ádný $x_i$ men¹í ne¾ $x_k-1$ nebo $x_k+{n/2}$ (jak je vidìt z obrázku) a posloupnost  $x_k \dots x_{k-1+{n/2}}$ je rovna $y_{n/2}\dots y_{n-1}$. Pro obecné bitonické posloupnosti uká¾eme stejnì jako v (i).
271 \qed
272
273 \medskip
274
275 \centerline{\epsfbox{sortnet.7}}
276
277
278 \h{Paralelní násobení}
279
280 Podobnì jako u~sèítání si vzpomeneme na~¹kolní algoritmus -- tentokráte v¹ak pro násobení.
281 To fungovalo tak, ¾e~jsme si jedno ze~dvou binárních èísel na~vstupu (øíkejme mu tøeba $x$) $n$-krát posouvali. Tam kde pak byly v~èísle~$y$ jednièky, pøíslu¹né kopie $x$ jsme seèetli. Jinými slovy tedy násobení umíme pøevést na~nìjaké posuny (ty lze realizovat pouze \uv{pøedrátováním} -- nic nás nestojí), násobení jedním bitem (co¾ je 
282 {\sc and} ) a~nakonec potøebujeme výsledných~$n$ èísel seèíst.
283 \figure{skolni_scitani.eps}{©kolní sèítání.}{2in}
284
285 Jak nyní seèíst $n$ $n$-bitových èísel..? Nabízí se vyu¾ít osvìdèený \uv{stromeèek} -- sèítat dvojice èísel, výsledky pak opìt po~dvojicích seèíst, a¾ na~konci vyjde jediný výsledek.
286 \figure{stromecek.eps}{Stromeèek}{1.4in}
287
288 Toto øe¹ení by v¹ak vedlo na~èasovou slo¾itost $\Theta (\log^2 n)$. To je sice dle na¹ich mìøítek
289 docela efektivní, ale pøekvapivì to jde je¹tì lépe -- toti¾ na~$\Theta (\log n)$ hladin. Této 
290 slo¾itosti dosáhneme malým trikem.
291
292 Vymyslíme obvod konstantní hloubky, který na~vstupu dostane tøi èísla. Odpoví pak dvìma èísly
293 takovými, ¾e budou mít stejný souèet jako pùvodní tøi èísla. Jinými slovy pomocí
294 tohoto obvodu budeme umìt seètení tøí èísel pøevést na seètení dvou èísel.
295
296 \figure{obvod.eps}{$x+y+z = p+q$}{0.3in}
297
298 V¹imnìme si, ¾e~kdy¾ sèítáme tøi bity, mù¾e být pøenos do~vy¹¹ího øádu nula èi~jednièka. Vezmeme si tedy bity $x_i$, $y_i$, $z_i$ a~ty seèteme. To nám dá dvoubitový výsledek, pøièem¾ ni¾¹í bit z~tohoto výsledku po¹leme do~èísla~$p$, vy¹¹í do~èísla~$q$.
299
300 \figure{obvod_real.eps}{Redukování sèítání}{1.2in}
301
302 Toto zredukování sèítání nám nyní umo¾ní opìt stavit strom, by» o malièko slo¾itìj¹í.
303
304 \figure{sl_stromecek.eps}{Slo¾itìj¹í stromeèek}{0.9in}
305
306 Pokud jsme mìli na~zaèátku $n$ èísel, po~první redukci nám jich zbývá jen $2/3 \cdot n$ a~obecnì v~$k$-té hladiné $(2/3)^k \cdot n$. Znamená to, ¾e èísel nám ubývá exponenciálnì, tak¾e poèet hladin bude logaritmický. Redukující obvod je pøi tom jen konstantnì hluboký, tak¾e celé redukování zvládneme v~èase $\Theta (\log n)$. Na~konci Slo¾itìj¹ího stromeèku pak máme umístìnou jednu obyèejnou sèítaèku, která zbývající dvì èísla seète v~logaritmickém èase.
307
308 Celé sèítání $n$ $n$-bitových èísel nám tedy zabere $\Theta (\log n)$ hladin.
309
310 Kdy¾ se nyní vrátíme k~násobení, zbývá nám vyøe¹it posouvání a~{\sc and}ování. Uvìdomme si, ¾e to je plnì paralelení a~zvládneme ho za~konstantnì mnoho hladin. Celé násobení tedy zvládneme v~logaritmickém èase.
311
312 \bye