5. Randomizált algoritmusok 99
6.1. Információs bonyolultság
Rögzítsünk egyΣábécét, és legyen, mint korábban,Σ0= Σ−{∗}. Kényelmes leszΣ0-t a{0,1, . . . , m−1} halmazzal azonosítani. Tekintsünk egyΣfeletti kétszalagos univerzálisT Turing-gépet. Azt mondjuk, hogy egyΣ0 felettiq
111
szó (program) aT gépenkinyomtatjaaz xszót, ha a T gép második szalag-jára q-t írva, az elsőt üresen hagyva, a gép véges sok lépésben megáll úgy, hogy az első szalagján azxszó áll. Mindjárt jegyezzük meg, hogy minden x szó kinyomtatható T-n. Ugyanis van olyan egyszalagos (eléggé triviális)Sx
Turing-gép, mely üres szalaggal indulva nem csinál mást, mint erre azxszót írja. Ez a Turing-gép szimulálhatóT-n egyqxprogrammal, mely ezek szerint x-et nyomatja ki.
Egyx∈Σ∗0 szó (T-re vonatkozó)bonyolultságán a legrövidebb olyan szó (program) hosszát értjük, mely T-n az x szót nyomatja ki. Az x szó T-re vonatkozó bonyolultságátKT(x)-szel jelöljük.
Az x-et kinyomtató programot úgy is tekinthetjük, mint az x szó egy
„kódját”, ahol maga aT Turing-gép a dekódolást végzi. Egy ilyen programot azxszóKolmogorov-kódjának nevezzük. Egyelőre nem teszünk feltevést arra vonatkozóan, hogy ez a dekódolás (vagy a kódolás, azaz a megfelelő program megtalálása) mennyi ideig tarthat.
Azt szeretnénk, ha ez a bonyolultság azx szó egy jellemző tulajdonsága lenne, és minél kevésbé függne a T géptől. Sajnos könnyű olyan univerzális T gépet csinálni, ami nyilvánvalóan „ügyetlen”. Például minden programnak csak minden második jelét használja fel, a közbülső betűkön „átsiklik” : ekkor kétszer olyan bonyolultnak definiál mindenxszót, mint ha ezeket a betűket le se kellene írni.
Megmutatjuk azonban, hogy ha bizonyos – eléggé egyszerű – feltevéseket teszünk a T gépre, akkor már nem lesz lényeges, hogy melyik univerzális Turing-gépet használjuk a bonyolultság definiálására. Durván szólva elég azt feltennünk, hogy mindenT-n végrehajtható számítás bemenetét beadhatjuk a program részeként is. Ennek pontosításaként feltesszük, hogy a & betű eleme az ábécének (pl. & =m−1; itt a jelentése az lesz, hogy innentől az adatok következnek), melyre az áll, hogy
a) minden egyszalagos S Turing-gép szimulálható a T gépen egy olyan programmal, mely az&betűt nem tartalmazza, és
b) ha aT gép első szalagjára semmit, a második szalagjára pedig egy olyan szót írunk, mely az&betűt tartalmazza, tehát ami így írható:x&y, ahol az xszó már nem tartalmazza az&betűt, akkor a gép akkor és csak akkor áll meg, mint hay-t az első szalagra ésx-et a második szalagra írva indítottuk volna el, és megálláskor az első szalagon ugyanaz áll.
Könnyű látni, hogy minden univerzális Turing-gép módosítható úgy, hogy az a) és b) feltevéseknek eleget tegyen. A továbbiakban mindig feltesszük, hogy univerzális Turing-gépünk ilyen tulajdonságú.
6.1.1. Lemma. Létezik olyan (csakT-től függő)cT konstans, hogyKT(x)≤
≤ |x|+cT.
Bizonyítás. T univerzális, tehát az a (triviális) egyszalagos Turing-gép, mely semmit sem csinál (azonnal megáll), szimulálható rajta egyp0 programmal.
Ekkor viszont bármelyx∈Σ∗0szóra, ap0&xprogram azxszót fogja kinyom-tatni aT gépen. ÍgycT =|p0|+ 1megfelel a feltételeknek.
Megjegyzés. Kissé vigyázni kellett, mert nem akartuk megszorítani, hogy milyen jelek fordulhatnak elő azxszóban. Pl. a legtöbb programozási nyel-ven aPRINT "x"utasítás nem jó az olyanxszavak kinyomtatására, melyek tartalmazzák az idézőjelet. Az érdekel bennünket, hogy az x szót az adott ábécébenmennyire lehet tömören kódolni, és így nem engedjük meg az ábécé bővítését. A fentiekben az&betűt csak a programban tiltottuk meg, azaz a T második szalagján az&betű első előfordulása határolja el az adatrészt.
Most bebizonyítunk egy alapvető lemmát, mely azt mutatja, hogy a bo-nyolultság (a fenti feltételek mellett) nem függ nagyon az alapul vett géptől.
6.1.2. Tétel(Invariancia tétel). LegyenT ésS aza)ésb)feltételeknek eleget tevő univerzális Turing-gép. Ekkor van olyancT S konstans, hogy bármely x szóra|KT(x)−KS(x)| ≤cT S.
Bizonyítás. AzS kétszalagos Turing-gép működését szimulálhatjuk egy egy-szalagosS1 Turing-géppel úgy, hogy haS-en valamelyqprogram egyxszót nyomtat ki, akkor S1 szalagjára q-t írva, az is megáll véges sok lépésben, éspedig úgy, hogy a szalagjárax van írva. Továbbmenve, azS1 Turing-gép működését szimulálhatjukT-n egy olyan pS1 programmal, mely az &betűt nem tartalmazza.
Legyen mármost x tetszőleges Σ∗0-beli szó, és legyen qx egy legrövidebb olyan program, melyS-enx-et kinyomtatja. TekintsükT-n apS1&qx progra-mot: ez nyilvánx-et nyomatja ki, és hossza csak|qx|+cT S, aholcT S=|pS1|+1.
Így tehát
KT(x)≤KS(x) +cT S. Az ellenkező irányú egyenlőtlenség hasonlóan adódik.
Ennek a lemmának az alapján most márT-t rögzítettnek tekintjük, és a továbbiakban nem írjuk ki aT indexet. (Igaz, hogy ígyK(x)csak egy additív konstans erejéig van meghatározva, de ez a továbbiakban nem lesz zavaró, állításaink tetszőleges lerögzítettT univerzális gép esetén igazak lesznek).
A következő tétel mutatja, hogy az optimális kód algoritmikusan nem ke-reshető meg.
6.1.3. Tétel. AK(x)függvény nem kiszámítható.
Bizonyítás. A bizonyítás lényege egy klasszikus logikai paradoxon, az ún.
írógép-paradoxon. Ez egyszerűen így fogalmazható: „legyenna legkisebb 100-nál kevesebb jellel nem definiálható szám”. Ezzel éppen most definiáltukn-et 100-nál kevesebb jellel!
Tegyük fel mármost, hogyK(x)kiszámítható. Legyencalkalmasan megvá-lasztandó természetes szám. RendezzükΣ∗0elemeit növekvő sorrendbe. Jelölje x(k) a k-adik szót e szerint a rendezés szerint, és legyenx0 a legelső olyan szó, melyreK(x0)≥c. Feltéve, hogy gépünk Pascal nyelven programozható, tekintsük az alábbi egyszerű programot:
var k: integer;
function x(k: integer) : integer;
...
function Kolm(k: integer) : integer;
... begin
k:=0;
while Kolm(k)<c do k:=k+1;
print x(k);
end.
Ez a program nyilvánx0-t nyomatja ki. A program hosszának a meghatározá-sánál hozzá kell venni azx(k)és Kolm(k)=K(x(k))függvények kiszámítását;
ez azonban összesen is csaklogc+konstans számú jel. Ha c-t elég nagynak vesszük, ez a program c-nél kevesebb jelből áll, és x0-t nyomtatja ki, ami ellentmondás.
A tétel egyszerű alkalmazásaként új bizonyítást nyerünk a megállási prob-léma eldönthetetlenségére. Miért is nem lehet ugyanis K(x)-et a követke-zőképpen kiszámítani? Vegyük sorban a szavakat, és nézzük meg, hogy T második szalagjára ezeket írva, úgy áll-e le, hogy az első szalagraxvan írva.
Tegyük fel, hogy van olyan program, mely egy adott programról eldönti, hogy azt írva a második szalagra,T véges sok lépésben megáll-e. Ekkor azokat a szavakat, melyekkelT „elszáll”, eleve ki tudjuk szűrni, ezekkel nem is próbál-kozunk. A maradék szavak közül a legelsőnek a hossza, mellyelT az xszót kinyomtatja, leszK(x).
Az előző tétel szerint ez az „algoritmus” nem működhet; csak az lehet azonban a baja, hogy nem tudjuk kiszűrni a végtelen ideig futó programokat, vagyis a megállási probléma nem dönthető el.
6.1.1. Feladat. Mutassuk meg, hogy aK(x)függvényt még megközelítőleg sem tudjuk kiszámítani a következő értelemben: Tetszőlegesf kiszámítható függvényre, nem létezhet olyan algoritmus, mely minden xszóhoz egyγ(x) természetes számot számol ki úgy, hogy mindenx-re
K(x)≤γ(x)≤f(K(x)).
6.1.2. Feladat. Bizonyítsuk be, hogy nincs olyan algoritmus, mely minden adottnszámhoz olyannhosszúságúx0-1 sorozatot konstruál, melyreK(x)>
>2 logn.
6.1.3. Feladat. Ha egyf : Σ∗0→Z+ kiszámítható függvényref≤K, akkor f korlátos.
A 6.1.3. tétellel és a 6.1.1. feladattal szembeállíthatóan megmutatjuk, hogy a K(x) bonyolultság majdnem minden x-re igen jól megközelíthető. Ehhez először is pontosítanunk kell, hogy mit értünk „majdnem minden” x-en. Te-gyük fel, hogy a bemenő szavakat véletlenszerűen kapjuk; más szóval, minden x∈Σ∗0 szónak van egyp(x)valószínűsége. Erről tehát annyit tudunk, hogy
p(x)≥0, X
x∈Σ∗0
p(x) = 1.
Ezen felül csak annyit kell feltennünk, hogyp(x) algoritmikusan kiszámítha-tó.Egy ilyen tulajdonságúpfüggvénytkiszámítható valószínűségeloszlásnak nevezünk. Egyszerű példát ad ilyen valószínűségeloszlásra ap(xk) = 2−k, ahol xk a növekvő rendezés szerintik-adik szó; vagy ap(x) = (m+ 1)−|x|−1. 6.1.4. Tétel. Minden kiszámíthatópvalószínűségeloszláshoz van olyan algo-ritmus, amely mindenxszóhoz kiszámítja azxegy f(x)Kolmogorov-kódját, és erre a kódra|f(x)|−K(x)várható értéke véges.
Bizonyítás. Legyenx1, x2, . . . ,aΣ∗0-beli szavaknak az a sorbarendezése, mely-rep(x1)≥p(x2)≥. . ., és az azonos valószínűségű szavak mondjuk lexikogra-fikusan növekvő sorrendben vannak.
6.1.5. Állítás. Azi indexhez azxi szó algoritmikusan kiszámítható.
Az állítás bizonyítása. Legyeneky1, y2, . . . a szavak lexikografikusan növek-vően rendezve. Rögzített i mellett legyen k rendrei, i+ 1, . . .; adott k-hoz számítsuk ki a p(y1), . . . , p(yk) számokat és legyenπk ezek közül az i-edik legnagyobb. Nyilvánπi≤πi+1≤. . .≤p(xi). Továbbá, ha
(∗) p(y1) +. . .+p(yk)≥1−πk,
akkor a további szavak közöttπk-nál nagyobb valószínűségű már nem lehet, ígyπk=p(xi)ésxi az első olyanyj szó(1≤j≤k), melyrep(yj) =πk.
Így sorra véve a k=i, i+ 1, . . . értékeket, megállhatunk, ha (∗) teljesül.
Mivel (∗) bal oldala 1-hez tart, a jobb oldal pedig monoton nemnövekvő, ez előbb-utóbb bekövetkezik. Ezzel az állítást bebizonyítottuk.
Visszatérve a tétel bizonyítására, az állításban szereplő algoritmus prog-ramja azi számmal együtt az xi szó egy f(xi) Kolmogorov-kódját szolgál-tatja. Megmutatjuk, hogy ez a kód kielégíti a tétel követelményeit.
Nyilván|f(x)| ≥K(x). Továbbá|f(x)|−K(x)várható értéke hiszenf(xi)egy speciális Kolmogorov-kód, tehát a várható érték nem negatív.
Tekintsük a fenti összeg első tagját:
X∞
A második tagban az összeget növeljük, ha aK(xi) számokat növekvő sor-rendbe rendezzük át (mivel a p(xi) együtthatók csökkennek). Legyen zi a szavak egy ilyen rendezése, tehát aholK(z1)≤K(z2)≤. . .. Ekkor a
A Kolmogorov-kód, ha szigorúan vesszük, kihasznál aΣ0ábécén kívül is egy jelet: a programszalag olvasásakor a program végét arról ismeri fel, hogy a
„∗” jelet olvassa. Módosíthatjuk a fogalmat úgy, hogy ez ne legyen lehetséges:
a programot olvasó fejnek nem szabad túlszaladnia a programon.
Egy olyan szót, melyet a kétszalagos univerzálisTTuring-gépünk program-szalagjára írva, a fej soha nem is próbál a programon kívüli mezőt olvasni, ön-korlátozónak nevezünk. A legrövidebbx-et kinyomtató önkorlátozó program hosszátHT(x)-szel jelöljük. Ezt a módosított információs bonyolultságfogal-matLevinésChaitinvezették be. Könnyű belátni, hogy az Invariancia-tétel most is érvényes, és ezért ismét elég az index nélküliH(x)jelölést használni.
A K ésH függvények nem térnek el nagyon, ahogy azt a következő lemma mutatja. Emlékezzünk rá, hogym=|Σ0|.