From: Martin Mares Date: Sat, 17 Oct 2009 21:43:33 +0000 (+0200) Subject: Pribyla prednaska o Goldbergove algoritmu. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=a0ba9f725effedb8a92f0c936d91f89694757d10;p=ads2.git Pribyla prednaska o Goldbergove algoritmu. --- diff --git a/3-goldberg/3-goldberg.stamp b/3-goldberg/3-goldberg.stamp new file mode 100644 index 0000000..e9c6ece --- /dev/null +++ b/3-goldberg/3-goldberg.stamp @@ -0,0 +1 @@ +2009-10-17 diff --git a/3-goldberg/3-goldberg.tex b/3-goldberg/3-goldberg.tex new file mode 100644 index 0000000..b301a26 --- /dev/null +++ b/3-goldberg/3-goldberg.tex @@ -0,0 +1,216 @@ +\input lecnotes.tex + +\prednaska{3}{Goldbergùv algoritmus}{(zapsala Markéta Popelová)} + +Pøedstavíme si~nový algoritmus pro~hledání maximálního toku v~síti, který se~uká¾e být stejnì dobrý jako {\I Dinicùv algoritmus} ($\O(MN^{2})$) a~po~nìkolika vylep¹eních bude i~lep¹í. Nejdøíve si~pøipomeòme definice, které budeme potøebovat: + +\s{Definice:} Mìjme sí» $S=(V,E,z,s,c)$, tok~$f$ a~libovolný vrchol~$v$. Pak $f^{\Delta}(v)$ nazýváme {\I pøebytek} ve~vrcholu~$v$ a~definujeme ho: $$f^{\Delta}(v):=\sum_{uv \in E}{f(uv)} - \sum_{vu \in E}{f(vu)}.$$ Pøebytek ve~vrcholu~$v$ je tedy souèet v¹eho, co do~vrcholu~$v$ pøiteèe, minus souèet v¹eho, co z~$v$ odteèe. + +\s{Definice:} Mìjme sí» $S=(V,E,z,s,c)$, tok~$f$ a~libovolnou hranu~$uv$. Pak $r(uv)$ je {\I rezerva} hrany $uv$ a~je definovaná: $$r(uv) = c(uv) - f(uv) + f(vu).$$ Rezerva hrany znaèí, co je¹tì je mo¾no po~té hranì poslat. + +\s{Poznámka:} Budeme pou¾ívat znaèení, ¾e~$N$ je poèet vrcholù a~$M$ je poèet hran, tedy~$N = \vert V \vert$ a~$M = \vert E \vert$. + +Goldbergùv algoritmus na~rozdíl od~Dinicova algoritmu zaèíná s~nìèím, co pravdìpodobnì tok není (budeme to nazývat {\I vlna}), a~postupnì to zmen¹uje a¾ na~korektní tok. + +\s{Definice:} Funkce $f:E \rightarrow {\bb R}_{0}^{+}$ je {\I vlna} v~síti~$(V, E, z, s, c)$ tehdy, kdy¾ jsou splnìny následující dvì podmínky: + \itemize\idot + \:$\forall e \in E : f(e) \leq c(e) $ + \:$ \forall v \in V \setminus \{z, s\} : f^{\Delta}(v) \geq 0 $. + \endlist + +\s{Pozorování:} Ka¾dý tok~$f$ je vlna. Nebo» $\forall e \in E : f(e) \leq c(e) $ a~$\forall v \ne z,s: f^{\Delta}(v) = 0$. + +\s{Operace:} {\I Pøevedení pøebytku} + +Algoritmus bude potøebovat pøevádìt pøebytky z~vrcholu~$u$ na~sousední vrcholL~$v$. Mìjme hranu~$uv$ s~kladnou rezervou: $r(uv) > 0$ a~kladným pøebytkem ve~vrcholu~$u$: $f^\Delta(u) > 0$. Èást pøebytku budeme chtít poslat z~vrcholu~$u$ do~vrcholu~$v$. Vezmeme $\delta := \min (f^\Delta(u), r(uv))$ a~po~hranì~$uv$ po¹leme tok o velikosti~$\delta$. Výsledná situace bude vypadat následovnì: + \itemize\idot + \:$f'^\Delta(u) = f^\Delta(u) - \delta$. + \:$f'^\Delta(v) = f^\Delta(v) + \delta$. + \:$r'(uv) = r(uv) - \delta$. + \:$r'(vu) = r(vu) + \delta$. + \endlist + +Kdybychom ov¹em nepøidali ¾ádnou jinou podmínku, ná¹ algoritmus by se~mohl krásnì zacyklit (napø. posílat pøebytek z~$u$ do~$v$ a~zase zpátky). Abychom se~tomu vyhnuli, zavedeme {\I vý¹ku vrcholu} $h: V \to {\bb N}$ a~dovolíme pøevádìt pøebytek pouze z~vy¹¹ího vrcholu~$u$ na~ni¾¹í $v$: $h(u) > h(v)$. + +\s{Shrnutí:} Podímnky pro~pøevedení pøebytku po~hranì $uv \in E$: + \numlist\ndotted + \:Ve~vrcholu~$u$ je nenulový pøebytek: $f^{\Delta}(u) > 0$. + \:Vrchol~$u$ je vý¹ ne¾ vrchol~$v$: $h(u) > h(v)$. + \:Hrana~$uv$ má nenulovou rezervu: $r(uv)>0$. + \endlist + +\s{Definice:} Øekneme, ¾e pøevedení je {\I nasycené}, pokud po~pøevodu rezerva na~hranì~$uv$ klesla na~nulu, tedy $r(uv)=0$. Naopak pøevedení je {\I nenasycené}, pokud po~pøevodu klesl pøebytek ve~vrcholu~$u$ na~nulu, tedy $f^{\Delta}(u) = 0$. Pokud $r(uv)=0$ a~$f^{\Delta}(u) = 0$, budeme pøevedení pova¾ovat za~{\I nasycené}. + +\s{Operace:} Pro~vrchol~$u \in V$ definujme {\I zvednutí vrcholu}: +Pokud bìhem výpoètu narazíme ve~vrcholu~$u$ na~pøebytek, který nelze nikam pøevést, zvìt¹íme vý¹ku vrcholu~$u$ o~jednièku, tj. $h(u) \leftarrow h(u)+1$. + + +\s{Algoritmus (Goldbergùv)} + +\algo +\:$\forall v \in V: h(v)\leftarrow 0$ (v¹em vrcholùm nastavíme poèáteèní vý¹ku nula) a~$h(z)\leftarrow N$ (zdroj zvedneme do~vý¹ky~$N$). +\:$\forall e \in E: f(e)\leftarrow 0$ (po~hranách nejdøíve nenecháme protékat nic) a~$\forall zu \in E : f(zu)\leftarrow c(zu)$ (ze~zdroje pustíme maximální mo¾nou vlnu). +\:Dokud $\exists u \in V \setminus \{z,s\}: f^{\Delta}(u)>0$: +\::Pokud $\exists v \in V: uv \in E,~r(uv)>0$ a~$h(u)>h(v)$, pak pøevedeme pøebytek po~hranì z~$u$ do~$v$. +\::V~opaèném pøípadì zvedneme $u$:~$h(u) \leftarrow h(u) + 1$. +\:Vrátíme tok~$f$ jako výsledek. +\endalgo + +\noindent +Nyní bude následovat nìkolik lemmat a~invariantù, jimi¾ doká¾eme správnost a~koneènost Goldbergova algoritmu. + +\s{Invariant A (základ):} + \numlist \ndotted + \:Funkce~$f$ je v~ka¾dém kroku algoritmu vlna. + \:$h(v)$ nikdy neklesá pro~¾ádné~$v$. + \:$h(z)=N$ a~$h(s)=0$ po~celou dobu algoritmu. + \endlist + +\proof Indukcí dle bìhu algoritmu. + +Na zaèátku je v¹e v~poøádku ($f$ je nulová funkce, pøebytky v¹ech vrcholù jsou nezáporné, tedy~$f$ je vlna, $h(z)=N$ a~$h(s)=0$. V~prùbìhu se~tyto hodnoty mìní pouze pøi: + \itemize\ibull + \:Pøevedení po~hranì~$uv$: Po hranì~$uv$ se~nepo¹le více ne¾ její rezerva. Pøebytek~$u$ se~sní¾í, ale nejménì na~nulu. Pøebytek~$v$ se~zvý¹í. Tedy~$f$ zùstává vlnou. Vý¹ky se~nemìní. + \:Zvednutí vrcholu~$u$: Mìní pouze vý¹ky -- a~to vrcholù rùzných od zdroje èi stoku -- a~pouze je zvy¹uje. + \qeditem + \endlist + +\s{Invariant S (o~Spádu):} Neexistuje hrana $uv \in E: r(uv)>0$ \& $h(u) > h(v)+1$ (s~kladnou rezervou a~spádem vìt¹ím ne¾ jedna). + +\proof Indukcí dle bìhu algoritmu. + +Na zaèátku mají v¹echny hrany ze~zdroje rezervu nulovou a~v¹echny ostatní vedou mezi vrcholy s~vý¹kou 0. V~prùbìhu by se~tento invariant mohl pokazit pouze dvìma zpùsoby: + \itemize\ibull + \:Zvednutím vrcholu~$u$, ze~kterého vede hrana~$uv$ s~kladnou rezervou a~spádem 1. Tento pøípad nemù¾e nastat, nebo» hranu zvedáme pouze tehdy, kdy¾ neexistuje vrchol~$v$ takový, ¾e hrana~$uv$ má kladnou rezervu a~spád alespoò 1. Takový vrchol v~na¹em pøípadì existuje, proto se~místo zvednutí vrcholu~$u$ po¹le pøebytek po~hranì~$uv$. + \:Zvìt¹ením rezervy hrany se~spádem vìt¹ím ne¾ 1. Toto také nemù¾e nastat, nebo» rezervu bychom mohli zvìt¹it jedinì tak, ¾e bychom poslali nìco v~protismìru -- a~to nesmíme, jeliko¾ bychom poslali pøebytek z~ni¾¹ího vrcholu na~vy¹¹í. + \qeditem + \endlist + +\s{Lemma K (o~Korektnosti):} Kdy¾ se~algoritmus zastaví, je~$f$ maximální tok. + +\proof Dùkaz rozlo¾me do~dvou krokù. Nejdøíve uká¾eme, ¾e~$f$ je tok, a~pak jeho maximalitu. + + \numlist\ndotted + \:Nech» se~algoritmus zastavil. Pak nemohl existovat ¾ádný vrchol~$v$ (kromì zdroje a~stoku) s~kladným pøebytkem. Tedy $\forall v \in V~\setminus \{z,s\}: f^\Delta(v) = 0$. (Víme ji¾, ¾e~$f$ je po~celou dobu vlna, tak¾e pøebytek nemù¾e být nikdy záporný.) V~tom pøípadì splòuje~$f$ podmínky toku. + \:Pro spor pøedpokládejme, ¾e tok~$f$ není maximální. Pak existuje zlep¹ující cesta, tedy cesta ze~zdroje do~stoku, její¾ v¹echny hrany mají kladnou rezervu. Vezmìme si~libovolnou takovou cestu. Zdroj je stále ve~vý¹ce~$N$ a~spotøebiè ve~vý¹ce 0 (viz invariant A). Tato cesta tedy pøekonává vý¹ku~$N$, ale mù¾e mít nejvý¹e~$N-1$ hran. Proto existuje alespoò jedna hrana se~spádem alespoò 2. Tato hrana tedy nemù¾e mít kladnou rezervu (viz invariant S). Tato cesta proto nemù¾e být zlep¹ující, co¾ je spor. Tím jsme dokázali, ¾e~$f$ je nutnì maximální tok. + \qeditem + \endlist + +\s{Definice:} Cestu~$P$ nazveme {\I nenasycenou}, pokud v¹echny její hrany mají kladnou rezervu. Neboli $\forall e \in P: r(e) > 0$. + +\s{Lemma C (Cesta):} Mìjme vrchol $v \in V$. Pokud $f^{\Delta}(v) > 0$, pak existuje nenasycená cesta z~vrcholu~$v$ do~zdroje. + + +\proof +Mìjme nìjaký vrchol~$v \in V$ takový, ¾e $f^{\Delta}(v) > 0$. Potom definujme mno¾inu $A := \{ u \in V : \exists$ nenasycená cesta z~$v$ do~$u \}$. + +Seètìme pøebytky ve~v¹ech vrcholech mno¾iny~$A$. Pøebytek ka¾dého vrcholu se~spoèítá jako souèet tokù do~nìj vstupujících minus souèet tokù z~nìj vystupujících. V¹echny hrany, jejich¾ oba vrcholy le¾í v~$A$, se~jednou pøiètou a~jednou odeètou. Proto nás budou zajímat pouze hrany mezi~$A$ a~$V \setminus A$. + + $$\sum_{u \in A}f^{\Delta}(u) = \underbrace{ \sum_{ab \in E \cap ( V \setminus A \times A )} f(ab) }\limits_{=0} - \underbrace{ \sum_{ab \in E \cap ( A \times V \setminus A )} f(ab) }\limits_{\geq 0}~\leq~0.$$ + +Uka¾me si, proè $\sum_{ab \in E \cap ( V \setminus A \times A )} f(ab) = 0$. Mìjme vrcholy $a \in V \setminus A$ a~$b \in A$ takové, ¾e $ab\in E$. O~nich víme, ¾e $r(ab) = 0$ (jinak by~$a$ patøilo do~$A$) $\Rightarrow f(ab)=0$. Proto do~$A$ nic nepøitéká. + +\figure{Goldberg01.eps}{Obrázek k dùkazu lemmatu C}{0.2\hsize} + +Druhý èlen $\sum_{ab \in E \cap ( A \times V \setminus A )} f(ab) \geq 0$ je zøejmý, nebo» tok na~hranì je v¾dy nezáporný a~souèet nezáporných èísel je nezáporné èíslo. + +Proto $\sum_{u \in A}{f^\Delta(u) \le 0}$. Zároveò v¹ak v~$A$ je aspoò jeden vrchol s~kladným pøebytkem, toti¾~$v$, proto v~$A$ musí být také vrchol se~záporným pøebytkem -- a~jediný takový je zdroj. Tím je dokázáno, ¾e $z \in A$, tedy ¾e vede nenasycená cesta z~vrcholu~$v$ do~zdroje. + +\qed + +\s{Invariant V (Vý¹ka):} $\forall v \in V$ platí $h(v)\leq 2N$. + +\proof +Kdyby existoval vrchol~$v$ s~vý¹kou $h(v) > 2N$, tak by musel být nìkdy zvednut z~vý¹ky~$2N$. Tehdy musel mít kladný pøebytek $f^\Delta(v)>0$ (jinak by nemohl být zvednut). Dle lemmatu C musela existovat nenasycená cesta z~$v$ do~zdroje. Tato cesta mìla spád alespoò~$N$, ale mohla mít nejvý¹e~$N-1$ hran (jinak by to nebyla cesta v~síti na~$N$ vrcholech). Tudí¾ musela na~této cestì existovat hrana se~spádem alespoò 2, co¾ je spor s~invariantem S (nebo» v¹echny hrany této cesty mají z~definice nenasycené cesty kladné rezervy). +\qed + +\s{Lemma Z (poèet Zvednutí):} Poèet v¹ech zvednutí je maximálnì~$2N^{2}$. + +\proof +Staèí si~uvìdomit, ¾e ka¾dý vrchol mù¾eme zvednout maximálnì~$2N$-krát a~vrcholù je~$N$. +\qed + +\s{Lemma S (naSycená pøevedení):} Poèet v¹ech nasycených pøevedení je nejvý¹~$NM$. + +\proof +Pro ka¾dou hranu~$uv$ spoèítejme poèet nasycených pøevedení (tedy takových pøevedení, ¾e po~nich klesne rezerva hrany na~nulu). Abychom dvakrát nasycenì pøevedli pøebytek (nebo jeho èást) z~vrcholu~$u$ do~vrcholu~$v$, tak jsme museli~$u$ mezitím alespoò dvakrát zvednout. Ale nejvý¹e mù¾eme hranu zvednout~$2N$-krát. V¹ech hran je~$M$, proto poèet v¹ech nasycených pøevedení je nejvý¹e~$NM$. +\qed + +\s{Lemma N (Nenasycená pøevedení):} Poèet v¹ech nenasycených pøevedení je~$\O(N^2M)$. + +\proof +Dùkaz provedeme pomocí potenciálové metody -- nadefinujme si~následující funkci jako potenciál: + $$ \Phi := \sum_{\scriptstyle{v: f^{\Delta}(v) > 0} \atop \scriptstyle{v \ne z,s}} h(v). $$ +Nyní se~podívejme, jak se~ná¹ potenciál bìhem algoritmu vyvíjí a~jaké má vlastnosti: + + \itemize\ibull + \:Na poèátku je $ \Phi = 0 $. + \:Bìhem celého algoritmu je $ \Phi \ge 0 $, nebo» je souètem nezáporných èlenù. + \:Zvednutí vrcholu zvý¹í $\Phi$ o~jednièku (Aby byl vrchol zvednut, musel mít kladný pøebytek $\Rightarrow$ vrchol do~sumy ji¾ pøispíval, teï jen pøispìje èíslem o 1 vy¹¹ím.). Ji¾ víme, ¾e za~celý prùbìh algoritmu je v¹ech zvednutí maximálnì~$2N^2$, proto zvedáním vrcholù zvý¹íme potenciál dohromady nejvý¹e o~$2N^2$. + \:Nasycené pøevedení zvý¹í~$\Phi$ nejvý¹e o~$2N$, proto¾e buï po~pøevodu hranou~$uv$ v~$u$ zùstal nìjaký pøebytek, tak¾e se~mohl potenciál zvý¹it nejvý¹e o~$h(v) \leq 2N$, nebo je pøebytek v~$u$ po~pøevodu nulový a~potenciál se~dokonce o~jedna sní¾il. Za~celý prùbìh tak dojde k~maximálnì~$NM$ takovýmto pøevedením, díky nim¾ se~potenciál zvý¹í maximálnì o~$2N^2M$. + \:Koneènì kdy¾ pøevádíme po~hranì~$uv$ nenasycenì, tak od~potenciálu urèitì odeèteme vý¹ku vrcholu~$u$ (nebo» se~vynuluje pøebytek ve~vrcholu~$u$) a~mo¾ná pøièteme vý¹ku vrcholu~$v$. Jen¾e $h(v) = h(u) - 1$, a~proto nenasycené pøevedení potenciál v¾dy sní¾í alespoò o~jedna. + \endlist + +\>Z~tohoto rozboru chování potenciálu~$\Phi$ v~prùbìhu algoritmu získáváme, ¾e poèet v¹ech nenasycených pøevedení mù¾e být nejvý¹e $2N^2 + 2N^2M$, co¾ je $\O(N^2M)$. +\qed + +\s{Implementace:} + +Budeme si~pamatovat seznam~$P$ v¹ech vrcholù~$v \ne z,s$ s~kladným pøebytkem. Neboli +$$P = \{ v \in V \setminus \{z,s\} ~\vert~ f^{\Delta}(v) > 0 \}.$$ +Kdy¾ mìníme pøebytek nìjakého vrcholu, mù¾eme ná¹ seznam v~konstantním èase aktualizovat (napø. tak, ¾e si~ka¾dý vrchol pamatuje pozici, na~které v~seznamu~$P$ je). V~konstantním èase také umíme odpovìdìt, zda existuje nìjaký vrchol s~pøebytkem. + +Dále si~pro ka¾dý vrchol~$u \in V$ budeme pamatovat~$L(u)$ seznam hran~$uv \in E$ takových, které vedou dolù (mají spád alespoò 1) a~kladnou rezervu. Neboli +$$L(u) = \{ uv \in E ~\vert~ v \in V,~ r(uv) > 0,~ h(v) < h(u)\}.$$ +Díky tomu mù¾eme pøistupovat k~patøièným sousedùm~$u$ v~èase $\O(1)$, stejnì jako pøidávat hrany do~$L(u)$, resp. je mazat. Opìt ka¾dá hrana si~bude pamatovat pozici, na~které se~nachází v~seznamu~$L$. %TODO + +\s{Rozbor èasové slo¾itosti algoritmu:} + +\numlist\ndotted +\:Inicializace vý¹ek \dots $\O(1)$. +\:Inicializace vlny~$f$ \dots $\O(M)$. +\:Výbìr vrcholu~$u$ s~kladným pøebytkem -- vezmeme první vrchol v~$P$ \dots $\O(1)$. +\:Výbìr vrcholu~$v$, do~kterého vede z~$u$ hrana s~kladnou rezervou a~který je ní¾e ne¾~$u$ -- vezmeme první hranu z~$L(u)$ \dots $\O(1)$. + + Pøevedení pøebytku: \dots $\O(1)$. + \itemize\idot + \:Nasycené pøevedení \dots $\O(1)$. + \itemize\idot + \:Rezerva hrany~$uv$ klesne na~nulu $\Rightarrow$ hrana~$uv$ vypadne z~$L(u)$ \dots $\O(1)$. + \:Pøebytek vrcholu~$v$ se~zvý¹í $\Rightarrow$ pokud je¹tì nebyl v~seznamu~$P$, tak se~tam pøidá \dots $\O(1)$. + \:Pøebytek vrcholu~$u$ mo¾ná také klesne na~nulu $\Rightarrow$ pak by vrchol~$u$ vypadnul z~$P$ \dots $\O(1)$. + \endlist + \:Nenasycené pøevedení \dots $\O(1)$. + \itemize\idot + \:Rezerva hrany~$uv$ zùstane nezáporná $\Rightarrow$ hrana~$uv$ zùstane v~$L(u)$ \dots $\O(1)$. + \:Vynuluje se~pøebytek vrcholu~$u$~$\Rightarrow$ vrchol $u$ vypadne z~$P$ \dots~$\O(1)$. + \:Pøebytek vrcholu~$v$ se~zvý¹í~$\Rightarrow$ pokud je¹tì nebyl v~seznamu~$P$, tak se~tam pøidá \dots $\O(1)$. + \endlist + \endlist +\:Zvednutí vrcholu~$u$ \dots $\O(N)$. + + Musíme obejít v¹echny hrany do~$u$ a~z~$u$, kterých je nejvý¹e~$2N-2$, porovnat vý¹ky a~pøípadnì tyto hrany~$uv$ odebrat ze~seznamu~$L(u)$ resp. pøidat do~$L(v)$. Abychom pro~odebrání hrany~$uv$ ze~seznamu~$L(u)$ nemuseli procházet celý seznam, budeme si~$\forall v \in V$ pamatovat je¹tì $L^{-1}(v) := $ seznam ukazatelù na~hrany~$uv$ v~seznamech~$L(u)$. +\endlist + +Vidíme, ¾e ka¾dé zvednutí je sice drahé, ale je jich zase pomìrnì málo. Naopak pøevádìní pøebytkù je èastá operace, tak¾e je výhodné, ¾e trvá konstantní èas. + +\s{Shrnutí:} + +\itemize\ibull +\:V¹ech zvednutí je $\O(N^2)$ (viz lemma Z), ka¾dé trvá $\O(N) \dots \O(N^3).$ +\:V¹ech nasycených pøevedení je $\O(NM)$ (viz lemma S), ka¾dé trvá $\O(1) \dots \O(NM).$ +\:V¹ech nenasycených pøevedení je $\O(N^2M)$ (viz lemma N), ka¾dé trvá $\O(1) \dots \O(N^2M).$ +\endlist + +Dohromady má tedy Goldbergùv algoritmus èasovou slo¾itost $\O(N^2M)$. Vidíme, ¾e u¾ v~tomto obecném pøípadì to není hor¹í ne¾ Dinicùv algoritmus. Pøí¹tì si~uká¾eme, ¾e mù¾e mít i~mnohem lep¹í. Nejdøíve ale zformulujme v¹echna dokázaná tvrzení do~následující vìty: + +\s{Vìta:} Goldbergùv algoritmus najde maximální tok v~èase $\O(N^2M)$. + +%Dokázali jsme, ¾e algoritmus má èasovou slo¾itost $\O(N^2M)$ pro~libovolnou posloupnost zvedání a~pøevádìní. Nabízí se~otázka, zda není mo¾né vhodným výbìrem tìchto operací výpoèet zrychlit. Uká¾eme, ¾e pokud v~$5.$ kroku algoritmu budeme v¾dy brát vrchol~$u$ takový, ¾e~$h(u)$ je maximální, poèet nenasycených pøevedení se~sní¾í. + +%\s{Lemma N':} Poèet nenasycených pøevedení v~upravené verzi Goldbergova algoritmu je $\O(N^2\sqrt{M})$, co¾ je maximálnì $\O(N^3)$. Díky tomu je i~slo¾itost celého algoritmu $\O(N^3)$. + +%\proof +%Viz pøí¹tí pøedná¹ku. + +\bye diff --git a/3-goldberg/Goldberg01.eps b/3-goldberg/Goldberg01.eps new file mode 100644 index 0000000..70be6d9 --- /dev/null +++ b/3-goldberg/Goldberg01.eps @@ -0,0 +1,517 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: inkscape 0.46 +%%Pages: 1 +%%Orientation: Portrait +%%BoundingBox: 0 0 311 196 +%%HiResBoundingBox: 7.6535002e-09 -2.5149246e-06 310.80097 195.23405 +%%EndComments +%%Page: 1 1 +0 196 translate +0.8 -0.8 scale +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +gsave [1 0 0 1 0 0] concat +gsave [1 0 0 1 -7.2922934 -15.871617] concat +gsave [1 0 0 1 -105.66802 -41.295546] concat +0 0 0 setrgbcolor +[] 0 setdash +0.80000001 setlinewidth +0 setlinejoin +0 setlinecap +newpath +327.93522 188.25911 moveto +327.93522 250.38705 279.87044 300.80972 220.64777 300.80972 curveto +161.42509 300.80972 113.36031 250.38705 113.36031 188.25911 curveto +113.36031 126.13117 161.42509 75.708496 220.64777 75.708496 curveto +279.87044 75.708496 327.93522 126.13117 327.93522 188.25911 curveto +closepath +stroke +grestore +0 0 0 setrgbcolor +[] 0 setdash +0.80000001 setlinewidth +0 setlinejoin +0 setlinecap +newpath +280.82453 35.083625 moveto +274.32214 36.15662 267.81146 37.271113 261.46388 39.07255 curveto +256.08401 40.577261 250.81811 42.517725 245.82341 45.028881 curveto +242.79426 46.611213 239.80154 48.311743 237.07234 50.377073 curveto +234.88576 52.176848 232.73392 54.282673 231.7761 57.010153 curveto +230.78471 60.185495 231.63558 63.732075 233.65009 66.325725 curveto +236.75865 70.711495 240.33853 74.740745 243.39187 79.167695 curveto +247.43465 84.791545 250.49703 91.075895 252.79232 97.599345 curveto +255.73385 105.89744 257.62345 114.54784 258.74508 123.2725 curveto +259.85691 132.25533 260.47539 141.30252 260.54328 150.35388 curveto +260.61846 156.41558 260.15107 162.46548 259.4918 168.48702 curveto +258.79686 174.88094 257.75376 181.2491 256.18144 187.48805 curveto +254.45425 194.02304 252.04233 200.40052 248.79575 206.33576 curveto +247.2219 209.23818 245.37178 211.98356 243.24102 214.50717 curveto +239.09684 219.50186 234.37978 223.98307 229.5905 228.35067 curveto +228.29104 229.49906 226.85166 230.63983 226.19953 232.30237 curveto +225.88232 233.85635 227.01743 235.15405 228.04206 236.16404 curveto +230.86374 238.84504 234.40416 240.56607 237.77898 242.42967 curveto +244.47556 245.58462 251.01265 249.15643 258.0782 251.44753 curveto +263.50053 253.31902 269.10056 254.64678 274.77642 255.46817 curveto +281.19473 256.48978 287.71445 256.73692 294.20191 256.45025 curveto +299.14227 256.2547 304.06877 255.67187 308.93321 254.79402 curveto +314.84679 253.66015 320.68583 252.06888 326.29328 249.86487 curveto +335.79003 246.03402 344.80686 240.95359 352.85154 234.60416 curveto +359.46392 229.40402 365.5126 223.47549 370.79463 216.92672 curveto +375.60643 210.82002 379.79681 204.2236 383.33905 197.30459 curveto +387.6165 188.82584 390.7268 179.78059 392.82506 170.52565 curveto +394.15871 164.50115 394.96709 158.35759 395.28813 152.19661 curveto +395.7406 141.38443 394.72997 130.5209 392.3705 119.96144 curveto +390.72701 112.77723 388.56478 105.6875 385.51691 98.966625 curveto +382.44736 92.078085 378.75152 85.457485 374.33557 79.338215 curveto +369.33811 72.377305 363.48786 66.041715 357.08025 60.359605 curveto +351.79315 55.738659 346.09511 51.583256 339.99622 48.096383 curveto +334.45248 44.913288 328.59052 42.258109 322.49914 40.311008 curveto +314.227 37.734459 305.64752 36.306252 297.06034 35.276544 curveto +292.71018 34.814917 288.33133 34.464891 283.95627 34.610909 curveto +282.91236 34.768481 281.86844 34.926053 280.82453 35.083625 curveto +closepath +stroke +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +newpath +280.5668 226.72064 moveto +148.58299 192.30769 lineto +stroke +gsave [0.77411904 0.20184081 -0.20184081 0.77411904 158.25948 194.8307] concat +gsave +0 0 0 setrgbcolor +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +eofill +grestore +0 0 0 setrgbcolor +[] 0 setdash +1.25 setlinewidth +0 setlinejoin +0 setlinecap +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +stroke +grestore +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +newpath +286.23483 122.89173 moveto +163.96762 131.39375 lineto +stroke +gsave [0.79807286 -0.055495103 0.055495103 0.79807286 173.94353 130.70006] concat +gsave +0 0 0 setrgbcolor +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +eofill +grestore +0 0 0 setrgbcolor +[] 0 setdash +1.25 setlinewidth +0 setlinejoin +0 setlinecap +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +stroke +grestore +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +newpath +267.20648 73.68421 moveto +156.27531 100.80972 lineto +stroke +gsave [0.77710466 -0.19002198 0.19002198 0.77710466 165.98912 98.434445] concat +gsave +0 0 0 setrgbcolor +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +eofill +grestore +0 0 0 setrgbcolor +[] 0 setdash +1.25 setlinewidth +0 setlinejoin +0 setlinecap +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +stroke +grestore +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +newpath +284.1675 181.73326 moveto +163.31146 161.35254 lineto +stroke +gsave [0.78886172 0.13303075 -0.13303075 0.78886172 173.17223 163.01542] concat +gsave +0 0 0 setrgbcolor +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +eofill +grestore +0 0 0 setrgbcolor +[] 0 setdash +1.25 setlinewidth +0 setlinejoin +0 setlinecap +newpath +0 0 moveto +5 -5 lineto +-12.5 0 lineto +5 5 lineto +0 0 lineto +closepath +stroke +grestore +gsave [1 0 0 1 -10.931174 -14.170041] concat +gsave +0 0 0 setrgbcolor +newpath +69.75 150.46416 moveto +69.749976 149.90952 69.301976 149.20552 68.406 148.35216 curveto +67.509978 147.49885 67.061979 146.62419 67.062 145.72816 curveto +67.061979 145.04552 67.275312 144.51219 67.702 144.12816 curveto +68.128644 143.74419 68.704644 143.55219 69.43 143.55216 curveto +70.411309 143.55219 71.243308 143.93619 71.926 144.70416 curveto +72.651306 145.42952 73.013973 146.30419 73.014 147.32816 curveto +73.013973 148.52285 72.629973 150.05885 71.862 151.93616 curveto +71.136641 153.77085 70.219309 155.47751 69.11 157.05616 curveto +65.824647 161.66417 62.859316 165.4615 60.214 168.44816 curveto +57.568655 171.43483 55.840657 172.92816 55.03 172.92816 curveto +54.645991 172.92816 54.453991 172.1815 54.454 170.68816 curveto +54.453991 168.8535 54.304658 165.99484 54.006 162.11216 curveto +53.707325 158.18684 53.387326 155.11485 53.046 152.89616 curveto +52.619326 149.95218 52.149994 148.05352 51.638 147.20016 curveto +51.125995 146.34685 50.251329 145.92019 49.014 145.92016 curveto +48.203331 145.92019 47.563332 145.94152 47.094 145.98416 curveto +47.094 145.15216 lineto +48.58733 144.89619 49.888663 144.66152 50.998 144.44816 curveto +52.107327 144.23486 52.875326 144.06419 53.302 143.93616 curveto +53.728659 143.80819 54.112658 143.72286 54.454 143.68016 curveto +54.795324 143.59486 55.136657 143.55219 55.478 143.55216 curveto +56.160656 143.55219 56.843322 146.06952 57.526 151.10416 curveto +58.251321 156.13885 58.741987 161.53617 58.998 167.29616 curveto +60.982 165.24816 lineto +63.243316 162.85884 65.26998 160.17084 67.062 157.18416 curveto +68.853977 154.15485 69.749976 151.91485 69.75 150.46416 curveto +fill +grestore +grestore +gsave +0 0 0 setrgbcolor +newpath +112.67278 62.815617 moveto +112.67278 63.967617 lineto +94.960781 63.967617 lineto +94.960781 62.815617 lineto +97.264756 62.575618 98.776754 62.215619 99.496781 61.735617 curveto +100.21675 61.25562 100.57675 60.343621 100.57678 58.999617 curveto +100.57675 58.615622 100.52875 57.991623 100.43278 57.127617 curveto +98.992781 47.695617 lineto +83.152781 47.695617 lineto +79.048781 55.831617 lineto +78.088775 57.751623 77.608776 59.239622 77.608781 60.295617 curveto +77.608776 61.20762 77.848775 61.807619 78.328781 62.095617 curveto +78.856774 62.383619 80.032773 62.623618 81.856781 62.815617 curveto +81.856781 63.967617 lineto +68.392781 63.967617 lineto +68.392781 62.815617 lineto +69.880783 62.527618 71.104782 61.807619 72.064781 60.655617 curveto +73.07278 59.503621 74.944778 56.575624 77.680781 51.871617 curveto +98.560781 15.871617 lineto +100.43278 15.871617 lineto +107.20078 56.623617 lineto +107.68075 59.263622 108.20875 60.91962 108.78478 61.591617 curveto +109.36074 62.215619 110.65674 62.623618 112.67278 62.815617 curveto +84.664781 45.103617 moveto +98.632781 45.103617 lineto +95.464781 26.383617 lineto +84.664781 45.103617 lineto +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +287.18781 17.761328 moveto +287.18781 18.913328 lineto +285.65176 18.961374 284.30776 19.921373 283.15581 21.793328 curveto +256.29981 66.073328 lineto +254.93181 66.073328 lineto +248.81181 28.633328 lineto +248.0438 24.121369 247.3958 21.433372 246.86781 20.569328 curveto +246.3878 19.705374 245.1398 19.153374 243.12381 18.913328 curveto +243.12381 17.761328 lineto +260.47581 17.761328 lineto +260.47581 18.913328 lineto +258.21979 19.153374 256.73179 19.513374 256.01181 19.993328 curveto +255.29179 20.473373 254.93179 21.337372 254.93181 22.585328 curveto +254.93179 23.06537 254.95579 23.42537 255.00381 23.665328 curveto +259.75581 55.561328 lineto +274.58781 29.929328 lineto +277.08377 25.609368 278.33177 22.753371 278.33181 21.361328 curveto +278.33177 20.065373 276.81977 19.249374 273.79581 18.913328 curveto +273.79581 17.761328 lineto +287.18781 17.761328 lineto +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +296.71543 16.825328 moveto +301.89943 16.825328 lineto +322.63543 66.073328 lineto +317.52343 66.073328 lineto +296.71543 16.825328 lineto +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +378.24418 63.625328 moveto +378.24418 64.777328 lineto +360.53218 64.777328 lineto +360.53218 63.625328 lineto +362.83616 63.38533 364.34816 63.02533 365.06818 62.545328 curveto +365.78816 62.065331 366.14816 61.153332 366.14818 59.809328 curveto +366.14816 59.425334 366.10016 58.801334 366.00418 57.937328 curveto +364.56418 48.505328 lineto +348.72418 48.505328 lineto +344.62018 56.641328 lineto +343.66018 58.561335 343.18018 60.049333 343.18018 61.105328 curveto +343.18018 62.017331 343.42018 62.617331 343.90018 62.905328 curveto +344.42818 63.19333 345.60418 63.43333 347.42818 63.625328 curveto +347.42818 64.777328 lineto +333.96418 64.777328 lineto +333.96418 63.625328 lineto +335.45219 63.33733 336.67619 62.617331 337.63618 61.465328 curveto +338.64418 60.313333 340.51618 57.385336 343.25218 52.681328 curveto +364.13218 16.681328 lineto +366.00418 16.681328 lineto +372.77218 57.433328 lineto +373.25215 60.073333 373.78015 61.729332 374.35618 62.401328 curveto +374.93215 63.02533 376.22815 63.43333 378.24418 63.625328 curveto +350.23618 45.913328 moveto +364.20418 45.913328 lineto +361.03618 27.193328 lineto +350.23618 45.913328 lineto +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +321.33714 220.85778 moveto +321.76378 220.85778 322.46778 220.40978 323.44914 219.51378 curveto +324.43044 218.57512 325.43311 217.55112 326.45714 216.44178 curveto +327.22514 217.08178 lineto +324.87844 219.98312 323.12911 221.88178 321.97714 222.77778 curveto +320.82511 223.67378 319.60912 224.12178 318.32914 224.12178 curveto +316.62245 224.12178 315.76912 223.24711 315.76914 221.49778 curveto +315.76912 220.43112 316.25979 217.97779 317.24114 214.13778 curveto +314.42512 218.10579 312.14246 220.77245 310.39314 222.13778 curveto +308.64379 223.50311 306.63846 224.18578 304.37714 224.18578 curveto +302.32913 224.18578 300.72913 223.56711 299.57714 222.32978 curveto +298.42514 221.04978 297.84914 219.30045 297.84914 217.08178 curveto +297.84914 213.79646 298.76647 210.44713 300.60114 207.03378 curveto +302.47847 203.62047 304.84646 200.80447 307.70514 198.58578 curveto +310.60646 196.36714 313.42246 195.25781 316.15314 195.25778 curveto +319.01178 195.25781 320.71845 196.49514 321.27314 198.96978 curveto +321.97714 195.89778 lineto +322.16914 195.70578 lineto +326.07314 195.25778 lineto +326.52114 195.44978 lineto +326.47844 195.62048 326.35044 196.06848 326.13714 196.79378 curveto +322.33978 210.70313 320.44112 218.44712 320.44114 220.02578 curveto +320.44112 220.58045 320.73978 220.85778 321.33714 220.85778 curveto +320.12114 200.56978 moveto +320.12112 199.37514 319.75845 198.43647 319.03314 197.75378 curveto +318.35045 197.02847 317.41178 196.66581 316.21714 196.66578 curveto +313.87046 196.66581 311.63046 198.03114 309.49714 200.76178 curveto +307.40646 203.49247 305.8278 206.35113 304.76114 209.33778 curveto +303.73713 212.28179 303.22513 214.58579 303.22514 216.24978 curveto +303.22513 217.70045 303.56647 218.87379 304.24914 219.76978 curveto +304.9318 220.62312 305.8278 221.04978 306.93714 221.04978 curveto +308.94246 221.04978 310.99046 219.89778 313.08114 217.59378 curveto +315.17179 215.24712 316.85712 212.47379 318.13714 209.27378 curveto +319.45978 206.0738 320.12112 203.17247 320.12114 200.56978 curveto +fill +grestore +gsave +0 0 0 setrgbcolor +newpath +116.35173 140.22451 moveto +116.35173 139.13651 lineto +119.55172 138.75255 122.81572 138.26189 126.14373 137.66451 curveto +126.46373 137.98451 lineto +119.80773 162.81651 lineto +122.06905 159.2752 124.13838 156.7792 126.01573 155.32851 curveto +127.89304 153.87787 129.94104 153.15254 132.15973 153.15251 curveto +134.29304 153.15254 136.0637 153.87787 137.47173 155.32851 curveto +138.8797 156.7792 139.5837 158.61387 139.58373 160.83251 curveto +139.5837 164.11786 138.5597 167.42452 136.51173 170.75251 curveto +134.50637 174.03785 131.92504 176.74718 128.76773 178.88051 curveto +125.61038 181.01384 122.45305 182.08051 119.29573 182.08051 curveto +117.50372 182.08051 115.62639 181.69651 113.66373 180.92851 curveto +111.74373 180.16051 110.78373 179.41385 110.78373 178.68851 curveto +110.78373 178.43251 lineto +119.48773 146.36851 lineto +120.17039 143.97921 120.51172 142.50722 120.51173 141.95251 curveto +120.51172 141.22722 120.27705 140.77922 119.80773 140.60851 curveto +119.38105 140.39522 118.22905 140.26722 116.35173 140.22451 curveto +119.23173 180.60851 moveto +121.40772 180.60851 123.47705 179.84051 125.43973 178.30451 curveto +127.44504 176.76852 129.04504 174.93385 130.23973 172.80051 curveto +131.43437 170.66719 132.37304 168.59786 133.05573 166.59251 curveto +133.78104 164.58719 134.1437 162.9872 134.14373 161.79251 curveto +134.1437 160.08587 133.73837 158.74187 132.92773 157.76051 curveto +132.11704 156.7792 131.02904 156.28854 129.66373 156.28851 curveto +127.74371 156.28854 125.90905 157.20587 124.15973 159.04051 curveto +122.41038 160.83253 120.98105 162.9872 119.87173 165.50451 curveto +118.76239 168.02186 117.88772 170.47519 117.24773 172.86451 curveto +116.60772 175.21118 116.28772 177.06718 116.28773 178.43251 curveto +116.28772 179.88318 117.26905 180.60851 119.23173 180.60851 curveto +fill +grestore +gsave [3.8010801 0 0 3.658223 -475.86267 -552.55121] concat +gsave +0 0 0 setrgbcolor +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +fill +grestore +0 0 0 setrgbcolor +[] 0 setdash +0.80000001 setlinewidth +0 setlinejoin +0 setlinecap +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +stroke +grestore +gsave [3.8010801 0 0 3.658223 -403.59545 -516.51882] concat +gsave +0 0 0 setrgbcolor +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +fill +grestore +0 0 0 setrgbcolor +[] 0 setdash +0.80000001 setlinewidth +0 setlinejoin +0 setlinecap +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +stroke +grestore +gsave [3.8010801 0 0 3.658223 -253.79788 -476.43785] concat +gsave +0 0 0 setrgbcolor +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +fill +grestore +0 0 0 setrgbcolor +[] 0 setdash +0.80000001 setlinewidth +0 setlinejoin +0 setlinecap +newpath +144.12956 193.31984 moveto +144.12956 194.10203 143.49474 194.73684 142.71255 194.73684 curveto +141.93037 194.73684 141.29555 194.10203 141.29555 193.31984 curveto +141.29555 192.53765 141.93037 191.90284 142.71255 191.90284 curveto +143.49474 191.90284 144.12956 192.53765 144.12956 193.31984 curveto +closepath +stroke +grestore +grestore +grestore +showpage +%%EOF diff --git a/3-goldberg/Makefile b/3-goldberg/Makefile new file mode 100644 index 0000000..6330e4c --- /dev/null +++ b/3-goldberg/Makefile @@ -0,0 +1,3 @@ +P=3-goldberg + +include ../Makerules