6 \prednaska{1}{Eukleidùv algoritmus}{(zapsaly T.~Klimo¹ová a K.~B\"ohmová)}
9 \>{\bf Problém hledání nejvìt¹ího spoleèného dìlitele }
11 Cílem je najít nejvìt¹ího spoleèného dìlitele zadaných èísel
12 $a_0, b_0 \in \N $, dále jen $\gcd(a_0, b_0)$, tedy Greatest Common
15 \s{Algoritmus:} (Eukleidùv algoritmus verze $1.0$; snad 200 let pøed Eukleidem)
19 \::if $a > b \Rightarrow a \leftarrow a-b $
20 \::\rlap{else}\phantom{if }$\phantom{a > b} \Rightarrow b \leftarrow b-a $
24 \noindent{\sl Dùkaz správnosti: }
26 \>{\bo 1) EA se zastaví}
28 V ka¾dém prùchodu cyklem se buï $a$ zmen¹í o hodnotu $b$ anebo se $b$ zmen¹í o~hodnotu $a$. Proto souèet $a+b$ klesne poka¾dé alespoò o $1$. Tedy celkem
29 se uskuteèní nanejvý¹ $a+b$ prùchodù cyklem a pak algoritmus skonèí.
31 \>{\bo 2) EA vydá $\gcd(a_0, b_0)$}
33 Pøi dùkazech správnosti algoritmu se èasto pou¾ívá {\I invariant.}
34 To je nìco, co se v prùbìhu algoritmu nemìní (obvykle hodnota nìjakého výrazu nebo jeho vlastnost, napø. dìlitelnost dvìma).
36 Doká¾eme, ¾e platí invariant: $\gcd(a, b) = \gcd(a_0, b_0)$.
38 Algoritmus pøi svém bìhu postupnì mìní hodnoty $a$ a $b$.
40 $(a_0, b_0) \rightarrow (a_1, b_1) \rightarrow
41 \dots \rightarrow (a_k, b_k)$.
42 A jakmile je splnìna rovnost $a_k = b_k$, tak skonèí.
43 My chceme ukázat, ¾e platí
44 $\gcd(a_0, b_0) = \gcd(a_1, b_1) = \dots = \gcd(a_k, b_k)$.
47 K tomu bude tøeba nìkolik pozorování:
49 \>{\I Pozorování 1:} $\gcd(a, a) = a$ (pro $a>0$).
51 Nahlédneme snadno. Nejvìt¹í spoleèný dìlitel jediného èísla je ono samo.
53 \>{\I Pozorování 2:} $\gcd(a, b) = \gcd(b, a)$.
55 Takté¾ jednoduché. Pøi urèování nejvìt¹ího spoleèného dìlitele
56 nám na poøadí èísel nezále¾í.
58 \>{\I Pozorování 3:} $\gcd(a, b) = \gcd(a \pm b, b)$.
60 %%Rozmyslíme si, ¾e a¾ doká¾eme {\I Pozorování 3 }, máme vyhráno.
62 Doká¾eme silnìj¹í vìc -- platnost ekvivalence
63 $k\vert a, k\vert b \Leftrightarrow k\vert a, k\vert(a\pm b)$.
65 \>$\Rightarrow$: Jeliko¾ $k\vert a, k\vert b$, dá se $a$ vyjádøit jako $k$-násobek nìjakého $a'$. Tedy $a = k\cdot a'$.
66 Obdobnì $b = k\cdot b'$, pro nìjaká èísla $a',b'\in \N$.
67 Tak¾e souèet $a\pm b$ si mù¾eme rozepsat jako $(a'\pm b')\cdot k$ z èeho¾ je
68 ji¾ vidìt, ¾e $k\vert(a\pm b)$.
70 \>$\Leftarrow$: Podobnì $k\vert (a\pm b), k\vert b \Leftrightarrow k\vert a$.
72 Uvìdomíme si, ¾e tato tøi pozorování nám staèí k tomu, aby invariant
73 platil. Algoritmus tedy opravdu vydá $\gcd(a_0,b_0)$.
78 \>{3) \bo Rychlost algoritmu}
80 Pøibli¾nì $a+b$. To je velmi pomalé, a proto vyvstává otázka, dá-li se
83 \s{Algoritmus:} (Eukleidùv alg. v$2.0$; neznámý Eukleidùv pokraèovatel, neznámo kdy)
85 \>Vylep¹ení: místo odèítání budeme poèítat zbytek po dìlení.
90 \::$a \leftarrow a \mod b$
92 \::$a \leftrightarrow b$
97 \>{\sl Dùkaz správnosti: }
101 Nahlédneme, ¾e dìlá toté¾ co pøedchozí verze.
104 \>{\bf Rychlost této verze:}
106 Uká¾eme, ¾e poèet krokù, který provede verze 2.0 je asi $\log(\max(a,b))$.
108 \s {Lemma:} Za 2 prùchody cyklem se buï hodnota $a$ nebo hodnota $b$
109 zmen¹í alespoò na polovinu.
111 (Dùkaz uká¾eme za chvíli.)
113 Uvìdomíme si, ¾e toto lemma ji¾ staèí k tomu, aby byl èas výpoètu
115 Prùchodù, které zmen¹ují hodnotu $a$, je nejvý¹e $\lceil \log_2
116 a \rceil$. Obdobnì prùchodù sni¾ujících hodnotu $b$ je nejvý¹e
117 $\lceil \log_2 b \rceil$.
118 Tedy celkový poèet prùchodù je nejvý¹e $2\cdot(\lceil \log_2 a \rceil+\lceil
119 \log_2 b\rceil)$, co¾ není více ne¾ $\sim \log(\max(a,b))$.
122 \>{\sl Dùkaz lemmatu: }
125 Rozebereme, co se stane po dvojím projití cyklem.
126 Na zaèátku máme èísla $a_0$ a $b_0$. Bez újmy na obecnosti pøedpokládejme,
127 ¾e $a_0>b_0$, jinak potøebujeme navíc jeden prùchod, v nìm¾ se èísla
129 Po prvním prùchodu: $a_1=b_0; b_1=a_0 \mod b_0$, co¾ je ménì ne¾ $b_0$.
130 Po druhém prùchodu: $a_2=b_1; b_2=a_1 \mod b_1 = b_0 \mod b_1$.
131 Chceme ukázat, ¾e kdy¾ je $b_1 < b_0$, tak $b_0 \mod b_1 \leq b_0/2$.
134 \: Buï platí $b_1 \leq b_0/2$. Pak jistì $b_0 \mod b_1$ je
137 \: Nebo nastane druhá mo¾nost $b_1 > b_0/2$.
138 Pak tedy $b_0 \mod b_1 = b_0-b_1$, co¾ je takté¾ maximálnì $b/2$.
145 \>{Jak nahlédnout, ¾e algoritmus není rychlej¹í ne¾ logaritmický?}
147 Skrze Fibonacciho èísla: necháme algoritmus poèítat $\gcd(F_n, F_{n-1})$.
149 Díky exponenciální velikosti Fibonacciho èísel tento výpoèet bude
150 opravdu trvat logaritmicky dlouho vzhledem k velikosti vìt¹ího ze
153 $\gcd(F_n, F_{n-1}) \rightarrow \gcd(F_{n-1}, F_{n-2}) \rightarrow
154 \dots \rightarrow \gcd(1, 1)$.
156 $($Zároveò je to asi nejhezèí dùkaz toho, ¾e Fibonacciho èísla jsou
160 Kdy¾ u¾ známe nìjaký algoritmus, mìli bychom se zaèít zaobírat otázkou, co takový algoritmus vlastnì je.
161 ®ádná obecnì uznávaná definice algoritmu neexistuje, zadefinujeme si alespoò výpoèetní model,
162 a za~algoritmy budeme pova¾ovat programy v tomto modelu.
164 \s{Základní vlastnosti výpoèetního modelu:}
166 V první øadì potøebujeme modelu sdìlit, s èím má pracovat, a pak se
167 dovìdìt, jak to dopadlo. Bez újmy na obecnosti mù¾eme pova¾ovat $n$
168 èísel za {\sl vstup} a za {\sl výstup} $m$ èísel $($mù¾eme se omezit
169 na èísla, nebo» cokoli jiného umíme do èísel zakódovat$)$.
171 Dále by mìl výpoèetní model umìt provádìt {\sl elementární operace},
173 jsou nejen ty aritmetické $(+,-,*,mod \dots)$ a logické $($negace,
175 \dots$)$, ale také øídící operace $($skoky, podmínìné skoky, halt
179 {\sl Èas bìhu algoritmu $t(x)$} pro vstup $x$ mìøíme jako poèet
180 elementárních operací, které program provedl pøi zpracování vstupu
183 \s{Definice:} {\I Èasová slo¾itost v nejhor¹ím pøípadì }
185 $T(n) := \max \{t(x) ; \hbox{$x$ je vstup délky $n$}\}$.
187 \s{Definice:} {\I Prostorová slo¾itost}
189 $S(n) := \max \{s(x) ; \hbox{$x$ je vstup délky $n$}\}$.
192 \s{Díry v definici:} co jsou to èísla?
193 Kdy¾ mohou být libovolnì velká, pak se dá podvádìt pøi poèítání èasové i prostorové
198 a) polynomiálnì velká vzhledem k tomu, kolik jich je
200 b) vstup mìøíme v bitech a operace pak trvá $\sim \log(x)$
202 \>(pro normální algoritmy tyto dvì definice dávají toté¾)
205 \>{Které slo¾itosti jsou rozumné a které nepou¾itelné?}
208 \>{\bf Srovnání rychlostí algoritmù (pøedpokládáme $10^9$ operací za
211 \def\[#1]{\,\hbox{#1}}
213 \halign{$#$ \hfil&\quad\hfil $#$&\quad\hfil $#$&\quad\hfil
214 $#$&\quad\hfil $#$&\quad\hfil $#$&\quad\hfil $#$&\quad\hfil $#$\cr
215 \hbox{funkce / $n=$\hskip-2em}& 10 & 20 & 30
216 & 50 & 100 & 1\,000 & 1\,000\,000 \cr
217 \noalign{\medskip\hrule\bigskip}
218 \log_2 n & 3.3\[ns] & 4.3\[ns] & 4.9\[ns]
219 & 5.6\[ns] & 6.6\[ns] & 10.0\[ns] & 19.9\[ns] \cr
220 n & 10\[ns] & 20\[ns] & 30\[ns]
221 & 50\[ns] & 100\[ns] & 1\[$\mu$s] & 1\[ms] \cr
222 n\cdot\log_2 n\hskip-1em & 33\[ns] & 86\[ns]
223 & 147\[ns] & 282\[ns] & 664\[ns] & 10\[$\mu$s] & 20\[ms]
225 n^2 & 100\[ns] & 400\[ns] & 900\[ns]
226 & 2.5\[$\mu$s] & 100\[$\mu$s] & 1\[ms] & 1\,000\[s] \cr
227 n^3 & 1\[$\mu$s] & 8\[$\mu$s] & 27\[$\mu$s]
228 & 125\[$\mu$s] & 1\[ms] & 1\[s] & 10^9\[s] \cr
229 2^n & 1\[$\mu$s] & 1\[ms] & 1\[s]
230 & 10^6\[s] & 10^{21}\[s] & 10^{292}\[s] & \approx\infty \cr
231 n! & 10^6\[s] & 10^{18}\[s] & 10^{32}\[s]
232 & 10^{64}\[s] & 10^{158}\[s] & 10^{2567}\[s] & \approx\infty \cr
235 \halign{#\hfil&\quad #\hfil\cr
236 Pro pøedstavu: &$1\,000\[s]$ je asi tak ètvrt hodiny\cr
237 &$1\,000\,000\[s]$ je necelých 12 dní\cr
238 &$10^9\[s]$ je 31 let\cr
239 &$10^{18}\[s]$ je asi tak stáøí Vesmíru. \cr}
244 {\>\bf Poèítaèe se nám zrychlují aneb Mooreùv zákon}
248 \uv{Ka¾dé dva roky se výkon poèítaèù zdvojnásobí} -- Gordon Moore
253 \qquad \dots\ Není tedy lep¹í chvíli poèkat ne¾ vymý¹let lep¹í
256 $$\vbox{\halign{\hfil$#$\quad&\hfil$#$\quad&\hfil$#$\qquad&#\hfil\cr
257 \hbox{funkce} & 10^6\;\hbox{op.} & 2\cdot10^6\;\hbox{op.} & zmìna \cr
258 \noalign{\medskip\hrule\bigskip}
259 n &1\,000\,000 &2\,000\,000 &2-krát více \cr
260 n^2 &1\,000 &1\,414 &$\sqrt{2}\approx 1.41$-krát
262 n^3 &100 &126 &$\root3\of2\approx 1.26$-krát
264 2^n &20 &21 &o 1 více \cr
269 \dots Ne, na nìkterých èasových slo¾itostech se to projeví tak nepatrnì.
272 Vyplatí se nejdøív najít dobrý algoritmus a pak optimalizovat konstanty.
276 Asymptotický rùst funkcí
279 \>\epsfxsize=1\hsize\epsfbox{../slides/funcs.eps}
281 Asymptotický rùst funkcí:
283 (èleny ni¾¹ích øádù se schovají do konstant)
285 \>\epsfxsize = 1\hsize\epsfbox{../slides/funcs2.eps}
288 Malé vstupy se èasto dají øe¹it samostatnì, lépe je tedy pou¾ít dva
289 algoritmy. Pro velké vstupy nezále¾í na konstantì a na èlenech ni¾¹ích