. 1—I CN . i—i í-i Pre Ursa Kirchgrabera Burkharda Moniena Adama Okrúhlicu Péťu a Petra Rossmanithových Georga Schnitgera Ericha Valkemu Klausa a Petra Widmayerových a všetkých, ktorých nadchol výskum Veda je vo svojej podstate nedeliteľným celkom. Jej rozdelenie na jednotlivé oblasti nevyplýva z jej podstaty, ale je skôr dané hranicami ľudských schopností v procese poznania. Max Planck O} O o CN Predslov Táto knižka je zhmotnením cyklu prednášok „Sedem divov informatiky", ktorú sme v zimnom semestri 2005/06 ponúkli širokej verejnosti. Mnohí ľudia spájajú informatiku len s počítačom a schopnosťou s ním zaobchádzať. Hľadanie informácií na internete, spracovávanie textov a obrázkov patria k základným témam kurzov pre počítačový vodičský preukaz a vo viacerých krajinách sa ich výučba nesprávne považovuje za vyučovanie informatiky. Pritom schopnosť používať rôzne softvérové systémy má s informatikou spoločné asi toľko, ako šoférovanie auta so strojárstvom. Ak vodiča motorového vozidla nepokladáme automaticky za strojného inžiniera, nemôžeme ani používateľov počítačov pasovať za informatikov. Pôvodným cieľom tohto prednáškového cyklu bolo nahradiť naivné predstavy o informatike obrazom vedeckej disciplíny, ktorá na jednej strane skúma podobne ako matematika a prírodné vedy zákony fungovania tohto sveta, a tým prispieva k budovaniu všeobecného poznania a na druhej strane využíva získané poznatky k tvorbe rozličných produktov, využitím inžinierskych metód. Aj keď zmena chápania informatiky, najmä v oblasti vzdelávania, ostala pre mňa dôležitá a hodná úsilia, počas prípravy prednáškového cyklu sa moje priority menili a moja pozornosť sa upriamovala stále viac aj na ďalšie ciele. Vznik a vývin informatiky som chcel vyrozprávať ako pútavý príbeh. Nie ako príbeh nejakej izolovanej vedy, ale ako vednej disciplíny nerozlučiteľne spätej s inými vednými odbormi, ktorá čerpá z poznatkov a objavov iných vedných VIII PREDSLOV oblastí a zároveň tieto obohacuje vlastnými výsledkami. Som presvedčený, že poznanie informatiky nám pomáha lepšie poznať štruktúru vied vo všeobecnosti a pochopiť dynamiku výskumu. V tejto súvislosti bolo pre mňa dôležité poslucháčom ukázať, že pre úspech výskumu sú podstatné nielen na verejnosti známe objavy a vedecké výsledky, ale že mierou vedeckého pokroku je aj vývoj odborného jazyka a s ním spojená pojmotvorba. V úsilí o to som si uvedomil, že ma neuspokojujú typické prednášky pre verejnosť, ktoré sa snažia sprostredkovať význam a dôležitosť vedeckých výsledkov. Zvolil som si cestu objavov s poslucháčmi, ktorá by ich naučila kráčať samostatne a umožnila im zažiť nadšenie objaviteľov. Nestačí na to len nájsť jednoduchú a názornú reprezentáciu zložitých objektov a vzťahov. Treba pridať ďalší krok a oslobodiť poslucháča z jeho pasívnej úlohy. Preto táto knižka obsahuje aj úlohy pre čitateľa. Úlohy sú v knihe umiestnené tam, kde je aj naj zmysluplnejšie ich riešiť. Úsilie ich vyriešiť preverí a upevní správne chápanie predchádzajúcich vysvetlení, alebo sú výzvou čitateľa skúsiť znovuob-javiť vlastnými silami pôvodné výsledky výskumu. Vybrané témy nie sú len míľnikmi vývoja informatiky. Sú aj skutočnými „divmi" v tom zmysle, že výskumné cesty k nim sú plné neočakávaných zvratov a prekvapujúcich poznatkov, ktoré na prvý pohľad vyzerajú neuveriteľne. Vybrané témy nám umožňujú upútavať poslucháča alebo čitateľa. Vašou úlohou je posúdiť, nakoľko sa to autorovi tejto knižky podarilo. Želám vám veľa zábavy a vzrušujúci čitateľský zážitok. Zúrich, August 2006. Váš Juraj Hromkovič Obsah 1 Stručné dejiny informatiky, alebo prečo nie je informatika len vodičským preukazom na riadenie počítača. 1 1.1 Čo sa tu dozvieme?........................ 1 1.2 Základné kamene vied ...................... 2 1.3 Koniec jednej eufórie..................... 16 1.4 História informatiky........... ■C'i''^ 1.5 Zhrnutie.................(£y■......... 28 2 Algoritmika, alebo čo má spoločné programovanie a pečenie koláča? 31 2.1 Čo sa tu dozvieme? . . . ./V................... 31 2.2 Algoritmické pečenie . . Í/S^^ 2.3 A ako je to s algoritmami pre počítač?............. 38 2.4 Neúmyselná nekonečná činnosť.................. 52 2.5 Zhrnutie.....ľy....................... 58 3 Nie je nekonečno ako nekonečno, alebo prečo je nekonečno v informatike nekonečne dôležité? 63 3.1 Prečo potrebujeme nekonečno?.................. 63 3.2 Kantorova metóda . . *fy.................... 67 3.3 Rôzne veľké nekonečná...................... 93 3.4 Zhrnutie .... £>V....................... 99 4 Vypočítateľnosť, alebo prečo existujú úlohy, ktoré sa nedajú vyriešiť na programovateľnom počítači 105 4.1 Ciele................................105 4.2 Koľko rôznych programov možno napísať?...........106 4.3 ÁNO alebo NIE, to je otázka ..................111 4.4 Metóda redukcie .........................118 4.5 Zhrnutie..............................136 OBSAH Teória zložitosti, alebo čo môžeme robiť, keď na výpočet nestačí energia celého vesmíru? 141 5.1 Úvod do teórie zložitosti.....................141 5.2 Ako meriame zložitosť výpočtov?................143 5.3 Zložitosť algoritmov........................147 5.4 Hranice praktickej riešiteľnosti..................151 5.5 Ako rozoznáme ťažký problém?.................154 5.6 Pomoc, mám ťažký problém.....................164 5.7 Zhrnutie..............................168 Náhoda a jej úloha v prírode, alebo náhoda ako zdroj efektívnosti v algoritmike 173 6.1 Vytýčenie cieľa..........................173 6.2 Existuje ozajstná náhoda?....................175 6.3 Mnoho svedkov pomôže .....................179 6.4 Zvýšenie miery istoty.......>^V^ 6.5 Co sme objavili? ........*/\S"^ Kryptografia, alebo ako spraviť zo slabiny prednosť 203 7.1 Magická veda súčasnosti.....................203 7.2 Prehistória kryptológie......................205 7.3 Kedy je kryptosystém bezpečný? ................208 7.4 Symetrické kryptosystémy....................211 7.5 Dohodnutie sa na spoločnom kľúči ...............214 7.6 Kryptosystémy s verejnými kľúčmi...............220 7.7 Míľniky v kryptografii . . Qj..................229 Počítanie s DNA molekulami, alebo biopočítačová technológia na obzore 233 8.1 Ako to bolo doteraz........................233 8.2 Ako zmeníme laboratórium na biopočítač............237 8.3 Adlemanov experiment......................242 8.4 Silné a slabé stránky DNA počítača...............249 Kvantový počítač, alebo počítanie v zázračnom svete mikročástic 251 9.1 Prehistória a vytýčenie cieľa...................251 9.2 Čarovný svet kvantovej mechaniky ...............253 9.3 Ako počítame vo svete častíc?..................259 9.4 Co prinesie budúcnosť?......................268 OBSAH XI 10 Ako sa správne rozhodovať pre neznámu budúcnosť, alebo ako prekabátiť prefíkaného protivníka 273 10.1 Aké objavy nás tu očakávajú?..................273 10.2 Meranie kvality online algoritmov................275 10.3 Randomizovaný online algoritmus................284 10.4 Zhrnutie..............................300 11 Algoritmická optimalizácia vo fyzike, alebo ako by mohla liečiť homeopatia? 303 11.1 Dôveryhodnosť vedeckých teórií.................303 11.2 Optimalizácia kryštalickej štruktúry...............306 11.3 Optimalizácia v informatike...................308 11.4 Liečenie ako algoritmická optimalizácia.............312 1. Doslov 319 2. Doslov Literatúra 325 328 Ir J 6 J DC o o CN bJO Žijúc v nepretržitom nadšení so záujmom o všetko nedosiahnuteľné rastie človek tým, že ide neustále vpred. Zmysel života je v tvorbe a tvorba je nekonečná. Maxim Gorkij Kapitola 1 Stručné dejiny informatiky, alebo prečo nie je informatika len vodičským preukazom na riadenie počítača. 1.1 Čo sa tu dozvieme? Cieľ tejto prednášky sa podstatne odlišuje od cieľov nasledujúcich prednášok, ktoré sa vždy venujú jednej špeciálnej téme. V tejto kapitole chceme v populárno-vedeckom jazyku porozprávať príbeh vzniku informatiky ako samostatnej vedeckej disciplíny. Pritom spoznáme nielen základné stavebné kamene informatiky, ale pochopíme do istej miery aj všeobecný proces budovania vedy. Vzhľadom na to, že predstavíme informatiku v kontexte celej vedy, oboznámime sa nielen s niektorými kľúčovými cieľmi základného výskumu v informatike, ale pochopíme aj jej tesnú spätosť najmä s matematikou, ako i s ostatnými vednými disciplínami. Záverečnú časť kapitoly využijeme na stručné predstavenie obsahu nasledujúcich kapitol v kontexte historického vývoja informatiky. 2 KAPITOLA 1 1.2 Stojí budova vedy na vratkých základoch? Ak vnímame vedu len ako sumu objavov a vedeckých faktov, dostávame veľmi skreslenú predstavu o vede. Ešte väčšej chyby sa dopustíme, ak vnímame vedné disciplíny len cez ich aplikácie v každodennom živote. Ako by asi vyzerala definícia fyziky, keď je skoro všetko, čo ľudia vytvorili (od domov po stroje až k počítačom), postavené na využití fyzikálnych zákonov? Napriek tomu nepokladáme výrobcov televízorov a počítačov za fyzikov a v žiadnom prípade nepasujeme každého, kto vie ovládať televízor a používať počítač, za fyzika. V tomto prípade jasne odlišujeme generovanie poznatkov vo fyzike od ich aplikácií v strojárstve a elektrotechnike. Schopnosť ovládať prístroje s výnimkou počítača nezvykneme spájať so žiadnou vedeckou činnosťou. Prečo potom mnohí z nás spájajú s informatikou schopnosť pracovať na počítači a používať rôzne softvérové produkty? Akú hodnotu pre všeobecné vzdelanie má schopnosť používať rôzne softvérové systémy (napríklad Word pre spracovanie textov, alebo systémy pre spracovanie obrázkov), keď sa tieto dynamicky zásadne menia v priebehu niekoľko málo rokov? Je relatívna zložitosť počítača v porovnaní s inými prístrojmi jediným dôvodom pre toto nedorozumenie? Isteže, používanie osobných počítačov je tak rozšírené, že počet vodičov motorových vozidiel je približne rovnaký, ako počet užívateľov výpočtovej techniky. No vyučujeme v škole špeciálny predmet vedenie motorových vozidiel? Čoskoro budú z mobilných telefónov malé vysoko výkonné počítače. Stane sa čoskoro používanie mobilov novým predmetom v našich školách? Tieto otázky chcú poukázať na nezmyselnosť zavádzania predmetu informatiky na školách s jediným cieľom naučiť sa používať výpočtovú techniku. Súčasná prax vo viacerých krajinách nám ukazuje, že tieto schopnosti možno nadobudnúť integrovane v ostatných predmetoch a vzhľadom na ich veľmi nízku všeobecnopoznávaciu hodnotu, nemá ich výučba v rámci samostatného predmetu žiadnu dlhodobú perspektívu. Ak teda uvažujeme o vyučovaní informatiky, kľúčovou otázkou pre nás je: „Čo je to informatika?" Určite pod informatikou nerozumieme schopnosť používať počítač. Ináč by sme sa čoskoro všetci stali informatikmi. Problémy s nejasnými predstavami o tom, čo informatika je a čo nie je, súvisia aj s tým, že informatiku nemôžeme v rámci klasifikácie vied jednoznačne priradiť, ani k matematike ako metavede, ani k prírodným vedám a ani k technickým vedám. Situácia s informatikou je podobná, ako keby fyzika, strojárstvo a elektrotechnika boli zlúčené pod jedným názvom v jednom vedeckom odbore. Vo vývoji soft veru môžeme informatiku považovať za aplikovanú technickú 1.2 ZÁKLADNÉ KAMENE VIED 3 vedu so všetkými znakmi inžinierskych disciplín, ako je vývoj a produkcia zložitých systémov a produktov. Základy informatiky sú ale matematicko-prírodovednej povahy a teoretická informatika hrá pre vývoj softvéru podobnú úlohu, ako teoretická fyzika pre technické disciplíny. Kľúčovou príčinou skreslených predstáv o informatike je práve skutočnosť, že základný výskum1 v informatike je širokej verejnosti prakticky neznámy. Preto v tejto sérii prednášok venujeme pozornosť hlavne teoretickým základom informatiky. Uvedomili sme si, teda, že cesta k pochopeniu informatiky nevedie cez štúdium jej aplikácií. Na začiatku sme upozornili aj na to, že veda nie je len súbor vedeckých výsledkov. Preto sú pre nás klúčové odpovede na nasledovné otázky: „Ako vznikajú vedné disciplíny? „Čo sú základné kamene vedy?" Každý vedný odbor má svoj vlastný jazyk, ktorý je postavený na špeciálnych odborných pojmoch (termínoch). Bez pojmovslovia by nebolo vôbec možné formulovať výroky o objektoch výskumu. Pojmotvorba, ako proces určenia významu odborných slov, je kľúčová pre všetky vedy. Definovanie dôležitých základných pojmov tak, aby boli presne a jednoznačne interpretovateľné, stálo vedcov zvyčajne oveľa viac námahy, ako objavenie mnohých všeobecne známych poznatkov. Uveďme niekoľko príkladov. Matematikom trvalo 300 rokov, než sa „dohodli" na formálne presnej definícii pojmu pravdepodobnosť. Vedci potrebovali vyše 2 000 rokov než sa im podarilo nájsť zmysluplnú definíciu pojmu nekonečna2. Vo fyzike i v hovorovej reči používame často pojem „energia". Ani vtáčik letáčik nechyruje čo to je, nieto my. Na celé dejiny fyziky sa môžeme pozerať ako na neukončený príbeh vývoja našich predstáv o tom, čo je to energia. Teraz sa môže niekto prihlásiť a povedať: „Milý pán Hromkovič, čo je veľa, to je veľa. Ja viem, čo je energia. Učil som sa to predsa v škole." V tom prípade ale položím nasledujúcu otázku: „Myslíte grécku definíciu energie ako pôsobiacej sily alebo stredoškolskú definíciu energie ako schopnosť fyzikálneho systému vykonávať prácu? Ak chcete tieto definície používať, tak mi povedzte najprv, čo je sila, alebo čo je práca." A keď sa o to pokúsite, zistíte, že sa pohybujete v začarovanom kruhu, pretože k definícii pojmov sila a práca používate pojem energia. 1 skúma zákony spracovania informácií a ukazuje hranice toho, čo sa dá automatizovať (vypočítať na počítači) 2Túto históriu priblížime v tretej kapitole. 4 KAPITOLA 1 Podobne je to i s pojmom života v biológii. Presná definícia tohto pojmu by nám umožnila jednoznačne rozlišovať medzi živou a neživou hmotou. Žiaľ, takúto definíciu na fyzikálno-chemickej úrovni zatiaľ postrádame. Milí čitatelia! V žiadnom prípade vás nechcem zneistiť týmito úvahami. Nie je katastrofou, že nedokážeme presne špecifikovať niektoré používané pojmy. Vo vede pracujeme často s definíciami, ktoré používané pojmy špecifikujú len nepresne, alebo len približne a do istej miery. Patrí to k normálnemu životu výskumníkov. Vedci len musia vedieť, že pri interpretácii výsledkov výskumu nie je možné dosiahnuť vyššiu presnosť, ako je presnosť definícií používaných pojmov. Napredovanie v pojmotvorbe je často hlavnou mierou miery vývinu jednotlivých vedných disciplín. Pekným príkladom pokroku je niekoľkotisícročný vývin nášho chápania pojmu hmoty. Na pochopenie toho, čo to znamená a ako je ťažké definovať nejaký pojem, uvedieme nasledovný príklad. Uvažujeme slovo „stolička". Stolička nie je žiaden abstraktný vedecký objekt. Je to bežný úžitkový predmet a väčšina z nás verí, že vie, čo je stolička. Pokúste sa teda, tento pojem zadefinovať pomocou nejakého opisu. Definovať pojem znamená tak presne opísať uvažovaný objekt, že každý, aj keď ešte nikdy tento objekt (stoličku) nevidel, vie na základe tohto opisu jednoznačne rozhodnúť o každom predmete, či je stoličkou. V definícii smú byť použité len slová, ktorých význam už bol predtým definovaný. Pri pokuse definovať pojem stolička môžeme predpokladať, že každý už vie, čo je „noha" stoličky. V tomto prípade by sme mohli skúsiť začať s tým, že stolička má 4 nohy. Ale počkať, počkať! Má stolička, na ktorej práve sedíte štyri nohy? Nemá náhodou len jednu nohu a k tomu ešte trocha zvláštnu? Radšej to nechajme tak. Mojim cieľom vás nie je potrápiť. Ide len o to, aby sme pochopili, že pojmotvorba je nielen kľúčová, ale i veľmi náročná činnosť. Teraz už vieme, že pojmotvorba je kľúčovou úlohou vo vede. Aj samotný vznik informatiky spájame s tvorbou nového pojmu, a to pojmu „algoritmus". Ale skôr ako sa začneme zaoberať dejinami informatiky, potrebujeme pochopiť, čo sú to axiómy vo vede. Axiómy sú základné stavebné kamene vedy. Môžu to byť fakty alebo definície pojmov, o ktorých pravdivosti a korektnosti nemáme žiadne pochybnosti, napriek tomu, že sa nedá dokázať ich korektnosť. Na prvé počutie to môže znieť nielen zvláštne, ale dokonca i podozrivo. 1.2 ZÁKLADNÉ KAMENE VIED 5 Chceme takto spochybniť spoľahlivosť vedeckých výsledkov a výrokov? Skúsme túto problematiku najprv objasniť na konkrétnom príklade. Príklad axiómy je, že rozmýšľame správne, takže je nepochybné spoľahlivý aj spôsob našej argumentácie. Môžeme dokázať, že rozmýšľame správne? Ako? Pomocou argumentácie, ktorá stavia na našom spôsobe myslenia? To je nemožné. Neostáva nám teda nič iné, ako dôverovať nášmu spôsobu myslenia. V prípade, že táto axióma nezodpovedá skutočnosti (nie je správna), máme smolu a celá budova vedy sa zrúti, keď z nej odstránime tento základný stavebný kameň. Táto axióma nie je len filozofická. Má aj svoju matematickú podobu a pretože matematika je formálnym jazykom vedy, nezaobídeme sa bez nej. Presnejšie teda vysvetlime, čo znamená naša viera v túto axiómu a ako používame túto axiómu na definovanie korektnej argumentácie nielen v matematike. Kľúčovým bude pre nás pojem implikácie alebo dôsledku. Ak je nejaká skutočnosť B dôsledkom nejakej inej skutočnosti A, tak musí platiť: Ak A je pravdivá (A platí), tak je pravdivá aj skutočnosť B (B platí) Inými slovami, nepravda nemôže byť dôsledkom pravdy Pre skutočnosť, že i? je dôsledkom A používame v matematike označenie A B Hovoríme tiež, že „A implikuje B". V tejto terminológii hovorí naša axióma toto: Ak ^e> A =>- B a A platia, tak platí aj B. Treba upozorniť, že je prípustné, aby nepravda implikovala pravdu. No neprípustné je, aby dôsledkom pravdy bola nepravda. 6 KAPITOLA 1 Na lepšie porozumenie pojmu implikácia a správnej argumentácie uvedieme nasledujúci príklad. Príklad 1.1 Uvažujme dve tvrdenia A a B. Tvrdenie A je „Pršŕ tvrdenie B je „Lúka je mokrá11. Predpokladajme, že naša lúka je pod holým nebom (teda nieje zakrytá, alebo zastrešená). Za týchto okolností môžeme akceptovať, že nasledujúce tvrdenie „Keďprší, tak je lúka mokrá1, a teda tvrdenie je pravdivé. Podľa našej interpretácie odborných termínov „dôsledok" a „implikácia", musí byť lúka mokrá (musí B platiť), ak prší (ak platí A). Pozrime sa na to ešte detailnejšie. \ „A platí" znamená „Prší". „A neplatí" znamená „Neprší". „B platí" znamená „Lúka je mokrá". „B neplatí" znamená „Lúka je suchá". Vzhľadom na platnosť, či neplatnosť tvrdení A a B, existujú 4 nasledovné možnosti (situácie): S±,S2, S3 a S4. Si. Prší a lúka je mokrá. Prší a lúka je suchá. Neprší a lúka je mokrá. 54: Neprší a lúka je suchá. Tieto situácie zvykneme opísať pomocou takzvanej pravdivostnej tabuľky (obr. 1.1). a A B 51 52 53 S4. platí platí neplatí neplatí A platí neplatí platí neplatí B obr. 1.1: Pravdivostná tabuľka 1.2 ZÁKLADNÉ KAMENE VIED 7 Matematici obľubujú zapisovať všetko čo najkratšie a žiaľ sú pritom ochotní aj riskovať, že sa zníži zrozumiteľnosť ich textov pre nematematikov. Matematici označujú platnosť alebo pravdivosť symbolom „1" a nepravdivosť (neplatnosť) symbolom „0". Pri tomto označení vyzerá naša pravdivostná tabuľka nasledujúco (obr. 1.2). A B Si 1 1 1 0 s3 0 1 1S4 0 0 obr. 1.2: Pravdivostná tabuľka v skrátenej forme. Je dôležité všimnúť si, že platnosť tvrdenia A =>- B vylučuje len možnosť situácie S2 v druhom riadku (A platí a B neplatí) tabuľky. Prvý riadok zodpovedá situácii S±, v ktorej obe tvrdenia A a B platia. To znamená, že prší a lúka je mokrá. Táto situácia zrejme zodpovedá implikácii A =>- B, a tým aj našemu očakávaniu. Tým môžeme uzavrieť, že situácia Si je pri platnosti implikácia A =>- B možná (obr. 1.3). Druhý riadok tabuľky „A platí" a „B neplatí" zodpovedá situácii S2, keď prší a lúka je suchá. Táto situácia nie je možná, pretože odporuje platnosti tvrdenia A =>- B. Implikáciu „A =>• Bu chápeme tak, že z pravdivosti (platnosti) A, nevyhnutne vyplýva pravdivosť (platnosť) tvrdenia B. Preto v tabuľke na obr. 1.3 označíme situáciu S2 ako vylúčenú (nemožnú). Tretí riadok opisuje situáciu S3, keď neprší (A neplatí) a lúka je mokrá (B platí). Táto situácia môže nastať a neodporuje implikácii A =>- B. Lúka môže byť mokrá aj keď neprší. Mohlo pršať predtým, niekto mohol lúku popolievať, alebo po studenej noci s jasnou oblohou je lúka mokrá z rannej rosy. Z formálneho logického hľadiska implikácia A =>- B hovorí, čo musí platiť, keď platí A. Ak A neplatí, nekladie implikácia A =>- B žiadne požiadavky, a preto je v prípade neplatnosti tvrdenia A všetko možné. Posledný riadok (obe A a B neplatia) zodpovedá situácii, keď neprší (A neplatí) a lúka je suchá (B neplatí). Táto situácia môže nastať a podobne ako S3 nie je v konflikte s platnosťou implikácie A =>- B. Na koniec si zopakujeme poučenie z tohto príkladu. Keď platí implikácia A=> B a platí tiež tvrdenie A („prší"), tak musí platiť aj B („lúka je mokrá"). Ak A neplatí („neprší"), nevyjadruje implikácia „A =>- Bu žiadne požiadavky 8 KAPITOLA 1 na B, a teda sú možné obe situácie S3 (B platí) a S4 (B neplatí)(obr. 1.3). □ Jediná vylúčená (nemožná) situácia pri platnosti implikácie A =>- B je situácia S2 „A platí a B neplatí". Ak nám teda niekto dá pravdivostnú tabuľku pre dve tvrdenia A a B a označí, ktoré situácie sú možné, a ktoré nemožné a jediná vylúčená situácia je „A platí a B neplatí", tak vieme, že platí implikácia A =>- B. Z matematického pohľadu je pravdivostná tabuľka (obr. 1.3) definícia implikácie. Vo všeobecnosti existuje jednoduché pravidlo na overenie platnosti implikácie A B. A B A=> B platí platí možná (platí) platí neplatí vylúčená (neplatí) neplatí platí možná (platí) neplatí neplatí možná (platí) obr. 1.3: Definícia implikácie Keď vo všetkých možných situáciách, v ktorých A platí, platí aj B, tak platí ajA^B Úloha 1.1 Uvažujme nasledovné výpovede A a B. A znamená „Je zima" a B znamená „Hnedé medvede spia". Implikácia A=> B znamená „Keď je zima, tak hnedé medvede spia." Predpokladajme, že platí implikácia A => B. Vytvorte pravdivostnú tabuľku vzhľadom na platnosť A a B a vysvetlite, ktoré situácie sú možné, a ktoré sú vylúčené. Teraz sme pochopili význam pojmu implikácie a môžeme sa pýtať: Čo má implikácia spoločné s korektnou argumentáciou? Prečo je tento pojem kľúčom ku korektnej argumentácii (dokazovaniu)? Pojem implikácia používame k zostavovaniu takzvanej priamej argumentácie (priamych dôkazov) a nepriamej argumentácie (nepriamych dôkazov). Aby sme boli vo zvyšnej časti knihy schopní korektne argumentovať, predstavíme obidve tieto základné metódy dokazovania. 1.2 ZÁKLADNÉ KAMENE VIED 9 Uvažujme znova naše výpovede A („Prší") a B („Lúka je mokrá") z príkladu 1.1. Pridajme k nim ešte tretiu výpoveď C („Salamandry sa tešia"). Predpokladajme, že platí implikácia A =>- B a tiež implikácia B =>- C („Keďje lúka mokrá, salamandry sa tešia"). Čo je dôsledkom platnosti A =>- B a B =>- C? Napíšme si pravdivostnú tabuľku všetkých možných situácií pre platnosť a neplatnosť troch tvrdení A, B a C (obr. 1.4). A B c A=> B B^c Si platí platí platí s2 platí platí neplatí vylúčené S3 platí neplatí platí vylúčené 1S4 platí neplatí neplatí vylúčené s5 neplatí platí platí Sq neplatí platí neplatí vylúčené s7 neplatí neplatí platí > Ss neplatí neplatí neplatí obr. 1.4: Pravdivostná tabuľka pre A =>• B, B =>• c Ak A =>- B platí, sú situácie S3 a S4 vylúčené. Podobne vylučuje platnosť implikácie B =>- c situácie S2 a Sq, v ktorých B platí a c neplatí. Pozrime sa na túto tabuľku len z pohľadu tvrdení A a C. Vidíme, že len nasledovné situácie sú možné: (i) obe A a C platia (Si), (h) obe A a C neplatia (Ss), (iii) A neplatí a C platí (S5,S7). Situácie S2 a S4, v ktorých A platí a C neplatí, sú vďaka platnosti A =>- B a B =>- C vylúčené. Takto dostávame platnosť implikácie A =>- C („Keďprší, salamandry sa tešialí) To zodpovedá nášmu očakávaniu. Keď prší, musí byť lúka mokrá (A => B). Keď je lúka mokrá, musia sa salamandry tešiť (B C). V konečnom dôsledku spôsobuje dážď, vďaka mokrej lúke, radosť salamandier. Úvahu Keď A =>■ B a B =>■ C platia, tak platí ajA^C 10 KAPITOLA 1 nazývame priamy dôkaz. Priame dôkazy môžeme zostaviť z ľubovoľného počtu implikácií. Napríklad platnosť implikácií A1 A2, A2 A3, A3=>A4,..., Ak_! Ak nám dovoľuje postulovať platnosť implikácie Priame dôkazy (priame argumentácie) sú teda jednoducho postupnosťami korektných implikácií. Pri výučbe matematiky v školách realizujeme množstvo priamych dôkazov platnosti rôznych matematických viet. Žiaľ učitelia matematiky nezvyknú upozorňovať žiakov na túto skutočnosť, a preto teraz ukážeme jeden malý príklad z vyučovania matematiky. Príklad 1.2 Uvažujme lineárnu rovnicu 3x — 8 = 4 o jednej neznámej x. Našou úlohou je dokázať, že jediné riešenie rovnice 3x — 8 = 4 je x = 4. Vyjadrenie inými slovami: Chceme ukázať, že platí implikácia „Keď 3x — 8 = 4, potom x = 4." Označme tvrdenie „3x — 8 = 4" symbolom A a tvrdenie „x = 4" symbolom Z. Aby sme dokázali A =>- Z, potrebujeme postupnosť implikácií, ktorá začína s A a končí so Z a o ktorých platnosti nemáme žiadne pochybnosti. Vieme, že rovnosť ostane zachovaná, keď k obom stranám rovnice pripočítame, alebo odpočítame to isté číslo. Pripočítajme k obom stranám rovnice 3x — 8 = 4 číslo 8. Takto dostaneme a teda Označme tvrdenie 3x = 12 symbolom B. Práve sme zdôvodnili platnosť implikácie „A =>• Bu („Ak platí 3x — 8 = 4, potom platí aj 3x = 12"). Takto sme získali prvú implikáciu pre našu priamu argumentáciu. Ďalej vieme, že rovnosť ostane zachovaná v prípade, keď vydělíme (alebo vynásobíme) obe strany rovnice tým istým kladným číslom. Vydeľme obe strany rovnice 3x = 12 číslom 3. Dostávame 3x _ 12 T ~ ~3 1.2 ZÁKLADNÉ KAMENE VIED 11 a teda x = 4. Dokázali sme platnosť implikácie B =>- Z („Ak platí 3x = 12, potom platí x = 4"). Platnosť implikácií A ^ B a B ^ Z nám umožňuje tvrdiť, že platí implikácia A =>- Z. Takže, „ak platí 3x — 8 = 4, potom x = 4". Ľahko si overíme, že x = 4 spĺňa rovnicu. Môžeme usúdiť, že jediným riešením rovnice 3x — 8 = 4 je x = 4. □ Úloha 1.2 Pomocou priamej argumentácie ukážte, že x = 1 je jediné riešenie rovnice 7 x — 3 = 2x + 2. Úloha 1.3 Uvažujme pravdivostnú tabuľku pre tri tvrdenia A, B, C, zobrazenú na obr. 1.5. Vidíme, že možné sú len tri situácie 5*1, 5*2 a 5*8, všetky ostatné sú A B C Si 1 1 1 s2 1 1 0 S3 1 0 1 vylúčené 1S4 1 0 0 vylúčené s5 0 1 1 vylúčené Sq 0 1 0 vylúčené s7 0 0 1 vylúčené Ss 0 0 0 obr. 1.5: Pravdivostná tabuľka A, B a C z úlohy 1.3 z nejakých dôvodov vylúčené. Ktoré implikácie platia? Napríklad C => A platí, pretože, ak v jednej z možných situácií platí C, tak platí aj A. Ktoré ďalšie implikácie ešte platia? Väčšina ľudí je schopná bez ťažkostí porozumieť priamej argumentácii a úspešne ju uplatňovať. Nepriama argumentácia sa nepovažuje za až tak dobre zrozumiteľnú. Zodpovedanie otázky, či je nepriama argumentácia naozaj o toľko zložitejšia ako priama, alebo či problémy s nepriamou argumentáciou sú aj dôsledkami nedostatočných didaktických prístupov v škole, prenechávame na čitateľa. Vzhľadom na to, že nepriamu argumentáciu budeme potrebovať v kapitolách 3 a 4 k objaveniu niektorých principiálnych poznatkov informatiky, vysvetlíme ju detailne na základnej úrovni, na ktorej možno najspoľahlivejšie dospieť k jej správnemu pochopeniu. 12 KAPITOLA 1 o o CN Použijeme opäť náš príklad. Tvrdenie A hovorí („Prší"), B („Lúka je mokrá") a C („Salamandry sa tešia"). Pre každé tvrdenie D označíme symbolom D jeho pravý opak. Teda A znamená „Neprší", B znamená „Lúka je suchá" a C znamená „Salamandry sa netešia". Pravý opak znamená, že keď platí D, tak neplatí D, a keď platí D, tak neplatí D. Predpokladajme teraz, že platia implikácie A =>- B a B =>- C. Biológovia zistili, že „salamandry sa netešia", teda, že platí C. Môžeme z toho urobiť nejaký záver? Keď sa salamandry netešia, nemôže byť lúka mokrá, lebo implikácia B =>- C zaručuje radosť salamandier keď je lúka mokrá. Takto vieme s istotou, že platí B („lúka je suchá"). Platnosť implikácie A B a tvrdenia B nám teraz zaručuje, že neprší, lebo inak by lúka musela byť mokrá. Takže dostávame, že platí A. Záverečné pozorovanie je, že z platnosti A^ B, B ^ C aC vyplýva platnosť tvrdení 5al \0 Predchádzajúcu úvahu môžeme podporiť formálnou argumentáciou pomocou pravdivostnej tabuľky na obrázku obr. 1.6. Platnosť implikácie A =>- B 51 52 s3 S4. s5 Sq s7 Ss A platí platí platí platí neplatí neplatí neplatí neplatí B platí platí neplatí neplatí platí platí peplatí neplatí C platí neplatí platí neplatí platí neplatí platí neplatí A => B vylúčené vylúčené B^C vylúčené vylúčené C neplatí vylúčené vylúčené vylúčené vylúčené obr. 1.6: Pravdivostná tabuľka A, B a C vylučuje situácie S3 a S4. Platnosť implikácie B C vylučuje situácie S2 a Sq. Pretože platí c (c neplatí), sú vylúčené aj situácie S±, S3, S$ a S7. Teda jediná možná situácia je Ss- Ss znamená, že všetky tri tvrdenia A, B a C neplatia a teda, že platia A, B a C. 1.2 ZÁKLADNÉ KAMENE VIED 13 Úloha 1.4 Uvažujme znovu tvrdenia A, B a C. Predpokladajme, že platia A => B, B => C a B. Aké závery z toho možno vyvodiť? Načrtnite pravdivostmi tabuľku pre všetkých 8 situácií, vzhľadom na platnosť tvrdení A, B a C. Určite, ktoré situácie sú možné, keď platia tvrdenia A => B, B => C a, B. Všimnime si, že z platnosti i 4 B, 5 4 C a C nemožno povedať nič o platnosti A a, B. Ak platí C, znamená to, že salamandry sa tešia. Ale to neznamená, že lúka musí byť mokrá. Salamandry sa môžu tešiť aj z iných dôvodov. Mokrá lúka je iba jeden z možných dôvodov ich radosti. •—3 Úloha 1.5 Načrtnite pravdivostnú tabuľku pre A, B a C a zistite, ktoré situácie sú možné, ak platí A=>B,B=>CaC. Úloha 1.6 Uvažujme nasledovné výpovede C a D. C znamená „Zmiešali sme žltú a modrú farbu" a D znamená „Miešaním sme dostali zelenú farbu". Implikácia C => D znamená \\ „Ak zmiešame žltú a modrú farbu, dostaneme zelenú farbu". Predpokladajme, že C =>• D platí. Načrtnite pravdivostnú tabuľku pre C a D a vysvetlite, ktoré situácie sú možné a ktoré vylúčené. Je možné usúdiť, že z platnosti C => D platí nasledujúce tvrdenie? „ Ak miešaním nevznikla zelená farba, tak sme nezmiešali modrú a žltú farbu". V Pomaly, ale isto začíname chápať ideu nepriamej argumentácie. Pri priamych dôkazoch vieme, že nejaké tvrdenie A platí a chceme dokázať platnosť takzvaného cieľového tvrdenia Z. Na dosiahnutie nášho cieľa Z vytvoríme postupnosť korektných implikácií A A1} A1 A2, ..., Ak_x Ak, Ak Z, ktoré spoločne zaručujú platnosť implikácie A Z. Z platnosti A a A Z môžeme potom usúdiť, že Z platí. Nepriamy dôkaz má nasledovnú štruktúru: Východisková situácia: D platí Cieľ: Z platí Začneme budovať postupnosť implikácií zo Z (teda z opaku toho, čo chceme dokázať) s cieľom dokázať platnosť implikácie Z D, pričom vieme, že D neplatí. Nech postupnosť implikácií vyzerá nasledovne: 14 KAPITOLA 1 Z Au A1=> A2, ..., Ak_x Ak, Ak -D. Z tejto postupnosti implikácií môžeme usúdiť, že neplatí Z, a teda platí Z. Správnosť tohto záveru môžeme pozorovať v pravdivostnej tabuľke na obr. 1.7. Situácia S2 je vylúčená vďaka platnosti Z =>- D. Pretože platí D, D Z D Z Z => D D platí Si platí platí neplatí neplatí platí neplatí neplatí platí vylúčené s3 neplatí platí platí neplatí vylúčené 1S4 neplatí neplatí platí platí vylúčené obr. 1.7: Pravdivostná tabuľka pre D a Z sú vylúčené aj situácie S3 a S4. V jedinej možnej ostávajúcej situácii Si platí Z, a tým sme dosiahli náš cieľ. Túto metódu dôkazu nazývame nepriamou, pretože v postupnosti implikácií argumentujeme odzadu smerom dopredu. Ak neplatí D (teda ak platí D), tak nemôže platiť ani Z, a teda platí Z. V našom predchádzajúcom príklade bolo tvrdenie D tvrdením C, to znamená, že naša východisková situácia bola, že salamandry sa netešia. Chceli sme ukázať, že potom neprší, t.j. náš cieľ bola platnosť Z = A. V novom označení Z = A a D = C boli zodpovedajúce implikácie A B, B C \ Z B, B D. /—v Z týchto implikácií sme odvodili platnosť implikácie Z =3- D. Z platnosti Z^>DaD sme dospeli k záveru, že musí platiť opak tvrdenia Z = A. Opak tvrdenia Z je tvrdenie Z = A, a tak sme dokázali, že neprší (platí A). Vo všeobecnosti postupujeme v nepriamych dôkazoch nasledovne. Chceme ukázať, že platí nejaké tvrdenie Z. Hľadáme takú postupnosť implikácií Ž=> Au A1 A2, Ak U, ktorá sa začína so Z a končí sa s nejakým „nezmyslom £/". Za „nezmysel" považujeme tvrdenie, ktoré očividne neplatí, alebo o ktorom sme už ukázali, že je neplatné. Vďaka platnosti Ž=>U, vidíme, že dôsledkom Z je evidentná nepravda (nezmysel). Keďže táto 1.2 ZÁKLADNÉ KAMENE VIED 15 nepravda nemôže platiť, nemôže platiť ani tvrdenie Z, ktorého je táto nepravda dôsledkom. Musí teda platiť opak tvrdenia Z, čo je tvrdenie Z. Úloha 1.7 Nech x2 je nepárne číslo. Našou úlohou je prostredníctvom nepriamej argumentácie ukázať, že aj x musí byť nepárne číslo. Označme symbolom A tvrdenie, že „x2 je nepárne" a symbolom Z tvrdenie, že „x je nepárne". Implikáciu Z => A, „x je párne" => „x2 je párne") môžeme dokázať umocnením ľubovoľného párneho čísla 2i na druhú, čo zapíšeme takto: Výsledné číslo (2i)2 je zrejme deliteľné dvoma bezo zvyšku, a teda je párne. Doplňte argumentáciu nepriameho dôkazu. Úloha 1.8 Nech x2 je párne číslo. Dokážte pomocou nepriamej argumentácie, že x je párne číslo. Úloha 1.9 (tvrdý oriešok) Dokážte pomocou nepriamej argumentácie, že a/2 nie je racionálne číslo. Racionálne čísla sú čísla, ktoré sa dajú reprezentovať ako podiel dvoch celých čísel. V podstate axiómy korektnej argumentácie môžeme považovať za pojmotvor-bu. Naša definícia implikácie a tým pojmu dôsledok predurčuje formálny systém korektnej argumentácie. Axiómy často nepredstavujú nič iné, ako definícia presného významu istých pojmov. V kapitole 3 sa napríklad zoznámime s definíciou pojmu nekonečna, ktoré naše predstavy o nekonečne matematicky spresňuje. Pravda neexistuje možnosť dokázať, že tieto definície dôležitých pojmov zodpovedajú presne našim predstavám. Ale na druhej strane existuje možnosť axiómu vyvrátiť. Jedna možnosť je ukázať, že axióma je v rozpore s inými etablovanými axiómami alebo poznatkami. Druhá možnosť je ukázať, že axióma nezodpovedá našim predstavám, i keď sme si to najprv mysleli. Napríklad, niekto môže nájsť nekonečný objekt, ktorý nie je podľa našej definície nekonečný, a potom musíme túto definíciu revidovať. Revíziu nejakej axiómy alebo nejakej definície nesmieme pokladať za nešťastie, alebo nebodaj dokonca za katastrofu. Výmena, alebo úprava jedného zo základných kameňov vedy môže síce viesť k rozsiahlym zmenám, a tým k množstvu práce, ale v konečnom dôsledku je to radostná udalosť, pretože po rekonštrukcii je budova vedy o kus stabilnejšia a bohatšia. Väčšina axiomatických základov matematiky má už za sebou turbulentně časy revízie pojmotvorby. Súčasná matematika pôsobí vďaka tomu až príliš stabilne, čoho negatívnym dôsledkom je prehliadanie kľúčovej úlohy pojmotvorby najmä vo výuke matematiky. (2i)2 = 22i2 = 4i2 = 2(2i2) 16 KAPITOLA 1 Doteraz sme hovorili iba o základných kameňoch vedy. čo ale môžeme povedať o kameňoch, ktoré nepokladáme za tie základné? Vedci sa usilujú budovať vedu tak, aby korektnosť základných kameňov vo forme axióm automaticky zaručovala korektnosť celej stavby. To je tá všeobecne známa vecnosť a spoľahlivosť exaktných vied. Keď sedia axiómy, tak sedia aj všetky výsledky a z nich odvodené poznatky. 1.3 Vznik informatiky ako koniec jednej eufórie en Koncom devätnásteho storočia ľudia žili v eufórii v dôsledku úspechov vedy a techniky. Technická revolúcia transformovala nové poznatky do vývoja rozličných strojov a zariadení. Produkty kreatívnej práce vedcov a inžinierov si nachádzali cestu do každodenného života a zvyšovali jeho kvalitu. Nepred-stavitelné sa stávalo realitou. Nadšenie z úspechov viedlo vedcov k prílišnému optimizmu, dokonca k utopistickým predstavám o možnostiach vedy a techniky. V tomto čase prevládala kauzálnodeterministická predstava o svete. Všetko, čo sa odohráva, musí mať príčinu a každá príčina má jednoznačne determinované dôsledky. Reťazcom príčinai =>- dôsledokí dôsledokx = príčina2 príčina2 =>• dôsledok2 dôsledok2 = príčina3 príčina3 ... chceli vedci vysvetliť usporiadanie sveta. Verilo sa, že ľudia sú schopní objaviť všetky prírodné zákonitosti a že tieto vedomosti sú postačujúce k porozumeniu všetkého. Vo fyzike sa táto eufória prejavila vo viere v takzvaných „démonov", schopných vypočítať, a tým aj predpovedať budúcnosť. Fyzici už vtedy vedeli, že vesmír je obrovský a že pozostáva z veľkého množstva častíc. Preto im bolo jasné, že žiaden človek nieje schopný obsiahnuť naraz pozíciu a stav všetkých častíc vo vesmíre, nehovoriac o všetkých ich možných interakciách. Fyzici teda videli, že ani so znalosťami všetkých prírodných zákonov nebude človek schopný predpovedať budúcnosť. Preto zaviedli pojem démona ako nadčloveka, ktorý je schopný úplne obsiahnuť súčasný stav vesmíru (stav všetkých častíc a interakcií medzi nimi). So znalosťami všetkých prírodných zákonov by takto démon mal byť hypoteticky schopný vypočítať ďalší vývoj a tým predpovedať budúcnosť. Ja osobne nepovažujem tieto predstavy 1.3 KONIEC JEDNEJ EUFÓRIE 17 za optimistické, pretože ich akceptovanie by znamenalo, že budúcnosť je už definitívne určená. Kde by potom bolo miesto pre naše aktivity? Nie sme schopní nič ovplyvniť, v najlepšom prípade len predpovedať? Našťastie tieto predstavy rozbili samotní fyzici. Na jednej strane teória chaosu a dynamických systémov ukázala, že existujú reálne systémy, pri ktorých nemerateľné malé rozdiely vo východiskovej situácii môžu viesť k úplne odlišnému vývoju. Definitívnu bodku za predstavami a existencii démonov urobila kvantová fyzika3, ktorá sa stala základom modernej fyziky. Kľúčovým princípom kvantovej mechaniky je existencia náhodných javov, a tým nepredpovedateľnosť udalostí na úrovni častíc. Keď akceptujeme zákony kvantovej fyziky (doteraz súhlasili všetky experimentálne výsledky s predpoveďami založenými na teoretických výpočtoch), tak neexistuje žiadna jednoznačná budúcnosť a nestrácame priestor pre tvarovanie našej budúcnosti. Založenie informatiky súviselo ale s inými utopistickými predstavami. David Hilbert, jeden z najvplyvnejších matematikov svojich čias, veril v existenciu metód na riešenie všetkých problémov. Jeho predstavy o existencii „perfektnej" matematiky boli nasledovné: (i) Celú matematiku možno vybudovať na konečnom počte axióm. (ii) Takto vybudovaná matematika bude úplná v tom zmysle, že o všetkých tvrdeniach formulovatelných v jazyku tejto teórie je možné rozhodnúť na základe argumentácie v tejto teórii, či sú pravdivé alebo nepravdivé. (iii) Na vytvorenie dôkazov pravdivosti matematických tvrdení existuje metóda, ktorou sa dá táto činnosť matematikov automatizovať. Náš záujem teraz sústredíme na pojem metóda. Čo vo svojej dobe chápali matematici pod týmto pojmom? Metóda na riešenie nejakej úlohy je opis postupu riešenia, ktorý vedie k správnemu výsledku. Opis pozostáva z postupnosti inštrukcií, ktoré dokáže realizovať každý (aj nematematik). Dôležité je si pritom uvedomiť, že na to, aby nejaká metóda bola aplikovateľná nepotrebujeme rozumieť, ako bola objavená a prečo úspešne rieši danú úlohu. Ako príklad si zoberme úlohu (problém) riešenia kvadratických rovníc tvaru x2 + bx + c = 0. Ak b2 — 4c > 0, opisujú formuly (vzorce) 3Podrobnejšie sa touto témou budeme zaoberať v kapitolách o náhode a kvantových počítačoch. 18 KAPITOLA 1 *2 = -(!)- Vb2-4c 2_ 2 dve riešenia tejto kvadratickej rovnice. Vidíme, že sme schopní vypočítať riešenia x\ a rc2 bez toho, aby sme vedeli ako boli odvodené a prečo uvedené vzorce vyzerajú práve takto. Úplne stačí, ak vieme realizovať aritmetické operácie. Vďaka tomu môže aj počítač (dokonca programovateľná kalkulačka), stroj bez akéhokoľvek intelektu, riešiť touto metódou kvadratické rovnice. Z tohto dôvodu spájame existenciu nejakej metódy na riešenie istého typu úloh s automatizovateľnosťou riešenia týchto úloh. Dnes sa pojem metódy na popis postupu riešenia bežne nepoužíva, pretože má v kontexte rôznych vedných oblastí rôzne a veľmi široké interpretácie. Namiesto toho používame pojem algoritmus, ktorý je kľúčovým pojmom informatiky4. Odborný termín „algoritmus" vďačí za svoje meno arabskému matematikovi Al-Chwarizmimu, ktorý v deviatom storočí napísal v Bagdade knihu o alge- V zmysle takejto algoritmickej interpretácie môžeme označiť Hilbertove úsilie za snahu automatizovať (algoritmizovať) prácu matematikov. Hilbert hľadal dokonalú matematiku, v ktorej by sme mali algoritmus (metódu) na overovanie pravdivosti sformulovaných tvrdení. Takto by bola automatizovateľná hlavná úloha matematikov, objavovať matematické dôkazy. V podstate ide o neradostnú predstavu, podľa ktorej by bolo možné nahradiť „hlúpym" strojom jednu z naj kreatívnejších intelektuálnych činností. Našťastie v roku 1931 dal Kurt Gôdel definitívnu bodku za úsilím vytvoriť úplnú matematiku. Gôdel matematicky dokázal, že úplná matematika podľa Hilbertových predstáv nemôže existovať, a teda nemá zmysel sa ju snažiť budovať. Najdôležitejšie Gôdelove výroky pre vedu môžeme zhrnúť bez použitia matematických formulácií takto: (a) Neexistuje úplná „zmysluplná" matematická teória. V každej korektnej a dostatočne obsiahlej matematickej teórii vybudovanej s konečným počtom axióm (ako napríklad v dnešnej matematike) je možné formulovať tvrdenia, ktorých korektnosť nie je možné dokázať v rámci tejto teórie. Na dokázanie alebo vyvrátenie korektnosti týchto tvrdení je nevyhnutné prijať nové axiómy, a tým rozšíriť doterajšiu teóriu. (b) Neexistuje metóda (algoritmus) na automatické dokazovanie matematických viet. 4m.w. hoci je tento pojem relatívne nový, algoritmy, v zmysle metód na riešenie (číselných) úloh, používame už tisíce rokov. braických metódach. 1.3 KONIEC JEDNEJ EUFÓRIE 19 Ak Gôdelove výsledky správne interpretujeme, uvedomujeme si, že jeho objavy sú vlastne pozitívne. Budovanie matematiky ako formálneho jazyka vedy je nekonečný proces. S každou novou axiómou, a tým aj s každým novým pojmom rastie náš slovník a sila argumentácie. Vďaka novým axió-mam a s nimi spojenými pojmami (odbornými termínmi) môžeme formulovať výpovede o objektoch a javoch, o ktorých sme predtým nevedeli hovoriť. Navyše môžeme skúmať a overovať platnosť tvrdení, ktoré boli predtým neověřitelné. A nakoniec, proces overovania platnosti tvrdení nemôžeme automatizovať. V tom je ľudská tvorivá činnosť nenahraditeľná. Gôdelove výsledky zmenili náš pohľad na vedu. Dnes čoraz väčšmi chápeme vývoj jednotlivých vedných disciplín ako proces pojmotvorby a vývoja metód. Prečo ale boli Gôdelove výsledky kľúčové pre vznik informatiky? Jednoducho preto, že pred Gôdelovymi objavmi nikto nepociťoval potrebu formálne presne (matematicky) definovať pojem metódy. Nikto nepotreboval takúto definíciu na to, aby mohol prezentovať nejakú novú metódu na riešenie istých úloh. Postačilo intuitívne chápanie metódy v zmysle jednoduchého a zrozumiteľného opisu postupu riešenia. Ale vo chvíli, keď vznikla potreba ukázať, že pre isté úlohy neexistujú metódy (algoritmy) na ich riešenie, museli vedci najprv presne špecifikovať, čo pojem metódy (algoritmu) zahrňuje. Je prakticky nemožné dokázať neexistenciu nejakého objektu, ktorý nie je presne špecifikovaný (opísaný). Najprv musíme vedieť úplne presne v zmysle matematickej definície, čo je a čo nie je algoritmus (metóda) na riešenie nejakého problému. Len tak máme šancu pokúšať sa nájsť dôkaz tvrdenia, že pre istú konkrétnu úlohu neexistuje žiadny algoritmus na jej riešenie. Prvú matematickú definíciu algoritmu (pojmu metóda) sformuloval v roku 1936 Alan Turing pomocou takzvaného Turingovho stroja. Neskôr nasledovali mnohé ďalšie definície. Najdôležitejšie je, že všetky rozumné pokusy nájsť formálnu definíciu algoritmu viedli k tomu istému pojmu v zmysle automaticky riešiteľného. Hoci vyjadrené rôznymi matematickými formalizmami, zodpovedajúce definície množín algoritmicky riešiteľných úloh ostali stále tie isté. To viedlo nakoniec k tomu, že Turingova definícia algoritmu bola pridaná k predchádzajúcim už etablovaným axiómam matematiky5. Teraz môžeme znova preveriť naše chápanie axióm. Definíciu algoritmu považujeme za axiómu, pretože neexistuje možnosť dokázať jej správnosť. Ako možno dokázať, že naša definícia automatickej (algoritmickej) riešiteľnosti skutočne zodpovedá našim intuitívnym predstavám o automatickej riešiteľnosti? Na druhej strane nemôžeme vylúčiť možnosť, že sa ukáže, že táto axióma je nesprávna. Ako sa to môže stať? Ak niekto vymyslí na riešenie nejakého 5 Všetky axiómy matematiky sú aj axiómy informatiky. 20 KAPITOLA 1 problému aplikovateľnú metódu, a táto metóda podľa našej definície nie je algoritmom, potom nie je naša definícia dosť dobrá a potrebuje revíziu. Skutočnosťou ale je, že napriek mnohým pokusom sa nikomu nepodarilo vyvrátiť Turingovu definíciu z roku 1936. Dnes pokladáme definíciu algoritmu za stabilnú axiómu a viera v jej správnosť je veľmi silná. Pojem algoritmu je pre informatiku natoľko kľúčový, že sa na tomto mieste nepokúsime v krátkosti vysvetliť jeho význam. Vytvoreniu a pochopeniu pojmov algoritmus a program venujeme radšej celú nasledujúcu kapitolu. 1.4 História informatiky a koncepcia knihy Prvá základná otázka informatiky bola: Existujú úlohy, ktoré sa nedajú algoritmicky (automaticky) riešiť? A ak existujú, ktoré úlohy sú algoritmicky riešiteľné a ktoré nie sú? Našim cieľom je nielen dať odpovede na uvedené otázky, ale aj predviesť veľké úseky výskumných ciest vedúcich k ich zodpovedaniu takým spôsobom, aby ste po nich mohli samostatne kráčať. Vzhľadom na to, že táto téma patrí medzi najťažšie v prvých dvoch rokoch univerzitného štúdia informatiky, budeme postupovať pomaly, krôčik za krôčikom. Z toho dôvodu venujeme tejto najstaršej oblasti informatiky celé tri kapitoly. Druhá kapitola má názov Algoritmika, alebo čo má spoločné programovanie a pečenie koláča? a venuje sa plne budovaniu kľúčových pojmov algoritmus a program. Aby sme získali prvú predstavu o význame týchto pojmov, začneme so známou činnosťou - pečením koláča. Piekli ste už podľa receptu koláč, alebo ste niekedy varili jedlo bez toho, aby ste vedeli, prečo sa postupuje práve tak, ako je to napísané v recepte? Celý čas ste si boli vedomí, že korektné vykonávanie jednotlivých pokynov je dôležité pre dosiahnutie dobrej kvality konečného produktu. Čo ste sa pritom naučili? Pomocou presne sformulovaných pokynov detailne napísaného receptu môžeme dospieť k dobrému jedlu aj bez toho, aby sme boli kuchárskymi majstrami. Aj keď sa v eufórii z kuchárskeho úspechu môžeme na okamih pokladať za vynikajúcich kuchárov, nie sme nimi, pokiaľ nerozumieme do 1.4 HISTÓRIA INFORMATIKY 21 hĺbky vplyvu jednotlivých úkonov v recepte na kvalitu konečného produktu, a tým pádom nie sme sami schopní formulovať podobné recepty. Počítač to má ešte oveľa ťažšie: Je schopný vykonávať len zopár jednoduchých inštrukcií, akými sú v prípade varenia inštrukcie miešania a zohrievania. Na rozdiel od nás počítač nemá žiadnu inteligenciu, teda nie je schopný improvizovať. Počítač dôsledne vykonáva pokyny svojich receptov (ktoré sa nazývajú programy) bez toho, aby tušil aké zložité spracovanie informácií práve vykonáva. Spolu objavíme, že umenie programovať, je umením písať recepty tak, aby v nich reprezentované metódy a algoritmy boli zrozumiteľné pre počítač. Pri tejto príležitosti predstavíme aj samotný počítač a ukážeme, ktoré pokyny (inštrukcie) je schopný vykonávať a čo sa v ňom odohráva pri realizácii týchto inštrukcií. Popri tom sa naučíme aj čo sú algoritmické úlohy (problémy) a aký rozdiel je medzi významom pojmov program a algoritmus. Názov tretej kapitoly je Nie je nekonečno ako nekonečno, alebo prečo je nekonečno v informatike nekonečne dôležité? \ Táto kapitola sa celá venuje nekonečnu. Prečo bolo v procese poznávania nášho konečného sveta definovanie pojmu „nekonečno" nielen užitočné, ale dokonca nevyhnutné? Nám známy vesmír je síce obrovský, ale konečný. Všetko, čo vidíme, všetko čoho sa dotýkame a s čím experimentujeme a všetko, čo ovplyvňujeme je konečné. Nikto nikdy nemal nič dočinenia s niečím nekonečným. A napriek tomu bez dnešnej podoby pojmu nekonečno nemôže existovať matematika, fyzika a informatika, a tým ani ostatné vedy. Už v prvých triedach základnej školy stretávame prirodzené čísla 0,1,2,3,..., ktorých je nekonečne veľa. Načo je to vôbec dobré, keď aj počet všetkých elementárnych častíc vo vesmíre je síce obrovské, ale stále len konečné číslo? Načo potrebujeme ešte väčšie čísla? Čo znamená nekonečno pre informatiku? A prečo je dôležité nekonečno pri skúmaní hraníc automatickej (algoritmickej) riešiteľnosti? Usilujúc sa nájsť odpovede na tieto otázky, zoznámime sa nielen s matematickou definíciou nekonečna, ale aj pochopíme užitočnosť konceptu nekonečnosti. Pochopíme, že na prvý pohľad umelo vyzerajúce nekonečno sa stalo úspešným a dokonca nenahraditeľným nástrojom na skúmanie nášho konečného sveta. Názov štvrtej kapitoly je 22 KAPITOLA 1 Vypočítatelhosť, alebo prečo existujú úlohy, ktoré sa nedajú vyriešiť na programovateľnom počítači? Táto kapitola je nadstavbou získaných vedomostí o nekonečne, ktoré využíva na ukázanie existencie algoritmicky neriešiteľných úloh. Ako môžeme dokázať algoritmickú neriešiteľnosť konkrétnych úloh z praxe? Na dosiahnutie tohto cieľa použijeme metódu redukcie, ktorá je jedným zo základných a najúspešnejších prostriedkov matematiky na riešenie konkrétnych úloh. V istom zmysle umožňuje metóda redukcie rozširovať pozitívne výsledky, pretože transformuje známe algoritmy riešenia konkrétnych úloh na nové algoritmy, ktoré riešia nové, často všeobecnejšie úlohy. My ale modifikujeme metódu redukcie tak, aby sa dala použiť na šírenie negatívnych výsledkov, konkrétne na dokazovanie algoritmickej (automatickej) neriešiteľnosti konkrétnych úloh. Týmto spôsobom objavíme konkrétne úlohy z praxe, ktoré sa v žiadnom prípade nedajú automaticky riešiť. Naplníme tým náš prvý cieľ tejto série prednášok, zoznámiť sa s hranicou automatickej riešiteľnosti. Začiatkom šesťdesiatych rokov 20.st. vedci úspešne vybudovali teóriu, pomocou ktorej klasifikujeme problémy na automaticky riešiteľné a automaticky neriešiteľné. V tom čase sa začali počítače stále viac a viac používať aj v civilnom sektore. Pri praktickej realizácii algoritmov nešlo ani tak o ich existenciu, ako o ich výpočtovú zložitosť, a tým aj o efektívnosť výpočtov. Pojmom a konceptom teórie zložitosti sa venuje piata kapitola s názvom Teória zložitosti, alebo čo môžeme robiť, keď na výpočet nestačí energia celého vesmíru? Po pojme algoritmu je pojem zložitosti druhým najdôležitejším pojmom informatiky. Zložitosť chápeme v informatike v prvom rade ako výpočtovú zložitosť, presnejšie, ako množstvo práce, ktoré musí počítač vykonať, aby sa dopracoval k výsledku. Najčastejšie meriame zložitosť algoritmu ako počet vykonaných operácií, alebo ako veľkosť používanej pamäti. Pokúsime sa tiež merať zložitosť problémov ako zložitosť najlepších (najrýchlejších, alebo na-júspornejších pri zaobchádzaní s pamäťou) algoritmov, ktoré daný problém riešia. Prvoradou úlohou teórie zložitosti v informatike je klasifikovať problémy (výpočtové úlohy) na ľahké a ťažké, vzhľadom na ich výpočtovú zložitosť. Vieme, že existujú ľubovoľne ťažké algoritmické problémy a poznáme tisíce úloh z praxe, pri riešení ktorých potrebujú uskutočniť aj najlepšie známe algoritmy podstatne viac operácií, ako je protónov vo vesmíre. Celá energia vesmíru, ani čas trvania vesmíru sú nedostatočné zdroje na ich riešenie. Máme vôbec nejakú šancu podniknúť niečo v tejto situácii? 1.4 HISTÓRIA INFORMATIKY 23 Na tomto mieste začína nadobúdať konkrétnu podobu prvý div informatiky v tejto sérii prednášok. Môžeme urobiť veľa. Prečo a ako je to možné, to je pravé umenie algoritmiky. Mnohé ťažké problémy sú veľmi „citlivé" a v nasledujúcom zmysle nestabilné. Malá zmena formulácie úlohy, alebo malé oslabenie našich požiadaviek, môže spôsobiť obrovský skok (vo výpočtovej zložitosti) z fyzikálne nerealizovateľného množstva práce na výpočty, ktoré sa dajú zrealizovať v zlomku sekundy. Témou tejto kapitoly a tiež viacerých po nej nasledujúcich je, ako sa dajú dosahovať takéto efekty vďaka originálnym konceptom algoritmiky. Zázrak nastane vtedy, keď sa nám podarí naše požiadavky znížiť v takej miere, že z praktického hľadiska o redukciu požiadaviek vlastne ani nejde, a napriek tomu dôjde k obrovskej úspore počítačovej práce. Naj magickej šie príklady riešenia zdanlivo bezvýchodiskových situácií vznikajú pri použití náhodného riadenia algoritmov a výpočtových systémov. Dosiahnutý efekt je natoľko fascinujúci, že pôsobí ako skutočný zázrak. Preto tejto téme venujeme špeciálnu kapitolu s titulom Náhoda a jej úloha v prírode, alebo náhoda ako zdroj efektívnosti v algoritmike. Myšlienka spočíva v opustení deterministického priebehu programu a dovolení algoritmu občas si hodiť mincou. V závislosti od toho čo padne (rub alebo líc) si algoritmus môže zvoliť rôzne stratégie ako bude hľadať riešenie. Tým obetujeme absolútnu spoľahlivosť v zmysle garancie správneho výsledku, pretože niektoré postupnosti hodov mincou môžu viesť k neúspešnému výpočtu. Neúspešný výpočet je buď výpočet, ktorý nevedie k žiadnemu výsledku, alebo výpočet vedúci dokonca k zlému výsledku. Keď ale vieme zmenšiť pravdepodobnosť neúspešného výpočtu na jeden z miliardy, algoritmus môže byť veľmi užitočný. Zdôraznime skutočnosť, že v praxi môžu byť randomizované algoritmy s malou pravdepodobnosťou chybného výsledku dokonca spoľahlivejšie ako ich najlepšie deterministické náprotivky. Čo tým myslíme? Teoreticky sú všetky deterministické programy správne a randomizované sa môžu mýliť. Podstata tkvie v tom, že beh deterministického programu nie je absolútne bezchybný, pretože počas výpočtu rastie úmerne s dĺžkou výpočtu aj pravdepodobnosť hardvérovej chyby. Preto môže byť rýchly randomizovaný algoritmus spoľahlivejší ako pomalý deterministický. Napríklad, ak randomizovaný program vypočíta výsledok za 10 sekúnd, potom je spoľahlivejší ako deterministický program, ktorý vypočíta výsledok za týždeň. Využitím ran-domizácie získame enormný nárast efektívnosti, keď akceptujeme veľmi malú 24 KAPITOLA 1 stratu spoľahlivosti. Keď ale vďaka tejto len zdanlivej strate spoľahlivosti výpočtov, spôsobíme skok z fyzikálne nerealizovateľného množstva práce, na množstvo práce uskutočniteľné za pár sekúnd na bežnom PC, tak môžeme hovoriť o naozajstnom zázraku. Bez takýchto zázrakov informatiky by neexistovala dnešná internetová komunikácia, elektronické obchodovanie a bankovníctvo. Okrem aplikácií náhody v informatike v tejto kapitole diskutujeme aj o principiálnej otázke - existencii pravej náhody a ukazujeme, ako sa vzťah k náhode menil v priebehu dejín vedy. Pod názvom Kryptografia, alebo ako spraviť zo slabiny přednost rozprávame v siedmej kapitole dejiny kryptografie, ktorá sa stala vedou o šifrovaní. V priebehu rozprávania sa dozvieme, ako sa kryptografia vďaka algoritmike a konceptom teórie zložitosti vyvinula z hry na šifrovanie na serióznu vednú disciplínu. Je ťažké nájsť vednú oblasť, ktorá by obsahovala také množstvo divov, v zmysle výskytu prekvapujúcich zvratov a otváraní neuveriteľných možností pri hľadaní riešení. Kryptografia je starodávna veda o tajných písmach. Jej úlohou je zašifrovať (zakódovať) zrozumiteľné texty tak, aby ich nemohol dešifrovať a teda čítať nikto, okrem určeného adresáta. Klasická kryptografia je založená na tajných „kľúčoch", ktoré sú spoločným tajomstvom odosielateľa a príjemcu. Vo vývoji kryptografie informatika zohrala kľúčovú úlohu. Najprv umožnila na úrovni pojmotvorby po prvýkrát definovať bezpečnosť (spoľahlivosť) kryptosystémov. Kryptosystém je pre užívateľov bezpečný, keď každý program, ktorý nepozná kľúč, vyžaduje na dešifrovanie textu fyzikálne nerealizovateľné množstvo výpočtov. Na základe definície kvality kryptosystému objavili informatici také efektívne realizovateľné šifrovacie metódy, ktorých dešifrovanie bez znalosti kľúča zodpovedá ťažkým algoritmickým problémom. Na tomto príklade vidíme, že existencia ťažkých problémov neslúži len na to, aby nám ukázala hranice našich technických možností, ale aj na to, aby nám pomohla riešiť kryptografické úlohy. Vďaka tejto myšlienke sa podarilo vyvinúť takzvané kryptosystémy s verejným (neutajeným) kľúčom. Šifrovací kľúč a aj celý šifrovací mechanizmus môže byť zverejnený v telefónnom zozname. A to vďaka tomu, že na dešifrovanie je potrebný ešte jeden tajný kľúč, ktorý pozná len právoplatný príjemca. Bez tohto tajomstva nie je schopný žiadny iný subjekt dešifrovať zašifrovaný text v realistickom čase, napriek tomu, že pozná šifrovaciu metódu. 1.4 HISTÓRIA INFORMATIKY 25 Nasledovné dve kapitoly sa venujú možnostiam enormného miniaturizovania počítačov. Hlavnou myšlienkou je vykonávanie výpočtov na úrovni molekúl a elementárnych častíc. Pod názvom Počítanie s DNA molekulami, alebo biopočítačová technológia na obzore predstavujeme v ôsmej kapitole biochemické technológie, ktoré by sa mohli dať využiť na riešenie ťažkých úloh. Na jednoduchom príklade ťažkej úlohy ukážeme, ako sa dajú údaje reprezentovať pomocou reťazcov DNA a ako sa dá vypočítať výsledok pomocou chemických operácií na týchto reťazcoch. Ak sa detailnejšie pozrieme na prácu počítačov, zistíme, že nerobia nič iné, než transformujú texty (postupností symbolov) na iné texty. Počítač dostane vstupné údaje opisujúce problém vo forme postupnosti symbolov (napríklad núl a jedničiek), výstup počítača je znova len text v tvare postupnosti znakov. V priebehu výpočtu sú údaje uložené v pamäti počítača ako postupnosti núl a jedničiek. Počítač „počíta" s týmito postupnosťami. Môže niečo také napodobniť príroda? Na reťazce DNA molekúl môžeme tiež nazerať ako na postupnosti štyroch symbolov A,T,C a G a vieme tiež, že DNA molekuly sú nositeľmi informácie rovnako, ako dáta v počítači. Rovnakým spôsobom, ako počítače realizujú operácie nad symbolickou reprezentáciou údajov, umožňujú chemické operácie meniť biologické údaje. Čo dokážu počítače, zvládnu molekuly ľavou rukou a dokonca podstatne rýchlejšie. V tejto kapitole diskutujeme možnosti biologických technológií v informatike, ich silné a slabé stránky. Táto oblasť je plná prekvapení a meniacich sa názorov, nik sa dnes neodváži formulovať predpovede o možných aplikáciách týchto technológií o 10 rokov. Ťažko by sme hľadali okrem fyziky inú vednú disciplínu, ktorá by tak výrazne ovplyvnila náš pohľad na svet v poslednom storočí. S fyzikou sa spájajú hlboké poznatky a fascinujúce objavy. Klenot medzi diamantami je kvantová mechanika. Význam jej objavu znesie prirovnanie k objavu ohňa v dobe kamennej. Fascinácia kvantovou teóriou spočíva v tom, že zákony správania sa elementárnych častíc odporujú našim skúsenostiam z makrosveta. Táto na začiatku veľmi kritizovaná a dnes uznávaná fyzikálna teória, umožňuje hypoteticky nový spôsob počítania na úrovni elementárnych častíc. Tejto téme venujeme deviatu kapitolu s názvom Kvantové počítače, alebo počítanie v čarovnom svete mikročástic. 26 KAPITOLA 1 Hneď ako vedci odhalili túto možnosť, položili si otázku, či ešte platí prvá axióma informatiky. Inými slovami: Dokážu kvantové počítače niečo, čo klasické nedokážu? Rýchlo sa našla negatívna odpoveď, takže kvantové algoritmy riešia tú istú triedu algoritmicky riešiteľných úloh, ktorú sme definovali pomocou klasických algoritmov. Vďaka tomuto poznatku stojí naša axióma informatiky na vlastných nohách ešte pevnejšie a o jej stabilite sa dnes nepochybuje. Aké sú potom ale prednosti používania kvantových počítačov? Existujú konkrétne úlohy, veľkého praktického významu, ktoré sa dajú efektívne riešiť na kvantových počítačoch, zatiaľ čo doteraz najlepšie vytvorené klasické algoritmy potrebujú na ich riešenie vykonať nerealizovateľné množstvo počítačovej práce. Vďaka tomu je kvantová mechanika pre nás veľmi sľubnou počítačovou technológiou. Problém je len v tom, že zatiaľ nie sme schopní konštruovať používateľné kvantové počítače a dosiahnutie tohto cieľa je veľkou výzvou súčasného fyzikálneho výskumu. Vzhľadom na to, že pochopenie kvantových výpočtov vyžaduje hlbšie poznatky z matematiky, nebudeme sa usilovať do podrobností predviesť „hlavné myšlienky" kvantovej algoritmiky. Vysvetlíme len na jednoduchom príklade, čo všetko je možné vo svete elementárnych častíc a ako sa to dá využiť na realizovanie výpočtov. Objasníme tiež, prečo je zostrojenie kvantového počítača takou náročnou úlohou a aké neuveriteľné možnosti pre bezpečnú a utajenú komunikáciu sa nám prostredníctvom kvantovej mechaniky otvárajú v kryptografii. Desiata kapitola s názvom . Ako dospieť k dobrým rozhodnutiam bez poznania budúcnosti, alebo ako prekabátiť prefíkaného protivníka sa vracia späť k algoritmike, vedeckému jadru informatiky. V živote často nastávajú situácie, v ktorých by sme radi vedeli, čo nám prinesie budúcnosť. Žiaľ len zriedka do budúcnosti môžeme nahliadnuť, alebo jej vývoj odhadnúť, teda musíme rozhodnutia prijímať dnes a bez toho, aby sme poznali budúcnosť. Predstavme si napríklad lekársku pohotovostnú službu s mobilnými lekármi. Nikto nevie dopredu, odkiaľ a kedy príde tiesňové volanie. Napriek tomu sa ale môže riadiaca služba pokúšať, efektívne koordinovať pohyb lekárov. Za cieľ si môže určiť minimalizáciu priemerného času čakania na pohotovostného lekára, alebo celkového počtu najazdených kilometrov. Na splnenie uvedených cieľov môže centrála vyvinúť rôzne stratégie. Napríklad určí, čo má lekár ďalej podniknúť po úspešnom zásahu. Má čakať na nasledujúce tiesňové volanie tam, kde je? Má sa vrátiť naspäť do nemocnice, alebo sa má dokonca presunúť na nejakú novú, strategicky výhodnú vyčká- 1.4 HISTÓRIA INFORMATIKY 27 vaciu pozíciu? Ktorého lekára vyšle centrála pri aktuálnom tiesňovom volaní? Principiálna otázka je, či pre takéto, takzvané online problémy, vôbec existuje nejaká rozumná stratégia, ktorá je v istom zmysle úspešná, bez ohľadu na to, čo nám prinesie budúcnosť. Celú túto online úlohu si môžeme predstaviť ako hru proti nejakému prefíkanému protihráčovi. Akonáhle spravíme a zrealizujeme nejaké rozhodnutie, protihráč nám vytvorí takú budúcnosť, pre ktorú je naše rozhodnutie čo naj nepriaznivejšie. Máme v takejto hre vôbec reálnu možnosť robiť rozumné a úspešné rozhodnutia? Odpovede na túto otázku môžu byť rôzne a závisia od konkrétnych online úloh. Je fascinujúce pozorovať, že pomocou informatiky často môžeme prekabátiť aj takého silného protihráča, ktorý môže tvoriť pre nás nepriaznivú budúcnosť. Knihu uzavrieme jedenástou kapitolou s názvom Algoritmická optimalizácia vo fyzike, alebo ako môže účinkovať homeopatia. Na rozdiel od predchádzajúcich kapitol tu opustíme relatívne pevnú pôdu uznávaných vedeckých výsledkov a dovolíme si brať vážne zopár vizionářských domnienok, ktoré nám otvoria novú dimenziu nazerania na život, zdravie a liečenie. Z termodynamiky vieme, že každý fyzikálny systém sa neprestajne pokúša dosiahnuť svoj ideálny stav, ktorý nazývame optimum. Napriek tomu, následkom silného vonkajšieho zaťaženia a rôznych vplyvov sa môže od svojho optima vzďaľovať. Proces návratu systému k optimu vedia fyzici veľmi dobre simulovať pomocou takzvaného Metropolisovho algoritmu. Na začiatku osemdesiatych rokov dvadsiateho storočia vedci prekvapujúco objavili, že algoritmickú optimalizáciu v matematike a v informatike je možné modelovať ako proces optimalizácie nejakého fyzikálneho systému. Na základe tohto princípu vyvinuli heuristiku „simulovaného žíhania", ktorá zaznamenala pri riešení ťažkých optimalizačných úloh veľké úspechy v praxi. Dovoľme si teraz prijať predpoklad, že živé systémy (organizmy) sa správajú podobne ako „neživá" hmota, v tom zmysle, že sa nepretržite snažia dosiahnuť svoj ideálny stav. Zdravie považujme za optimálny stav a chorobu za odklon od tohto stavu. Na základe takéhoto pohľadu vytvoríme vizionársku predstavu medicíny budúcnosti, ktorá sa namiesto lokálnych korektúr a ošetrení, sústredí na povzbudenie a podporu vlastných optimalizačných schopností organizmu. Pri takomto ponímaní vyzerajú mnohé alternatívne liečebné praktiky, ako napríklad homeopatia, prirodzene a realisticky. Ukážeme dokonca, 28 KAPITOLA 1 že isté experimentálne pozorovania procesu liečenia po podaní homeopatick-ých prípravkov zodpovedajú priebehu optimalizácie opísanej Metropolisovým algoritmom. Kniha „Sedem divov informatiky", ktorú by sme mohli nazvať aj „Algoritmické dobrodružstvá, končí jedenástou kapitolou. Koľko divov sme ukázali naozaj, nechceme teraz počítať a ani to nikomu nedoporučujeme. Výsledný počet závisí od toho, ako definujeme pojem div. A už sme sa naučili, akou náročnou prácou je pojmotvorba. Takže namiesto počítania divov, čitateľovi ponúkame dva doslovy. Skúsenému čitateľovi, ktorý úspešne v plnom zdraví strávil predchádzajúce ťažké témy, sprostredkuvávame v prvom doslove náš pohľad na príspevok informatiky k všeobecnému vzdelaniu. Informatika prirodzeným spôsobom spája v jednom odbore matematicko-prírodovedné myslenie s pragmatickými postupmi inžinierskych disciplín. Toto spojenie otvára novú dimenziu, ktorá zatiaľ stredným školám chýba. Atraktívnosť informatiky je vecou vysokej miery interdisciplinarity a prepojenia teórie a experimentov. Čo dnes na stredných školách chýba na to, aby bola informatika akceptovaná, sú učebnice a učebné materiály, ktoré by boli schopné sprostredkovať vyššie uvedené hodnoty. Dúfame, že touto knižkou sa nám podarilo ukázať, ktorým smerom sa môžeme vybrať pri tvorbe takýchto učebníc. Druhý doslov je manifestom na podporu základného výskumu. Príliš veľa politikov, podnikateľov a manažérov volá po aplikovanom výskume, ktorý prináša zisk v krátkom čase. Miesto generovania nových poznatkov v základnom výskume sa má výrazne uprednostňovať transformácia získaného poznania do ziskových produktov. Štátna politika financovania vedy sa má sústrediť namiesto tvorby nových poznatkov na spotrebu poznatkov v mene populisticky proklamovaného, zdanlivého rastu životnej úrovne. V tomto manifeste vysvetľujeme, prečo je tento prístup k financovaniu vedy rovnako životu nebezpečný, ako bolo pre ľudí v dobe kamennej, krátkodobé prejedenie a nasýtenie sa, namiesto vytvárania zásob na zimu. Pre vznik a vývoj vedných disciplín je určujúca pojmotvorba. Definovaním pojmu algoritmu dali vedci pojmu metóda presný význam a položili tým základný kameň novej vedy - informatiky. Vďaka tejto definícii sme získali jasnú hraničnú čiaru medzi automaticky (algoritmicky) riešiteľnými a auto- 1.5 Zhrnutie 1.5 ZHRNUTIE 29 maticky neriešiteľnými úlohami. Potom, ako sa podarilo úspešne roztriediť mnohé úlohy na algoritmicky neriešiteľné a algoritmicky riešiteľné, prišiel pojem výpočtovej zložitosti, ktorý dodnes dominuje základnému výskumu v informatike. Tento pojem umožňuje skúmať hranicu medzi praktickou riešiteľnosťou a praktickou neriešiteľnosťou, kryptografii poskytol základ pre pojem bezpečného šifrovacieho systému, a tým umožnil objavenie moderných kryptosystémov s verejným kľúčom. Hlavne umožnil skúmať a porovnávať výpočtovú silu determinizmu, nedeterminizmu, náhodného riadenia a kvantových algoritmov. Takto prispela a prispieva informatika nielen k chápaniu všeobecných kategórií vedy, akými sú determinizmus, nedeterminizmus, náhoda, informácia, pravda, nepravda, zložitosť, jazyk, dôkaz, poznatok, komunikácia, algoritmus, simulácia, atd'., ale dáva viacerým z týchto kategórií aj nový význam. Divotvorné objavy informatiky sú spojené najmä s úsilím riešiť ťažké úlohy. Vznikajú pritom „divy", ktorým je venovaná táto knižka. Úloha 1.3 V pravdivostnej tabuľke na obrázku obr. 1.5 sú len tri prípustné (možné) situácie a to Si, S2 a Ss- Spytujeme sa, ktoré implikácie platia. Na zodpovedanie tejto otázky používame nasledovné pravidlo: Ak vo všetkých možných situáciách, v ktorých platí X, platí aj Y, tak platí X =>• Y. Implikácia X =>Y neplatí, ak existuje situácia, v ktorej X platí, ale Y neplatí. Skúmajme najprv platnosť implikácie A =>• B. Jediné možné situácie, v ktorých A platí sú 5*1 a 5*2. V týchto situáciách platí aj B. Teda usúdime, že platí A=> B. Teraz sa pozrime na B => A. B platí v 5*1 a S% a v tých situáciách platí aj A. Takže platí aj B => A. Skúmajme, či platí implikácia A => C. Tj možných situácií, A platí v 5*1 a 5*2. V situácii 5*2 ale C neplatí. Teda implikácia A=> C neplatí. Naopak, ale platí implikácia C => A, pretože C platí len v 5*1 a tam platí aj A. Postupujúc týmto spôsobom prídeme k tomu, že platia implikácie A => B, B => A. C=>AaC=>BaŤ,e neplatia implikácie A => C a C => B. Implikácie A => A. B => B a C => C platia vždy, nezávisle od toho, ktoré situácie sú možné. Úloha 1.6 Načrtnime najprv pravdivostnú tabuľku pre C a D a skúmajme, kedy platí C => D. Vzorové riešenia k vybraným úlohám 30 KAPITOLA 1 c D C => D Si platí platí s2 platí neplatí vylúčené s3 neplatí platí S4 neplatí neplatí Z tabuľky vidíme, že sú možné situácie Si, S3 a S4. čo znamená, vziať do úvahy dodatočnú informáciu, že pri miešaní nevznikla zelená farba? Nič iné, len to, že D neplatí, a teda, že platí D. To vylučuje situácie S± a S3, v ktorých platí D. Ostáva len jedna jediná možná situácia a tou je S4. V situácii S4 platia D a C, teda platí aj D =>• C. Keďže vieme, že miešaním nevznikla zelená farba (D platí), môžeme usúdiť, že sme nezmiešali žltú a modrú farbu (C platí). Úloha 1.8 Uvažujme dve tvrdenia. Tvrdenie A znamená, že „x2 je parné1 a tvrdenie B znamená, že "x je párne,,. Platnosť A je daná. Našim cieľom je dokázať, že platí tvrdenie B. V nepriamom dôkaze musíme začať s B. Tvrdenie B znamená, že „x je nepárne11. Podľa definície nepárnych čísel vieme, že x môžeme vyjadriť ako x = 2i + l, pre nejaké prirodzené číslo i. Teda platí x = 2i + 1, čo označíme ako tvrdenie A\. Týmto sme ukázali platnosť implikácie B A±. Umocnením x na druhú dostaneme z A\ nasledujúce tvrdenie A2: x2 = (2i + l)2 = 4i2 + 4i + 1 = 2(2i2 + 2i) + 1 = 2m + 1. Vidíme, že pre m = 2i2 + 2i je x2 = 2m + 1 [x2 je nepárne, pretože x2 môžeme vyjadriť ako dvakrát nejaké prirodzené číslo plus 1). Dostali sme tvrdenie A, že x2 je nepárne. Máme nasledujúcu postupnosť implikácií: ~B => Ax => A2 => ~A x je nepárne =^x = 2i + l=^x = 2m + 1 =>• r je nepárne. Vieme, že x2 je párne, teda, že neplatí A. Vďaka tomu môžeme podľa schémy nepriameho dôkazu usúdiť, že nemôže platiť B. Preto platí B a našim cieľom bolo dokázať platnosť B. O} o o CN Dokonalosť pozostáva z maličkostí, a pritom dokonalosť nie je vôbec maličkosť. Michelangelo Buonarotti Kapitola 2 Algoritmika, alebo čo má spoločné programovanie a pečenie koláča? 2.1 Co sa tu dozvieme? Cieľom tejto kapitoly ešte nie je predstaviť niektorý z divov informatiky. Nemôžeme čítať a vychutnávať Shakespeara alebo Dostojevského v originále bez toho, aby sme neabsolvovali namáhavú cestu učenia sa anglického a ruského jazyka. Rovnako nemôžeme pochopiť informatiku a obdivovať jej myšlienky a objavy bez toho, aby sme sa naučili ovládať aspoň elementárne základy jej odborného jazyka. Ako sme sa už usilovali vysvetliť v predchádzajúcej kapitole, centrálnym pojmom informatiky je algoritmus. Našim cieľom v tejto kapitole ale nie je absolvovanie náročnej cesty výuky informatickej terminológie, ktorá je založená do značnej miery na ovládaní jazyka matematiky. Skôr sa pokúsime sprostredkovať hravým spôsobom, bez použitia matematického aparátu, intuitívne, a napriek tomu pomerne presne, čo sú a čo nie sú algoritmy. Začneme 32 KAPITOLA 2 všeobecne známou činnosťou - pečením koláča a budeme rozmýšľať a diskutovať o tom, do akej miery a za akých okolností môžeme recepty považovať za algoritmy. Po tomto úvode prejdeme priamo k počítačom a nazrieme na programovanie, ako na používanie jazyka na komunikáciu so strojmi. Takto predstavíme programy ako reprezentáciu algoritmov zrozumiteľnú pre počítače. Na konci tejto kapitoly budeme nielen chápať, čo znamená programovať, ale budeme dokonca schopní samostatne písať jednoduché programy a získame jasnú predstavu o tom, čo sa odohráva v počítači pri vykonávaní jednotlivých inštrukcií (počítačových príkazov). Popri tom sa aj naučíme, čo sú algoritmické úlohy (problémy), že našou úlohou je vyvinúť algoritmy, ktoré v každej z potenciálne nekonečne mnohých situácií pracujú správne a očakávaný výsledok vypočítajú v konečnom čase. Takto si postavíme most k tretej kapitole, v ktorej chceme ukázať, nakoľko je pre informatiku dôležité hlboké pochopenie pojmu nekonečna. V prvej kapitole sme už získali istú predstavu o tom, čo sa môže skrývať pod pojmami algoritmus a metóda. Naša predstava je približne takáto: Algoritmus je dobre zrozumiteľný opis činnosti, ktorý nás privedie k stanovenému cieľu. Inými slovami, algoritmus (metóda) nám poskytuje jednoznačne interpreto-vateľné pokyny, ako dospieť krok za krokom k vytýčenému cieľu. To je podobné ako pri receptoch na varenie a pečenie. Recept určuje presne, čo a v akom poradí treba vykonávať a nám neostáva nič iné, ako vykonávať opísanú činnosť presne krok za krokom. Do akej miery môžeme pokladať recept za algoritmus? Odpoveď na túto otázku nie je jednoduchá, a preto jej venujeme viac priestoru. Pri hľadaní správnej odpovede pochopíme presnejšie, čo sa v skutočnosti skrýva za slovom algoritmus. 2.2 Algoritmické pečenie Pozrime si najprv nasledujúci recept na pečenie marhuľového koláča priemeru 26 cm. 2.2 ALGORITMICKÉ PEČENIE 33 Suroviny: 3 vajíčkové bielka 1 štipka soli 6 polievkových lyžíc vody lOOg kryštálového cukru 3 vajíčkové žítka 1 čajová lyžička nastrúhanej citrónovej kôry 150g múky 1/2 čajovej lyžičky prášku na pečenie 400g odkôstkovaných a ošúpaných marhúľ Recept: 1. Uložte pergamenový papier do formy na pečenie! 2. Vyhřejte rúru na 180 °C! 3. Zohrejte 6 lyžičiek vody! 4. Zmiešajte tri bielka, štipku soli a 6 lyžičiek horúcej vody a ušľahajte z nich pevný sneh! 5. Pridajte postupne lOOg cukru a tri žítka Miešajte ich tak dlho, pokiaľ nevznikne pevná krémová masa! 6. Pridajte do krému 1 čajovú lyžičku nastrúhanej citrónovej kôry a premiešajte! 7. Zmiešajte 150g múky a polovicu čajovej lyžičky prášku na pečenie a pridajte k vyhotovenej mase. Premiešajte masu opatrne šľahačom! 8. Naplňte zmiešanou masou formu na pečenie! 9. Umiestnite ozdobne ošúpané polovice marhúľ na cesto! 10. Pečte koláč pri 160 °C 25 až 30 minút, pokiaľ nenadobudne svetlohnedú farbu! 11. Vyberte koláč z rúry a nechajte ho vychladnúť! Recept je napísaný a my sa spytujeme: Je skutočne každý schopný podľa tohto receptu upiecť koláč? Pravdepodobne správna odpoveď je, že úspech predsa len bude do značnej miery závisieť od kuchařových skúseností a vedomostí. Dospeli sme k bodu, keď je rozumné presnejšie sformulovať našu prvú požiadavku na definíciu pojmu algoritmus: 34 KAPITOLA 2 Algoritmy musia poskytovať taký presný opis činnosti, že podľa tohto opisu môže každý vykonávať úspešne danú činnosť, aj keď vôbec nerozumie dôvody, prečo vedie presné vykonávanie pokynov algoritmu k vytýčenému cieľu. Pritom opis musí byť natoľko jednoznačný, že nemôže dôjsť k rôznym interpretáciám jednotlivých pokynov (príkazov) algoritmu. Nezávisle od toho, kto algoritmus vykonáva, príslušná činnosť a aj jej výsledok musia byť tie isté. To znamená, že každý používateľ algoritmu musí dospieť k tomu istému výsledku. Teraz by sme mohli začať dlhú diskusiu o tom, ktoré z uvedených 11 krokov (príkazov) nášho receptu možno pokladať za zrozumiteľné a jednoznačne interpretovateľné. Napríklad by sme sa mohli začať pýtať: - Čo znamená ušľahať pevný sneh (krok 4)? - Čo znamená opatrne premiešať (krok 7)? - Čo znamená ozdobne uložiť (krok 9)? - Čo znamená dosiahnuť svetlohnedú farbu (krok 10)? Skúsená kuchárka by mohla povedať: „Všetko je úplne jasné, jednoduchšie to už ani nemožno opísať." Ale niekto, kto sa prvýkrát v živote chystá piecť koláč, sa ešte stále môže cítiť neistý a potrebuje radu a pomoc. A to napriek tomu, že náš recept je opísaný jednoduchšie ako vo väčšine kuchárskych kníh. Čo si myslíte o typických pokynoch (príkazoch) bežných receptov, ako napríklad • Zmiešajte bez otáľania mierne ochladenú želatinu a kyslé mlieko a dobre ich premiešajte! Samozrejme nemôžeme sa uspokojiť s tým, že náš recept budú považovať za algoritmus len skúsení kuchári a ostatní mu nebudú dostatočne rozumieť. Dá sa prepísať recept tak, aby ho vnímali všetci ako algoritmus? Už vieme, že algoritmus je postupnosť takých príkazov, ktoré musí byť schopný každý správne zrealizovať. To znamená: Najskôr sa musíme dohodnúť na nejakom zozname činností (operácií), ktoré dokáže s istotou vykonávať každý záujemca o pečenie a varenie. Takýto zoznam musí obsahovať v prvom rade nasledujúce činnosti (príkazy), ktoré sú také jednoduché, že ich dokáže zvládnuť aj na tento účel skonštruo- 2.2 ALGORITMICKÉ PEČENIE 35 vaný robot, ktorý nemá tušenia o kuchárskom umení a nie je schopný improvizácie. • Nalej x lyžičiek vody (alebo inej tekutiny) do nádoby! • Rozdeľ vajíčko na žítko a bielko! • Zohrej rúru na x °C • Peč v rúre y minút pri teplote x °C! • Odváž x gramov múky a daj ju do nádoby! • Nalej x litrov mlieka do konvice! • Var y minút! • Miešaj so šľahačom x minút! • Zmiešaj obsah dvoch nádob. Určite vám príde na um ešte množstvo ďalších aktivít, ktoré môžeme pokladať za tak jednoduché, že takmer každý, kto chce piecť a variť, je schopný ich vykonávať bez pomoci. Našou nasledujúcou úlohou je prepísať aspoň časť nášho receptu tak, aby recept pozostával len z jednoduchých činností. Vyskúšajme to s krokom 4 nášho receptu. Tento krok prepíšeme na postupnosť siedmych jednoduchších krokov. 4.1 Daj tri žítka do nádoby G! 4.2 Daj lg soli do nádoby G! 4.3 Daj 6 lyžičiek vody do hrnca T! 4.4 Zohrej vodu v hrnci T na 60 °C. 4.5 Prelej vodu z hrnca T do nádoby G! V tomto okamihu ale nie je jasné ako zrealizovať nasledujúci príkaz: „Ušľahaj z nich pevný sneh!". Našou úlohou je miešať dovtedy, pokiaľ sneh z bielok nebude pevný. Jedna z možností je, na základe skúseností odhadnúť čas miešania. Ak trvá približne 2 minúty pokým je sneh pevný, tak môžeme použiť nasledovný príkaz. 4.6 Miešaj obsah nádoby G dve minúty! Takýto príkaz má ale aj svoje riziká. Čas vyhotovenia pevného snehu závisí od toho, ako rýchlo a s akými pomocnými prostriedkami kuchár mieša. Asi by nám bolo milšie prestať miešať približne vtedy, keď obsah nádoby dostatočne 36 KAPITOLA 2 o o CN spevnel. Čo na to potrebujeme? Okrem schopnosti vykonávať isté činnosti, musíme byť schopní vykonávať aj testy a v závislosti od výsledku testu prijať rozhodnutia, ako v práci ďalej pokračovať. Testovanie nám umožní rozpoznať okamih, keď sa sneh stáva pevným. Ak pri testovaní zistíme, že sneh nie je dostatočne pevný, tak budeme ešte istý čas pokračovať v šľahaní, a potom znova testovať. Ak pri testovaní zistíme, že sneh je dostatočne pevný, ukončíme prácu na realizácii kroku 4 a pokračujeme s prácou na uskutočnení príkazu 5. Ako sa dá tento postup zapísať ako postupnosť jednoduchých príkazov? Napríklad nasledovne. 4.6 Miešaj obsah nádoby G po dobu lOs.! 4.7 Otestuj, či je obsah nádoby G pevný! Ak ÁNO, pokračuj krokom 5! Ak NIE, pokračuj krokom 4.6! Ř '4.5 4.6 Obsah G šľahaj lOs obr. 2.1 Pri tomto postupe sa k miešaniu v 4.6 vraciame tak dlho, pokiaľ nedosiahneme vytýčený stav snehovej masy. V odbornej terminológii informatiky nazývame časť opisu 4.6 a 4.7 cyklom, v ktorom sa opakuje činnosť 4.6 tak 2.2 ALGORITMICKÉ PEČENIE 37 dlho, pokiaľ nie je splnená podmienka 4.7. Pre lepšiu predstavu často používame grafickú reprezentáciu, ako na obrázku 2.1. Grafickú reprezentáciu nazývame diagram. Dá sa ale test 4.6 tak ľahko realizovať? Rovnako ako v prípade jednoduchých akcií, sa musíme najprv dohodnúť na starostlivo zvolenom zozname jednoduchých testov. Test 4.6 sa dá napríklad jednoducho zrealizovať tak, že nožom sa pokúsime bielkovu masu rozrezať, ak sa to podarí, sneh už je pevný. Za jednoduché testy môžeme považovať napríklad nasledovné overovania: • Over, či tekutina v hrnci má aspoň x °C! • Over, či v mase v nádobe bude „stáť lyžička"! • Váži obsah nádoby práve x g? Úloha 2.1 Vyberte z vašej kuchárskej knihy recept na zhotovenie vášho obľúbeného jedla. Zostavte vlastný zoznam jednoduchých činností a testov a prepíšte Váš recept tak, aby absolvoval len jednoduché aktivity z Vášho zoznamu! Úloha 2.2 Vašou úlohou je zohriať 11 vody na 90 °C. K dispozícii máte nasledovné operácie: • Postav hrniec T na x sekúnd na horúcu platňu a potom ho z platne odstav! • Nalej x litrov vody do hrnca T! K dispozícii máte tiež nasledujúci test: • Má voda v hrnci aspoň x °C? Napíšte algoritmus na zohriatie 1 litra vody na 90 °C len pomocou vyššie uvedeného testu a príkazov! Pritom musíte zabezpečiť, aby voda po dosiahnutí 90 °C neostala stáť na platničke dlhšie ako 15 sekúnd. Či veríte alebo nie, ak ste vyriešili tieto dve úlohy, tak ste už trocha programovali. To najdôležitejšie, čo sme sa naučili pri pečení marhuľového koláča je, že o algoritmoch nemôžeme hovoriť, pokiaľ najskôr jednoznačne neurčíme, čo sú základné kamene, z ktorých môžeme algoritmy vytvárať. Základnými stavebnými prvkami algoritmov sú na jednej strane jednoduché činnosti, ktoré je každý bezpochyby schopný zrealizovať a na druhej strane jednoduché testy, ktoré vie uskutočniť takisto každý. 38 KAPITOLA 2 2.3 A ako je to s algoritmami pre počítač? V tejto časti bude našim cieľom upresniť naše predstavy o tom, čo je algoritmus prostredníctvom skúmania podobností a rozdielov medzi algoritmickým varením a algoritmickým počítaním na počítači. Presne tak, ako pri varení, musíme sa aj pri počítačových algoritmoch najprv dohodnúť na nejakom zozname základných činností (operácií), ktoré počítače vedia vykonávať. Počítače nemajú inteligenciu a ani schopnosť improvizovať. To značne zjednodušuje našu úlohu, pretože vďaka tomu musí byť reč počítačov veľmi jednoduchá. Nikto nepochybuje o tom, že počítače môžu sčítavať, odčítavať, násobiť a deliť čísla a tiež čísla navzájom porovnávať. V prvom prípade zvykneme v informatickej terminológii hovoriť o aritmetických operáciách s číslami, ktoré ovláda v podstate každá kalkulačka. Tieto jednoduché operácie spolu so schopnosťou čítať vstupné údaje a vypisovať výsledky postačujú na to, aby sme každý algoritmus dokázali zapísať ako postupnosť takýchto operácií (akcií). •Or Pozorujeme teda, že kuchárske algoritmy a aj počítačové algoritmy nie sú ničím iným, ako postupnosťami jednoduchých úkonov (operácií). Medzi receptami a algoritmami v informatike existuje ale jeden podstatný rozdiel. Recepty ako algoritmy pečenia majú ako vstup suroviny a výsledkom je koláč. Jediný ich možný vstup je presný zoznam surovín potrebných na pečenie daného koláča. Pri algoritmických problémoch je to inak. Už vieme, že algoritmický problém v typickom prípade pozostáva z nekonečného množstva prípadov daného problému. Príklad algoritmického problému je riešenie kvadratických rovníc v tvare ax2 + bx + c = 0. Vstupom sú tri čísla a, b a c, ktoré jednoznačne opisujú danú kvadratickú rovnicu, a ktoré predstavujú jednotlivé vstupy pre spracovanie kvadratickej rovnice. Úlohou je nájsť všetky také čísla x, ktoré túto rovnicu spĺňajú. Konkrétnym prípadom tohto problému je napríklad nasledujúca kvadratická rovnica: x2 - 5x + 6 = 0. Máme a = 1,6 = —5 a c = 6. Riešeniami tejto rovnice sú x\ = 2 a x2 = 3. Dosadením môžeme ľahko overiť, že 22-5-2 + 6 = 4-10+ 6 = 0 32-5-3 + 6 = 9-15+ 6 = 0 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 39 a teda, že xx a x2 sú skutočne riešeniami kvadratickej rovnice x2 — 5x + Q = 0. Pretože existuje nekonečne veľa čísel, máme aj nekonečne veľa možností, ako zvoliť koeficienty kvadratickej rovnice a, b a c. Od algoritmov na riešenie kvadratických rovníc požadujeme, aby vedeli vypočítať riešenie pre každé a, b a c, teda pre každú kvadratickú rovnicu. Dopracovali sme sa k druhej základnej požiadavke na formuláciu definície algoritmu. Algoritmus na riešenie výpočtovej úlohy (problému) musí zaručovať korektné spracovanie každého možného prípadu problému. Korektné spracovanie znamená, že algoritmus pre každý vstup vypočíta v konečnom čase správny výsledok. Uvažujme teraz nejaký algoritmus na riešenie kvadratických rovníc. Z matematiky poznáme nasledovné vzorce na výpočet riešení: -b + \Jb2 - Aac Xl = 2a -b - Vb2 - Aac X2 = -2a-' ak b2 — Aac > 0. Ak b2 — Aac < 0, neexistuje žiadne reálne1 riešenie danej rovnice. Tieto vzorce poskytujú nasledovnú všeobecnú metódu na riešenie kvadratických rovníc. Vstup: Čísla a, b a c reprezentujúce kvadratickú rovnicu ax2 + bx + c = 0. Krok 1: Vypočítaj hodnotu b2 — Aac. Krok 2: Ak b2 - Aac > 0, tak vypočítaj -b + Vb2 - Aac ~ 2a ' -b - Vb2 - Aac . ^2 =-Ta-• Krok 3: Ak b2 — Aac < 0, napíš „Neexistuje žiadne reálne riešenie". Uverme teraz matematikom, že táto metóda skutočne funguje. Na to, aby sme ju vedeli prepísať do formy počítačového algoritmu to aj tak nepotrebujeme vedieť. 1 Dôvodom je, že nemôžeme odmocnit' záporné číslo. 40 KAPITOLA 2 V skutočnosti chceme napísať túto metódu ako program. Pod pojmom program rozumieme postupnosť počítačových inštrukcií, ktoré sú napísané v tvare, ktorý je pre počítač zrozumiteľný. Medzi pojmami „program" a „algoritmus" existujú dva principiálne rozdiely. 1. Program nemusí byť reprezentáciou nejakého algoritmu. Program môže byť aj nezmyselná postupnosť inštrukcií, ktorá nevedie k žiadnemu cieľu. 2. Algoritmus nemusí byť vždy zapísaný vo formálnom jazyku počítača, pod ktorým rozumieme nejaký programovací jazyk. Algoritmus môžeme popísať aj v prirodzenom jazyku, alebo v metajazyku matematiky. Napríklad pokyny „vynásob a a 6" alebo „vypočítaj y^" su prípustné pri opise algoritmu, zatiaľ čo v prípade programu musia byť tieto pokyny zapísané vo formalizme daného programovacieho jazyka. Poznamenajme, že prvý rozdiel je kľúčový a poukazuje na to, že algoritmus vždy spájame s výpočtovou úlohou, ktorú rieši. Program nemusí byť nevyhnutne spojený s riešením nejakého problému, ide len o postupnosť korektne zapísaných počítačových inštrukcií. Druhý rozdiel je len našou dohodou, že algoritmy smieme zapisovať jednoduchšie, aj bez použitia formálnych jazykov. V podstate ale vyžadujeme, aby sa dal každý algoritmus formálne presne napísať vo forme programu. Pod programovaním2 rozumieme činnosť, pomocou ktorej prepisujeme algoritmy do formy programov. Aby sme pochopili, ako pracuje počítač, a aby sme tiež videli, ako možno dosiahnuť zložité spracovanie informácií pomocou postupnosti veľmi jednoduchých operácií, budeme teraz trochu programovať. Tak ako pri pečení a varení, začneme zostavovaním listiny obsahujúcej všetky povolené základné operácie (činnosti). Operácie budeme zapisovať v tvare nášho programovacieho jazyka „NÁZORNÝ", ktorý sme vyvinuli kvôli názornej prezentácii. Vysvetľujúc význam jednotlivých inštrukcií, ukážeme, ako možno jednoducho modelovať počítač a čo presne sa v tomto počítačovom modeli odohráva pri vykonávaní jednotlivých inštrukcií. Počítač si predstavíme do istej miery idealizované tak, ako je nakreslený na obrázku 2.2. Počítač pozostáva z nasledujúcich častí: 2V širšom zmysle môžeme pod programovaním rozumieť nielen implementáciu algoritmu, ale i vývoj algoritmu na riešenie úlohy spolu s jeho implementáciou v danom programovacom jazyku. O} o o CN 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 41 DC o o CN vstupné hodnoty zoradené v rade čítanie vstupu _*_ Register(0) M CPU Vykonávanie inštrukcií N < program zapísaný v riadkoch 1 2 m zapisovanie / tlač POČÍTAČ Pamäť Re{ ^ister(l) Re{ ;ister(2) Re{ ;ister(3) Re{ lister (4) Re{ rister(5) Re{ rister(6) obr. 2.2 • Pamäť, ktorá pozostáva z veľkého počtu pamäťových jednotiek. Tieto pamäťové jednotky nazývame registre. Registre sú očíslované kladnými celými číslami (obr. 2.2). Každý register môže byť použitý na zapamätanie jedného čísla. Na začiatku výpočtu obsahujú všetky registre číslo 0. Poradové číslo registra nazývame jeho adresou. Napríklad číslo 112 je adresou registra Register(112). Môžeme si to predstaviť ako ulicu s postupne očíslovanými domami len na jednej strane. • Špeciálny register Register (0), ktorý obsahuje číslo riadku programu, ktorý sa práve spracováva, alebo sa má práve začať spracovávať. • Špeciálna pamäť na zapamätanie programu. Program pozostáva z riadkov a každý riadok obsahuje práve jednu počítačovú inštrukciu. • Centrálna procesorová jednotka, nazývaná CPU. CPU je prepojená komunikačnými kanálmi so všetkými časťami počítača. CPU pracuje v takzvaných CPU cykloch. Na začiatku cyklu si najprv prečíta aktuálny riadok programu, ktorého poradové číslo je v registri Register (0). Potom si nechá poslať údaje (pamäťové obsahy) tých registrov, ktoré sú 42 KAPITOLA 2 argumentami v danej operácii. Na zaslaných údajoch vykoná danú operáciu a uloží výsledok do vyznačeného registra. Nakoniec zmení obsah registra Register(0) tak, aby obsahoval číslo toho riadku programu, ktorý sa má vykonať v nasledujúcom cykle. Okrem toho je počítač spojený so svojim okolím. Vstupné údaje (čísla) čakajú v rade a počítač si môže vždy prečítať prvý údaj (číslo) v rade a zapamätať ho v nejakom registri. Počítač má tiež takzvanú výstupnú pásku, na ktorú môže vypisovať výsledky. Pozrime sa ešte raz na podobnosť s kuchynskými receptami. Hardware počítača je kuchyňa. Registre pamäte sú nádoby ľubovoľného druhu: hrnce, misky, poháre, taniere, atď. Každá nádoba má svoje jednoznačné meno, rovnako ako majú registre svoje adresy. Takže je vždy jasné, o ktorej nádobe sa hovorí. Pamäť s programom je stránka papiera, na ktorom je napísaný recept. CPU sme my, alebo kuchynský robot so všetkými zariadeniami a nástrojmi, ako rúra, šľahač, mikrovlnka, platničky, atď., ktoré sú k dispozícii. Obsah registra Register (0) je pre nás aktuálna poznámka o tom, kde sa práve pri vykonávaní receptu nachádzame. Vstupy ležia v chladničke, mrazničke, alebo v špajzi. V bežnom prípade síce suroviny nie sú usporiadané do radu, ako naše vstupy. Ale nič nám nebráni pred varením povyberať všetky suroviny a postaviť ich do radu podľa poradia, v ktorom ich budeme potrebovať. Výstup nezapíšeme na pásku, ale položíme na jedálenský stôl. Pri pečení a varení sme sa naučili, že prvým a zároveň hlavným krokom k špecifikácii pojmu algoritmus je dohodnúť sa na zozname realizovateľných inštrukcií (pokynov, činností, operácií). O ich vykonateľnosti musíme byť všetci presvedčení. V nasledujúcom budeme zo všetkých uvedených synonym uprednostňovať pojem inštrukcie. Počítačové inštrukcie opíšeme radšej v prirodzenom jazyku ako v jazyku počítača v takzvanom počítačovom kóde. Začnime s operáciami čítania. (1) Načítaj do Register(n). Realizovať túto operáciu, znamená zapamätať si v n-tom registri prvé číslo zo vstupného radu. Pritom sa toto číslo zo vstupného radu vymaže a na prvú pozíciu v rade sa dostane doteraz druhé číslo vstupného radu. Príklad 2.1 V rade čakajú tri čísla 114, -67 a 1. (pozri obr 2.3). V pamäti obsahujú všetky registre číslo 0. Register (0) obsahuje číslo 3. Teraz ideme realizovať nasledovnú inštrukciu Načítaj do Register(3) 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 43 z tretieho riadku programu. Po jej zrealizovaní obsahuje Register (3) číslo 114, ktoré stálo prvé vo vstupnom rade. Vo vstupnom rade čakajú ešte -67 a 1. Obsah registra Register(O) sa zvýši o 1 na 4, pretože po vykonaní inštrukcie tretieho riadku má počítač pokračovať vykonávaním inštrukcie v nasledujúcom, štvrtom riadku. Priebeh vykonávania tejto inštrukcie je znázornený na obrázku obr. 2.3. Na tomto obrázku neznázorňujeme celý počítač, ale sústredíme sa len na pamäť a vstupný rad, ktorých obsahy sa menia v priebehu vykonávania inštrukcie čítania. -67 114 (a) Register(0) 3 Register(1) 0 Register(2) 0 Register(3) 0 Register(4) 0 Register(5) -67 Register(0) Register(1) Register(2) Register(3) Register(4) Register(5) (b) obr. 2.3 "V 114 □ Nasledujúca inštrukcia nám umožňuje uložiť do registrov konkrétne čísla bez toho, aby sme ich museli čítať zo vstupného radu. (2) Register(n) k Tento príkaz požaduje, aby sme si v n-tom registri zapamätali (do n-tého registra uložili) číslo k. Pri realizácii tejto inštrukcie sa pôvodný obsah n-tého registra vymaže. Vstupný rad sa nemení. 44 KAPITOLA 2 Príklad 2.2 Register Register(50) obsahuje číslo 100. Po vykonaní in štrukcie Register(50) <— 22 obsahuje Register (50) číslo 22. Bývalý obsah 50-teho registra, hodnota 100, sa vymaže bez toho, aby sa niekde inde zapamätal. Jeho pôvodný obsah sa definitívne stratí. Ak je nasledujúca inštrukcia Načítaj do Register(50) a ako prvé je vo vstupnej rade číslo 7, tak vykonaním tejto inštrukcie prepíšeme číslo 22 v 50-tom registri na číslo 7. □ Úloha 2.3 Vo vstupnom rade sú čísla 11, 12, a 13. Obsah registra Register(O) je 1. Register(2) obsahuje číslo 1117 a Register(3) obsahuje číslo 21. Všetky ostatné registre obsahujú číslo 0. a) Načrtnite túto situáciu (stav počítača) podobne ako na obrázku obr. 2.3. b) Vykonajte nasledujúci program: 1 Načítaj do Register(l) 2 Register(2) <- 100 3 Načítaj do Register(3) 4 Načítaj do Register(2) Vypíšte obsahy všetkých registrov a vstupnej rady po vykonaní jednotlivých inštrukcií. Teraz predstavíme aritmetické operácie, ktoré je schopný vykonávať náš počítačový model. (3) Register(n) <— Register(j) + Register(i) Jej význam je takýto. Spočítaj obsahy registrov Register (i) a Register (j) a výsledný súčet ulož do registra Register(n). Pri vykonávaní tejto inštrukcie sa pôvodný obsah n-tého registra prepíše výsledkom sčítania. Ostatné registre nemenia svoj obsah. Výnimkou je len Register (0), ktorého obsah sa zvýši o 1, čo znamená, že vykonávanie programu pokračuje v nasledujúcom riadku. Vstupný rad zostáva takisto nezmenený. Príklad 2.3 Uvažujme situáciu, v ktorej máme číslo 5 v registri Register (0) a každý Register (i) obsahuje číslo i pre i = 1,2,3,4,5 (obr. 2.4a). Všetky 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 45 ostatné registre obsahujú číslo 0. Piaty riadok programu obsahuje nasledujúcu inštrukciu: Register(ľ) <— Register(l) + Register(4) Obrázok 2.4b ukazuje situáciu, ktorá nastane po vykonaní tejto operácii sčítania. Register(0) Register(1) Register(2) Register(3) Register(4) Register(5) Register(6) Register(7) (a) Register(0) Register(1) Register(2) Register(3) Register(4) Register(5) Register(6) Register(7) (b) obr. 2.4 Číslo 1 z prvého registra a číslo 4 zo štvrtého registra sa sčítajú (1+4=5) a do siedmeho registra sa uloží výsledok 5. Obsahy registrov Register (1) a Register (4) sa pritom nezmenia. Obsah 0-tého registra sa zvýši z 5 na 6. Predstavme si situáciu, keď je v šiestom riadku programu nasledujúca inštrukcia: Register(ľ) <— Register(l) + Register(7). Obsah prvého registra je 1 a obsah siedmeho registra je 5. To znamená, že počítač spočíta 1+5=6 a do siedmeho registra uloží číslo 6. Tým pádom sa vymaže pôvodný obsah 5 siedmeho registra. Na tomto príklade vidíme, že výsledok sčítavania smieme uložiť tiež do jedného z tých registrov, v ktorých 46 KAPITOLA 2 sa pôvodne nachádzali sčítance. Pritom samozrejme stratíme pôvodnú hodnotu jedného zo sčítancov. □ Úloha 2.4 Uvažujme situáciu po vykonaní prvého sčítania (piateho riadku) v príklade 2.3. Táto situácia je znázornená na obrázku obr. 2.4b. Načrtnite zodpovedajúcu situáciu po vykonaní druhého sčítania v šiestom riadku programu. Potom vykonajte nasledujúce tri operácie: 7 Register(3) <- 101 8 Register(3) <- Register(3) + Register(3) 9 Register(3) <- Register(7) + Register(3) Vypíšte stav pamäte, aký bude na konci, po vykonaní všetkých týchto inštrukcií. Podobne ako súčet môžeme realizovať aj nasledujúce aritmetické operácie: (4) Register(n) <— Register(j) - Register(i) Vykonanie tejto operácie znamená, že sa odčíta obsah ž-teho registra od obsahu j-teho registra a výsledok sa uloží do n-tého registra. (5) Register(n) <— Register(j) * Register(i) Obsah registrov Register(j) a Register(i) sa vynásobí a výsledok sa uloží do n-tého registra. (6) Register(n) <— Register(j) / Register(i) Obsah j-teho registra sa vydelí obsahom ž-teho registra a výsledok sa zapamätá v n-tom registri. (7) Register(n) <— A/Register(n) Vypočíta sa odmocnina čísla uloženého v n-tom registri a výsledok sa uloží do n-tého registra.3 Úloha 2.5 Vo všetkých registroch okrem registra Register (0) je uložené číslo 0. Register (0) obsahuje číslo 1. Vo vstupnom rade stoja dve čísla a a b. Vysvetlite vlastnými slovami, aký výsledok je uložený v treťom registri po vykonaní nasledujúceho programu. 3Vypočítanie odmocniny nepatrí medzi bežné základné počítačové operácie. My ju zahrnieme do nášho základného zoznamu operácií, pretože ju potrebujeme pre výpočet riešení kvadratických rovníc. Samozrejme, že počítač je schopný vypočítať odmocninu daného čísla. Tento výpočet sa ale realizuje pomocou programu, ktorý je zostavený len zo základných aritmetických operácií. 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 47 1 Načítaj do Register(l) 2 Register(l) <— Register(l) * Register(l) 3 Načítaj do Register(2) 4 Register(2) <- Register(2) * Register(2) 5 Register(3) <— Register(l) + Register(2) Podobne ako v kuchárskych receptoch, ani v počítačových algoritmoch, nebude stačiť len vykonávanie istých činností, akými sú v počítači napríklad aritmetické operácie. Potrebujeme tiež možnosť testovať a na základe výsledkov testu určiť ďalší postup. V podstate nám stačia nasledovné dva základné testy: (8) Ak Register(n) = 0, tak pokračuj v riadku j O Ak sa obsah n-tého registra rovná 0, tak počítač uloží do 0-tého registra číslo j, a tým pádom pokračuje vykonávaním inštrukcie v j-tom riadku. Ak je obsah n-tého registra rôzny od nuly, počítač k obsahu 0-tého registra pripočíta jednotku, a tým pádom pokračuje v nasledujúcom riadku. (9) Ak Register (n) < Register (m), tak pokračuj v riadku j Ak obsah n-tého registra nie je väčší ako obsah m-tého registra, tak do 0-tého registra uložíme číslo j a počítač pokračuje vykonávaním inštrukcie v j-tom riadku. V opačnom prípade program pokračuje vykonávaním inštrukcie v nasledujúcom riadku. Inštrukcia (10) Pokračuj v riadku j je bezpodmienečným príkazom na pokračovanie vykonávania programu v j-tom riadku. Okrem predchádzajúcich inštrukcií potrebujeme ešte príkazy na vypisovanie výsledkov. (11) Výstup <— Register(j) Obsah j-teho registra sa vypíše na výstupné médium. (12) Výstup <- „Text" Na výstupné médium sa vypíše Text v úvodzovkách. Napríklad príkaz Výstup <- „Ahoj" 48 KAPITOLA 2 spôsobí, že sa na výstupné médium napíše „Ahoj" (na výstupnej páske sa objaví text „Ahoj"). Posledná operácia je (13) End Táto operácia znamená definitívne ukončenie práce počítača na vykonávaní príkazov daného programu. Už sme pokročili dosť ďaleko na to, aby sme mohli naprogramovať algoritmus na riešenie kvadratických rovníc. Informáciu o zmenách obsahu jednotlivých registrov kvôli prehľadnosti uvádzame v kučeravých zátvorkách. Vstup: Čísla a, b, c Program: 1 Načítaj do Register(l) {Register(1) obsahuje a} {Register(2) obsahuje b} 3 Načítaj do Register(3) {Register(3) obsahuje c} 4 Register(4) <— 2 5 Register(5) <— 4 6 Register(6) <-N--l {Stav pamäti je znázornený na obrázku obr. 2.5} 7 Register(ľ) <— Register(2) * Register(2) {Register(7) teraz obsahuje b2} 8 Register(8) <— Register(5) * Register(l) {Register(8) obsahuje 4a} 9 Register(8) <— Register(8) * Register(3) {Register(8) obsahuje Aac] 10 Register(8) <— Register(ľ) - Register(8) {Register (8) teraz obsahuje b2 — Aac a tým je ukončené vykonávanie prvého kroku metódy na riešenie kvadratických rovníc.} 11 Ak RegisterO) < Register(8), tak pokračuj v riadku 14 {Register(9) nebol zatiaľ použitý. Pretože doposiaľ nepoužité registre obsahujú vždy číslo 0, v prípade (keď má kvadratická rovnica riešenie) 2 Načítaj do Register(2) 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 49 Register(0) Register(1) Register(2) Register(3) Register(4) Register(5) Register(6) obr. 2.5 b2 — Aac > 0 sa presúva vykonávanie programu do riadku 14. Keď b2 — Aca < 0 (keď kvadratická rovnica nemá žiadne riešenie), pokračuje výpočet vykonávaním inštrukcie v nasledujúcom dvanástom riadku.} 12 Výstup <— „Neexistuje žiadne riešenie." 13 End {Po oznámení neexistencie riešenia ukončí program svoju prácu.} 14 Register(8) <— A/Register(8) {Register (8) obsahuje teraz číslo \/b2 — Aac.} 15 Register(ľ) <— Register(2) * Register(6) {Teraz obsahuje Register (7) číslo —b. Predchádzajúci obsah b2 tohto registra sa pritom vymazal.} 16 Register(6) <— Register(l) * Register(4) {Situácia je nakreslená na obrázku obr. 2.6.} 17 Register(ll) Register(7) + Register(8) Register(ll) / Register(6) 18 Register(ll) {Teraz obsahuje Register (11) prvé riešenie xx = 19 Výstup <— Register(11) 20 Register(12) <— Register(7) - Register(8) -b+Vb2-4ac 2a } •H >» O 50 KAPITOLA 2 Register(0 Register(1 Register(2 Register(3 Register(4 Register(5 Register(6 Register(7 Register(8 Register(9 17 2a -b vP —4ac 0 obr. 2.6 21 Register(12) <— Register(12) / Register(6) {Teraz obsahuje Register (12) druhé riešenie x2 = ~b~^n~4a~-} 22 Výstup <— Register(12) 23 End. Grafické znázornenie tohto programu nájdeme na obrázku obr. 2.7. Úloha 2.6 Určite obsah všetkých registrov po ukončení programu. Úloha 2.7 Ak platí b2 — 4ac = 0, tak existuje len jedno riešenie kvadratickej rovnice a teda x\ = x2. Upravte program tak, aby v tomto prípade vypísal text „Existuje len jedno riešenie a to" a príslušné číslo x\. V prípade b2 — 4ac > 0 chceme, aby program dodatočne vypísal text „Existujú dve riešenia". Úloha 2.8 Vysvetlite vlastnými slovami, čo počíta nasledovný program. 1 Načítaj do Register(l) 2 Načítaj do Register(2) 3 Načítaj do Register(3) 4 Register(4) <- Register(l) + Register(2) 5 Register(4) <— Register(3) + Register(4) 2.3 A AKO JE TO S ALGORITMAMI PRE POČÍTAČ? 51 Načítaj do Register(l) Načítaj do Register(2) Načítaj do RegisterQ) _l_ Register(4) <— 2 Register(5) <— 4 Register(6) <--1 | _ Register(7) <— Register(2)*Register(2) Register(8) <— Register(5)*Register(l) Register(8) <— Register(8)*Register(3) Register(8) <— Register(7)-Register(8) NIE ANO Výstup <— „Riešenie neexistuje" End Regií äter(8) <- - ^/Register(8) Regií äter(7) <- - Register(2)*Register(6) Regií äter(6) <- - Register(l)*Register(4) Regií äter(ll) Register(7)+Register(8) Regií äter(ll) ■— Register(ll)/Register(6) Výstup <— Register(ll) Register(12) <— Register(7)-Register(8) Register(12) <— Register(12)/Register(6) VjM^J^ Register(12)_ End obr. 2.7 6 Register(5) <- 3 7 Register(6) <— Register(4) / Register(5) 8 Výstup <— Register(6) 9 End O' Určite a v tabuľke znázornite vývoj obsahov jednotlivých registrov po každom kroku programu. Úloha 2.9 Napíšte program, ktorý pre dané číslo x vypočíta nasledovnú hodnotu: 3x2 -7x + 11. 52 KAPITOLA 2 Úloha 2.10 Napíšte program, ktorý pre dané 4 čísla a,b,c,x vypočíta hodnotu určí ich maximum (najväčšiu z týchto 4 hodnôt). Nieje nevyhnutnosťou zapísať každý algoritmus vo forme programu, len kvôli tomu aby sme sa presvedčili, že ide skutočne o algoritmus. Napríklad, keď je na prvý pohľad zrejmé, že metóda na riešenie kvadratických rovníc sa dá realizovať pomocou aritmetických operácií a testov na porovnávanie čísiel, a že táto metóda rieši každý prípad tejto úlohy, tak ju môžeme pokladať za algoritmus. Napísanie zodpovedajúceho programu (naprogramovanie algoritmu) považujeme za transformáciu zápisu algoritmu do reči počítača. Z formálneho matematického hľadiska ale možno považovať túto transformáciu prezentácie algoritmu za dôkaz strojovej (automatickej) realizovatelnosti daného algoritmu. 2.4 Ako neúmyselne zakliať program na večné bezvýsledné počítanie? Jednou z najdôležitejších požiadaviek na definíciu algoritmu na riešenie nejakého problému (úlohy) je, aby algoritmus vždy svoju prácu ukončil v konečnom čase a na výstup dal výsledok. V odbornej informatickej terminológii hovoríme o zastavení. Ak algoritmus A pracuje na vstupe x konečne dlho a potom svoju prácu na x definitívne ukončí, tak hovoríme, že algoritmus A zastaví na prípade problému x. Ak algoritmus A zastaví na každom možnom vstupe, tak hovoríme, že algoritmus A zastaví vždy. Vyjadrené slovami informatiky, od každého algoritmu vyžadujeme, aby vždy zastavil. Prirodzene môžete s počudovaním namietať: „To je predsa samozrejmé. Kto by už len vyvíjal programy, ktoré pracujú nekonečne dlho, dôsledkom čoho nikdy nedajú žiadny výstup?" Potrebujeme sa tým vôbec zaoberať? Problém je ale v tom, že nie je veľké umenie vyvinúť neúmyselne program, ktorý pre nejaké špeciálne, ale možné vstupy začne do nekonečna opakovať nejaký cyklus. Ako sa môže niečo také stať profesionálnemu programátorovi? Veľmi ľahko. Napríklad stačí ak zabudne zobrať do úvahy nejaké špeciálne situácie, ktoré môžu, síce zriedkavo, ale predsa len za istých okolností, nastať. Aby ax2 + bx + c. Úloha 2.11 Napíšte program, ktorý pre dané 4 čísla a, b, c, d vo vstupnom rade 2.4 NEÚMYSELNÁ NEKONEČNÁ ČINNOSŤ 53 o o CN sme videli, ako ľahko sa nám čosi také môže pritrafiť, vráťme sa k našim kuchárskym algoritmom. Naším cieľom je, aby voda zovrela, a potom ju použiť na prípravu čaju. Pritom chceme zaobchádzať opatrne s energiou a nenechať vodu vrieť zbytočne dlhšie ako 20 sekúnd. Na tento účel môžeme navrhnúť program znázornený na obrázku obr. 2.8. NIE Vodu v nádobe zohrievaj lOs Zavar vodou čaj End obr. 2.8 Na prvý pohľad sa nám zdá, že je všetko v poriadku a algoritmus pokladáme za funkčný. Ale len dovtedy, pokiaľ sa nerozhodne tento recept na varenie čaju použiť nejaký horolezec na vrchole Matterhornu. V tejto nadmorskej výške je nižší tlak, a teda voda vrie pri nižšej teplote a pri danom tlaku nemôže dosiahnuť teplotu 100°C. Takže test nášho programu nikdy nebude splnený. Samozrejme, že horolezec nebude v pravom slova zmysle variť čaj donekonečna, lebo buď sa mu minie palivo, alebo sa vyparí voda z hrnca. Všetci vidíme, kde sa stala chyba. Jednoducho sme pri písaní receptu nemysleli na túto špeciálnu situáciu. A presne to isté sa môže stať každému programátorovi, ak nemyslí neustále na všetky prípady danej úlohy a na všetky možné špeciálne situácie, ktoré môžu v priebehu výpočtov nastať. Z podobných dôvodov spadla už aj jedna raketa, lebo programátori nerátali s tým, že pri výpočtoch ich programov môžu vzniknúť také veľké čísla, ktoré sa nezmestia do 32-bitového registra. Na ukážku ale uvedieme jednoduchší príklad. 54 KAPITOLA 2 Príklad 2.4 Na začiatku obsahuje Register (0) číslo 1 a všetky ostatné registre obsahujú číslo 0. Vo vstupnom rade čakajú čísla a a b. Naprogramovali sme nasledujúci program. 1 Načítaj do Register(l) 2 Načítaj do Register(2) 3 Register(3) <--1 4 Ak Register(1) = 0, tak pokračuj v riadku 8 5 Register(l) <— Register(l) + Register(3) 6 Register(4) <— Register(4) + Register(2) 7 Pokračuj v riadku 4 8 Výstup <— Register(4) 9 End Zodpovedajúce grafické znázornenie programu nachádzame na obrázku obr. 2.9. ičítaj do Register (1) Načítaj do Register (2) Register(3) <--1 ÁNO NIE Výstup <— Register(4) End Register(1) <— Register (1) +Register(3) Register(4) ^Register (4) +Register(2) obr. 2.9 Úlohou algoritmu je vypočítať súčin a * b len pomocou sčítania a odčítania. V podstate náš program počíta b + b + b + ... + b. krát t.j. spočítava a-krát hodnotu b. 2.4 NEÚMYSELNÁ NEKONEČNÁ ČINNOSŤ 55 Úloha 2.12 Uvažujme konkrétne vstupy a = 3 a b = 7. Vykonajte výpočet programu na tomto vstupe. Zostavte tabuľku, ktorá ukazuje po každom kroku výpočtu (po vykonaní každej inštrukcie) stavy všetkých registrov. Ak a = 0, tak výsledok má byť a * b = 0 * b = 0. To sa aj naozaj stane, lebo a sa načíta do prvého registra a test vo štvrtom riadku potom vedie priamo do ôsmeho riadku, v ktorom program dá na výstup obsah štvrtého registra, čo je v tomto prípade číslo 0. Ak a > 1, pripočítame v šiestom riadku programu číslo b k obsahu štvrtého registra, v ktorom má na konci ostať definitívny výsledok. V piatom riadku programu pritom zmenšíme obsah prvého registra o hodnotu 1. V prvom registri bolo pôvodne uložené číslo a, a tak po i opakovaniach cyklu pre i < a je v prvom registri číslo a — i a vo štvrtom registri je uložené číslo b + b + ... + b = i-b. S-v-' i krát Ak „Register (1) = 0", tak po opustení cyklu vieme, že cyklus sme realizovali práve a-krát a teda Register (4) obsahuje hľadanú hodnotu: b + b + b + ... + b = a - b. "-v-' a krát > Takže vidíme, že sa nám podarilo vyvinúť program, ktorý dokáže násobiť dve čísla bez použitia operácie násobenia zo zoznamu našich základných operácií. To znamená, že keď z nášho zoznamu operácií vynecháme operáciu násobenia, neoslabíme schopnosti počítača, a teda ani nášho pojmu algoritmus. Program na obrázku obr. 2.9 má ale predsa jeden zádrhel'. Na začiatku sme povedali, že a a b sú celé čísla. Čo sa stane, ak je jedno z čísiel, alebo obe čísla a, b záporné? Ak je b záporné a a je kladné, cyklus sa zopakuje presne a-krát a dostaneme správny výsledok. Ak je ale a záporné, bude program donekonečna vykonávať cyklus. Prečo? Register(l) bude obsahovať na začiatku záporné číslo. V priebehu cyklu sa toto číslo bude vždy o jednotku zmenšovať, a teda obsah prvého registra sa nemôže nikdy zväčšiť na hodnotu 0. □ Úloha 2.13 Ako možno upraviť program z obrázku obr. 2.9 tak, aby korektne vynásobil dve čísla a a b pomocou sčítania a odčítania, aj v prípade, keď je číslo a záporné? Úloha 2.14 Pokúste sa napísať program, ktorý vypočíta pre dve kladné celé čísla a a b súčet a + 6, len pomocou nasledujúcich operácií 56 KAPITOLA 2 Register(i) <— Register(0+1 Register(j) <— Register(j)-1, ktoré zväčšujú alebo zmenšujú obsah registrov o jedna. Okrem týchto dvoch inštrukcií nie sú v programe dovolené žiadne iné aritmetické operácie. Nakoniec vidíme, že všetky algoritmy sa dajú prepísať do programu, ktorý používa len testovanie obsahu registra na O, pripočítanie a odpočítanie jednotky a vstupno-výstupné operácie. Z tohto uhla pohľadu nemožno mať žiadne pochybnosti o tom, že to, čo označujeme za algoritmy, možno naozaj automaticky realizovať na počítači. Zvyšok tejto kapitoly je venovaný len tým, ktorý by radi presnejšie vedeli, ako vyzerá skutočný repertoár príkazov počítača. Na začiatok upozorníme na to, že z nášho doterajšieho zoznamu treba vynechať operáciu počítania odmocniny. Na vypočítanie odmocniny nejakého čísla je nevyhnutné napísať program, ktorý ju vypočíta len pomocou základných aritmetických operácií +, —, * a /. Takýto program nebudeme písať, pretože to vyžaduje viac práce, ako by sa na prvý pohľad mohlo zdať. Na druhej strane nám ale chýba ešte zopár inštrukcií, ktoré na realizáciu istých úloh dokonca nevyhnutne potrebujeme. Uvažujme nasledujúcu úlohu. Ako vstup dostaneme postupnosť celých čísiel. Vopred ale nevieme koľko čísiel sa nachádza v tejto postupnosti. Koniec postupnosti rozpoznáme len vďaka dohode, že všetky čísla v postupnosti sú rôzne od nuly a samotné číslo O označuje koniec postupnosti. Našou úlohou je všetky čísla tejto postupnosti načítať a postupne uložiť do registrov Register(100), Register(101), Register(102), atď. To znamená, že i-te číslo postupnosti máme uložiť do registra s adresou 100 + i — 1. Tento proces máme ukončiť, ak načítame číslo 0. Pri písaní zodpovedajúceho programu by sme mohli vyskúšať začať nasledovným spôsobom. _ 1 Načítaj do Register(l) 2 Ak Register(1) = 0, tak pokračuj v riadku □ 3 Register(lOO) <— Register(l) 4 Načítaj do Register(l) 5 Ak Register(1) = 0, tak pokračuj v riadku □ 6 Register(lOl) <— Register(l) 7 Načítaj do Register(l) 2.4 NEÚMYSELNÁ NEKONEČNÁ ČINNOSŤ 57 o o CN 8 Ak Register(1) = 0, tak pokračuj v riadku □ 9 Register(102) <— Register(l) Naša stratégia bude takáto. Nasledujúce číslo zo vstupného radu vždy prečítame do Register (1) a keď je toto číslo rôzne od nuly, tak ho uložíme do najbližšieho voľného registra od adresy 100 smerom nahor. Jedinou otázkou je, ako pokračovať ďalej. Keď je vstupná postupnosť 17, —6, 0, musíme prácu ukončiť. Ak má ale vstupná postupnosť 10000 čísiel, mal by mať náš program 30000 riadkov. Nevieme ale, kedy máme ukončiť písanie programu, a teda ani nevieme, do ktorého riadku máme napísať inštrukciu END. Preto sme použili v programe označenie □, lebo sme jednoducho nevedeli, do ktorého riadku môžeme END uložiť. Jedno je ale jasné. Nemôžeme napísať nekonečný program. Východiskom by mohlo byť použitie cyklu znázorneného na obrázku obr. 2.10. > 'y Načí^aj^ tegister(l) obr. 2.10 Problém je len v tom, že nevieme, v ktorom registri Register (A) máme uložiť práve načítané číslo. Adresa A nemôže byť stále tá istá, pretože si chceme zapamätať všetky čísla postupnosti, teda každé číslo na inú adresu. V podstate máme v i-tom prechode cyklom uložiť naposledy prečítané číslo do registra s adresou 100 + i — 1. To ale nemôžeme zrealizovať, pretože naše inštrukcie nám umožňujú nahradiť symbol A len jedným konkrétnym číslom, ktoré sa nemení. Z týchto dôvodov majú počítače v základnom vybavení inštrukcie takzvanej nepriamej adresácie. Vykonanie inštrukcie 58 KAPITOLA 2 (14) Register(Register(i)) <— Register(j) pre adresy i a j spôsobí, že sa obsah j-tého registra uloží do registra, ktorého adresa je obsahom i-teho registra. Je to komplikované? Pozrime sa na to na konkrétnom príklade. Nech obsah registra Register (3) je 112 a obsah siedmeho registra je 24. Počítač má vykonať príkaz. Register(Register(3)) <— Register(7). Najprv si počítač pozrie obsah tretieho registra a zistí, že tento obsah je 112. Potom už len vykoná nám známy príkaz. Register(112) <— Register(7). Takže číslo 24, ktoré je obsahom siedmeho registra sa zapamätá v registri Register(112). Okrem nového obsahu 24 v 112-tom registri sa nemení obsah žiadneho registra okrem nultého, ktorého hodnota sa ako zvyčajne zvýši o 1. Úloha 2.15 Pre väčšinu doteraz predstavených počítačových inštrukcií existuje variant s nepriamou adresáciou. Pokúste sa sami vysvetliť význam nasledujúcich príkazov: a) Register(k) <— Register(Register(m)) b) Register(Register(i)) <— Register(Q*Register(j). Pomocou nepriamej adresácie sa dá vyriešiť aj náš problém, keď si chceme zapamätať neznámy počet údajov. Riešením je program na obrázku 2.11. V druhom registri máme stále uloženú aktuálnu adresu, na ktorú chceme uložiť nasledujúce číslo zo vstupného radu. Na začiatku do druhého registra uložíme adresu 100 a po každom zapamätaní ďalšieho čísla, zvýšime o jednotku obsah druhého registra. Číslo 1 je po celý čas uložené v treťom registri. Úloha 2.16 Vo vstupnom rade čakajú čísla 113,-2,20,8,0. Simulujte krok po kroku program na obrázku 2.11 a načrtnite pritom aktuálne obsahy registrov s adresami 0, 1, 2, 3, 100, 101, 102, 103, 104 a 105. Predpokladáme, že začiatku všetky registre obsahujú číslo 0. 2.5 Zhrnutie, alebo čo sme sa tu naučili Či mi to veríte, alebo nie, ak ste úspešne vyriešili sformulované úlohy, tak ste už aj trochu programovali, a teda ste si aj vybudovali akú-takú predstavu 2.5 ZHRNUTIE 59 _I_ Register(3) <- 1 Register(2) <- 101 Načítaj do Register (1) ÁNO _L_ End Register(Register(2)) <— Register(l) T Register(2) ^Register(2) + Register(3) Načítaj do Register(l) obr. 2.11 o tom, čo to znamená pracovať ako programátor. To ale nebolo hlavným cieľom tejto kapitoly. Naším cieľom bolo ujasniť si význam pojmu algoritmus v zmysle formalizácie pojmu metódy. Pochopili sme, že naše očakávania na definíciu tohto pojmu zodpovedajú nasledujúcim požiadavkám: 1. Metóda ako algoritmus na riešenie nejakého problému sa musí dať úspešne aplikovať aj keď jej užívateľ nie je expertom na riešenie daného problému. Jednoducho netreba rozumieť prečo algoritmus dosiahne stanovený cieľ. Stačí, ak vieme vykonávať jednoduché činnosti, z ktorých je algoritmus zostavený. V definícii algoritmu musia byť uvedené v zozname inštrukcií a musí platiť všeobecný konsenzus o tom, že každá z týchto inštrukcií (činností) je taká jednoduchá, že sa dá vykonávať automaticky (strojom). 2. Algoritmus nenavrhujeme s cieľom vyriešiť nejaký špecifický prípad problému. Algoritmus na riešenie daného problému musí byť schopný úspešne riešiť všetky možné prípady problému, ktorých je bežne nekonečne veľa. (Na zopakovanie: Problém je všeobecne postavená úloha, ako triedenie čísiel, alebo riešenie kvadratických rovníc. Prípad 60 KAPITOLA 2 problému je konkrétna úloha ako „Usporiadaj vzostupne čísla 1, 7, 3, 2, 8" alebo „Nájdi riešenie kvadratickej rovnice 2x2 — 3x + 5 = 0".) 3. Pre algoritmus na riešenie daného problému musíme mať istotu, že tento algoritmus opisuje úspešnú cestu riešenia každého prípadu problému. To znamená, že algoritmus ukončí prácu na každom vstupe v konečnom čase a jeho výstup vždy zodpovedá správnemu výsledku. Každý algoritmus sa dá zapísať ako program v nejakom programovacom jazyku. Program je takým opisom algoritmu, ktorý je zrozumiteľný pre počítač. Pritom pojem program nie je synonymom pojmu algoritmus. Program nie je nič iné, ako postupnosť inštrukcií. Táto postupnosť inštrukcií nemusí dávať žiadny zmysel. Napríklad vykonávanie nejakého programu môže viesť k nezmyselným výpočtom, ktoré neriešia žiadny problém, alebo k nekonečnému opakovaniu jednej a tej istej činnosti. Vzorové riešenia k vybraným úlohám , Úloha 2.2 Kuchársky algoritmus na zohriatie 1 litra vody na aspoň 90°C môžeme opísať takto: . \ KJ 1 Nalej 1 liter vody do hrnca H. 2 Postav hrniec H na 15 sekúnd na horúcu platničku a potom ho z platničky zodvihni. 3 Ak teplota vody dosiahla aspoň 90°C, ukonči prácu. Ak nie, pokračuj v práci činnosťou 2. Úloha 2.3 Stav pamäti po vykonávaní jednotlivých inštrukcií názorne priblížime pomocou nasledujúcej tabuľky. 2 3 4 5 Vstup 11,12,13 12,13 12,13 13 Register(O) 1 2 3 4 5 Register (1) 0 11 11 11 11 Register(2) 1117 1117 100 100 13 Register(3) 21 21 21 12 12 Register (4) 0 0 0 0 0 Prvý stĺpec tabuľky zodpovedá situácii pred štartom programu. Stĺpec i + l opisuje stav pamäti a vstupného radu tesne po vykonaní i-tej inštrukcie programu, teda pred vykonávaním {i + l)-tej inštrukcie. 2.5 ZHRNUTIE 61 Úloha 2.8 Daný program najprv načíta tri hodnoty zo vstupného radu (inštrukcie v riadkoch 1,2, a 3). Potom vypočíta ich súčet a uloží ho do štvrtého registra (riadky 4 a 5). V riadkoch 6 a 7 sa vypočíta priemer načítaných hodnôt a výsledok sa uloží do šiesteho registra. Príkaz v ôsmom riadku vypíše vypočítaný priemer na výstup. Nasledujúca tabuľka, podobne ako tabuľka v úlohe 2.3, ukazuje vývoj situácie po vykonaní jednotlivých inštrukcií. Aby sme zvýšili prehľadnosť, uvádzame hodnoty registrov len vtedy, ak sa zmenil v tomto kroku výpočtu ich obsah. Vstup a, b, c b, c c Register(O) 1 2 3 4 5 6 7 8 9 10 Register (1) 0 a Register(2) 0 b Register(3) 0 c Register (4) 0 a + b a + b + c Register(5) 0 3 Register(6) 0 , a+b+c .3 Výstup a+b+c 3 4' Ir J 6 J Veľa by sa toho vo svete neudialo, keby sme sa neustále iba strachovali aké dôsledky bude mať naše úsilie. Georg Christoph Lichtenberg •3 ^ Kapitola 3 Nie je nekonečno ako nekonečno, alebo prečo je nekonečno v informatike nekonečne dôležité? 3.1 Prečo potrebujeme nekonečno? Nám známy vesmír je konečný a väčšina fyzikálnych teórií je založená na predstave konečného vesmíru. Všetko to, čo vidíme, čoho sa dotýkame a s čím prichádzame do kontaktu je konečné. Na čo je potom dobré nekonečno? Je nekonečno niečo neprirodzené a vykonštruované, jednoducho hračka matematiky? Napriek možným pochybnostiam pri prvom stretnutí s konceptom nekonečna, dovolíme si tvrdiť, že nekonečno je úspešný nástroj na skúmanie reálneho konečného sveta. Naše prvé stretnutie s nekonečnom absolvujeme väčšinou už na prvom stupni základnej školy, kde sa zoznamujeme s množinou všetkých prirodzených čísiel N={0,1,2,3,...}. Základný princíp definovania tejto množiny je jednoduchý: 64 KAPITOLA 3 Pre každé prirodzené číslo i existuje o jednotku väčšie prirodzené číslo i + 1. Vyjadrené inými slovami, neexistuje najväčšie číslo (ktoré by bolo väčšie ako všetky ostatné), pretože pre každé číslo existujú od neho väčšie čísla. Čo to znamená? Jednoducho nie je možné zapísať všetky prirodzené čísla jedno za druhým, pretože nezávisle od toho, koľko čísiel sme už zapísali, stále nasledujú ďalšie a ďalšie. Tak môžeme pokračovať bez toho, aby sme skončili, a preto hovoríme o potenciálnom nekonečne alebo o neobmedzenom počte prirodzených čísel. Podobne je to s priamkou v geometrii. Priamka je potenciálne nekonečná a teda má nekonečnú dĺžku, pretože môžeme po nej pochodovať neobmedzene dlho. Na jej koniec nikdy neprídeme a je jedno, kde sa na nej nachádzame, vždy môžeme v chôdzi pokračovať ďalej v tom istom smere. Hlavný problém s konceptom nekonečna je v našej neschopnosti, si nekonečno predstaviť. Aktuálne nekonečno nemôžeme jednoducho vidieť naraz celé. Chápeme, že máme nekonečne veľa (neobmedzene veľa) prirodzených čísiel, ale nie sme schopní vidieť naraz všetky prirodzené čísla. Presne tak isto, ako nemôžeme naraz vidieť celú nekonečnú priamku. Sme schopní pozorovať vždy len nejaký konečný zlomok (konečnú časť) uvažovaného nekonečného objektu. Napriek tomu označujme nekonečné objekty pomocou symbolov a potom pracujeme s týmito symbolmi ako s konečnými reprezentáciami nekonečných objektov. Na tomto mieste by niekto mohol navrhnúť nahradiť koncept nekonečna pomocou jedného obrovského, ale konečného ohraničenia. Napríklad, môžeme sa rozhodnúť definovať ako najväčšie prirodzené číslo počet1 protónov v známom vesmíre. Takto ohraničené množstvo čísiel nám vo väčšine počtových úkonov a úvah bude aj stačiť. Ale v okamihu, keď sa budeme snažiť vypočítať energiu celého vesmíru, alebo sa budeme chcieť zaoberať všetkými možnými vzťahmi medzi elementárnymi časticami, nám takto ohraničené čísla nebudú stačiť. Je jedno, ako veľké číslo si zvolíme ako možné ohraničenie počtu čísiel, vždy sa nájdu zmysluplné situácie, ktorých štúdium si vyžaduje prácu s ešte väčšími číslami. Navyše nejde len o to, že si vieme ku každému číslu predstaviť od neho ešte väčšie číslo. Toto väčšie číslo môžeme dokonca vždy aj zapísať, a teda nepochybujeme o jeho existencii. Prečo by sme si mali potom zakazovať niečo, čo existuje a prípadne to môžeme dokonca aj potrebovať? Ak ale chceme čitateľa presvedčiť o užitočnosti konceptu nekonečna, potrebujeme predložiť viac argumentov ako len prirodzenú existenciu potenciálneho Toto číslo pozostáva zo 79 decimálnych číslic. 3.1 PREČO POTREBUJEME NEKONEČNO? 65 nekonečna. Dovolíme si tvrdiť, že vďaka konceptu nekonečna dokážeme náš konečný svet úspešnejšie skúmať a lepšie chápať. Nekonečno nám neumožňuje uvažovať len o nekonečných veľkostiach. Môžeme uvažovať aj o nekonečne malých objektoch. Ktoré číslo je najmenšie kladné racionálne číslo ? Inými slovami: „Ktorý zlomok je najmenší zlomok väčší od nuly?" Začnime s príkladom zlomku 1/1000. Ten môžeme deliť dvomi a dostaneme zlomok 1/2000, ktorý je menší ako 1/1000. Zlomok 1/2000 môžeme znova vydeliť dvomi a dostaneme zlomok 1/4000. Je jedno nakoľko malý kladný zlomok 1 x vezmeme, vždy ho môžeme vydeliť dvomi a dostaneme kladný zlomok 1 ktorý je ešte menší ako l/x a pritom stále väčší ako 0. Vidíme, že tento príbeh je bez konca. Ku každému kladnému racionálnemu číslu existuje menšie kladné racionálne číslo, atď. David Hilbert (1862-1943), jeden z najslávnejších matematikov svojej doby, povedal: „ V istom zmysle nie je matematická analýza ničím iným, ako symfóniou na tému nekonečna." A my k tomu pridávame, že bez pojmu nekonečna by nemohla existovať ani fyzika, tak ako ju poznáme. Kľúčové koncepty matematiky ako limita, derivácia, integrál, spojitosť a diferenciálně rovnice sú vybudované na pojme nekonečna a nemôžu bez neho existovať. A bez týchto konceptov nie je fyzika schopná modelovať náš svet. Problémy by nastali už pri definícii základných fyzikálnych pojmov. Ako by sme bez týchto matematických pojmov a konceptov definovali napríklad pojem zrýchlenia? Mnohé z týchto pojmov vznikli práve preto, že ich fyzika potrebovala pre vlastný vývoj. Dôsledkom našich úvah je, že bez pojmu nekonečna by zmizli veľké časti matematiky. Vzhľadom na to, že matematika je formálny jazyk celej vedy a my dnes spájame istý stupeň „zrelosti" vedných disciplín so stupňom používania tohto jazyka, vrhlo by vymazanie pojmu nekonečna celú vedu stáročia nazad. Rovnako to platí aj pre informatiku. Potrebujeme rozlišovať programy (ktoré pripúšťajú nekonečné výpočty) od algoritmov (ktoré garantujú ukončenie 66 KAPITOLA 3 výpočtov v konečnom čase). Naviac existuje nekonečne veľa programov a nekonečne veľa rôznych výpočtových úloh. Typické výpočtové problémy pozostávajú z nekonečného počtu prípadov problému. Nekonečno je v informatike neodmysliteľné. Cieľom tejto kapitoly nie je len ukázať, že koncept nekonečna je úspešným nástrojom výskumu v informatike. Ako keby nám nestačilo, že sa musíme trápiť s pochopením potenciálneho a aktuálneho nekonečna, ktoré sme nikdy nevideli a ani neuvidíme, zaťažíme čitateľa ešte náročnejšou otázkou: „Existuje len jedno nekonečno, alebo existuje viac rôzne velkých nekonečien?" Nepreháňame to trochu a nehráme sa na vedcov, ktorí už od dobroty nevedia, čo by mohli robiť a venujú sa nezmyselným umelým konštrukciám? Nie. Táto vysoko abstraktná otázka má pre vedu neuveriteľne veľkú hodnotu. Naším cieľom je predstaviť jeden z najdôležitejších objavov o nekonečne a ukázať, že existujú prinajmenšom dve2 rôzne veľké nekonečná. Co tým získame? Vďaka tomuto objavu môžeme ukázať, že počet rôznych algoritmických úloh je väčší ako počet všetkých programov. Takto dostaneme prvý základný výsledok informatiky, ktorý má filozofickú hĺbku a je kľúčovým príspevkom pre celú vedu. Nie všetko je automatizovatelhé, pretože existujú úlohy, ktoré sa nedajú riešiť pomocou žiadnych algoritmov. Vďaka tomuto prvému existenčnému kroku nájdeme v nasledujúcej kapitole konkrétne zmysluplné problémy z praxe, ktoré sa nedajú riešiť algoritmicky, teda automaticky s pomocou výpočtovej techniky. Je to nádherný príklad toho, ako koncept nejakého v realite neexistujúceho objektu môže viesť k objavu, ktorý má nemalý vplyv na prax. Možno ste prekvapení, ale nezabúdajme na nasledujúce. Cesta k vedeckým poznatkom cez hypotetické koncepty vo fyzikálnej realite neexistujúcich abstraktných objektov je skôr typická než výnimočná. A najdôležitejšie, čo sa ráta, je to, či sme dosiahli náš výskumný cieľ. To zodpovedá presne tomu, čo sme sa v prvej kapitole naučili od Gôdela. Potrebujeme nové pojmy, aby sme mohli skúmať a dokazovať pravdivosť vedeckých tvrdení, ktoré s týmito pojmami vo svojej formulácii nemajú nič spoločné. 2Existuje nekonečne veľa rôzne veľkých nekonečien. 3.2 KANTOROVA METODA 67 3.2 Cantorova metoda na porovnávanie veľkosti nekonečien Porovnávanie (konečných) čísiel je veľmi jednoduché. Všetky čísla ležia na reálnej osi a z dvoch čísiel je vždy menšie to, ktoré sa nachádza vľavo od toho druhého (obr. 3.1). ----1-1---- 2 7 obr. 3.1 Takže 2 je menšie ako 7, pretože číslo 2 sa nachádza vľavo od čísla 7. To ale nie je koncepcia na porovnávanie čísiel, pretože a priori ukladáme čísla na hypotetickú reálnu os tak, aby ich hodnoty rástli v smere zľava doprava a klesali v smere sprava doľava. Ale na osi ležia len konečne veľké čísla. Je jedno, ktoré miesto (bod) reálnej osi uvažujeme, vždy na ňom leží jedno konkrétne konečne veľké číslo. A to platí napriek nekonečnosti reálnej osi v oboch smeroch. Toto je koncepcia potenciálneho nekonečna. Na tejto osi môžeme ísť ľubovoľne ďaleko doprava, alebo doľava a jedno na akom mieste sa zastavíme, vždy tam nájdeme jedno konkrétne konečne veľké číslo. Nekonečné čísla na osi nenájdeme. V matematike používame pre označenie nekonečna symbol oc „ležatá osmička", ktorý je odvodený od hebrejského symbolu aleph. Ak ale veľkosť všetkých nekonečien budeme označovať jedným symbolom oo, nebudeme mať možnosť veľkosti rôznych nekonečien porovnávať. Čo robiť? V tejto situácii potrebujeme novú reprezentáciu čísiel a na to potrebujeme pojem množiny. Množina je kolekcia (zbierka, súbor) rôznych objektov, ktoré nazývame prvkami množiny. Napríklad {2, 3, 7} je množina, ktorá obsahuje tri čísla 2,3 a 7. Pri označovaní množín používame zložené zátvorky { a }. Množina {Janko, Anička, Peter, Paula} obsahuje štyri objekty (prvky) Janko, Anička, Peter a Paula. Pre každú množinu A označujeme pomocou symbolu \A\ počet prvkov v A a hovoríme o mohutnosti (kardinalite) množiny A. Napríklad |{2, 3, 7}| = 3 a |{Janko, Anička, Peter, Paula}| = 4. 68 KAPITOLA 3 Čísla budeme reprezentovať pomocou mohutností množín. Takže mohutnosť množiny {2, 3, 7} reprezentuje číslo 3. Očividne takýmto spôsobom získavame pre každé kladné celé číslo nekonečne veľa reprezentácií. Napríklad |{1,2}|, |{7,11}|, |{Peter, Paula}| , |{D,0}| ř—i sú všetko reprezentácie čísla 2. Nie je to trocha prehnané a zbytočne komplikované? Takto pôvodne reprezentovali čísla naši prapredkovia. Čo sme získali touto reprezentáciou, okrem návratu do dávnej minulosti? Pre porovnávanie konečne veľkých čísiel je táto reprezentácia čísiel možno skutočne archaická a nepraktická. Ale výhodou tejto reprezentácie je, že môžeme porovnávať nekonečné veľkosti. Číslo pre veľkosť N = {0,1,2,...} je nekonečne veľké číslo, ktoré reprezentuje počet všetkých prirodzených čísel. Keď pomocou Q+ označíme množinu všetkých kladných racionálnych čísiel, potom je číslo nekonečne veľké číslo, ktoré reprezentuje počet všetkých kladných racionálnych čísiel (kladných zlomkov). Podobne označuje O} o počet reálnych čísiel, keď predpokladáme, že IR reprezentuje množinu reálnych čísiel. Teraz chápeme prednosti uvedenej reprezentácie čísiel. Odrazu máme možnosť pýtať sa: „Je \N\ menšie ako \R\ ?" alebo „Je |Q+| rovnako veľké ako Vďaka tejto reprezentácii čísiel môžeme po prvýkrát sformulovať otázku, či je nejaké nekonečno väčšie ako iné nekonečno. V tomto okamihu sa nám podarilo zredukovať náš problém porovnávania čísiel na porovnávanie veľkosti (mohutnosti) množín. Ako ale porovnať mohutnosť dvoch množín? Ak sú obe množiny konečné, je to jednoduché. Spočítame počet prvkov v oboch množinách a porovnáme bežným spôsobom zodpovedajúce čísla. V prípade nekonečných množín tento postup ale nevedie k výsledku. Ak skúsime spočítať počet prvkov nejakej nekonečnej množiny, počítanie nikdy neskončíme, a k porovnávaniu sa ani nedostaneme. To znamená, že potrebujeme novú všeobecnú metódu, ktorú by sme mohli aplikovať na porovnávanie mohutnosti množín, bez ohľadu na to, či sú to množiny 3.2 KANTOROVA METODA 69 konečné, alebo nekonečné. Takto sa znova nachádzame na tej najhlbšej axiomatickej úrovni vedy. Našou úlohou je definovať pojem „nekonečna" a dať presný význam vzťahu „menší alebo rovnako veľký ako" pre mohutnosti dvoch množín. Tu sa necháme poučiť bačom. Nemusíme sa za to hanbiť, matematici to urobili tiež a okrem toho spájať múdrosť len so vzdelaním, by bolo veľkou chybou. Náš bača má početnú čriedu oviec, v ktorej je veľa bielych a veľa čiernych oviec. Bača nechodil nikdy do školy, a preto, napriek svojej múdrosti (ktorá ho drží vysoko v horách ďaleko od hektickej civilizácie), vie počítať len do troch. Bača chce zistiť, či má viac čiernych ako bielych oviec, alebo či je to naopak (obr. 3.2). Ako to môže zistiť bez toho, aby ovce spočítal? Jednoducho. Vezme jednu bielu a jednu čiernu ovcu a vytvorí z nich jeden pár. (biela ovca, čierna ovca). Tento pár pošle z lúky do košiara. Potom vytvorí ďalší pár (biela ovca, čierna ovca) a pošle ho tiež do košiara (obr. 3.3). Takto bača pokračuje dovtedy, pokiaľ na pasienku neostanú len ovce jedného druhu, alebo žiadne 70 KAPITOLA 3 obr. 3.3 ovce. To znamená, že bača ukončí vytváranie párov, keď už na pasienku nemôže vytvoriť žiadny pár zjednej bielej a jednej čiernej ovce. Teraz uvažuje bača nasledujúco: (i) Ak na pasienku neostala žiadna ovca, mám presne toľko bielych oviec koľko čiernych. (ii) Ak mi na pasienku ostali len biele ovce, mám viac bielych ako čiernych oviec (obr. 3.3). (iii) Ak mi na pasienku ostali len čierne ovce, mám viac čiernych ako bielych Bačov záver (i) a párovanie ovci si matematici zvolili za základný koncept na porovnávanie mohutnosti množín. Definícia 3.1 Nech A a B sú dve množiny. Párovanie množín A a B je vytvorenie párov (a, b) tak, že platí: (i) a patrí do A (a E A) a b patrí do B (b E B). (ii) každý prvok z A sa nachádza práve v jednom páre párovania (žiadny prvok z A sa nenachádza v dvoch, alebo viacerých pároch a nijaký z prvkov neostal nezaradený do páru (neostal na ocot)), (iii) každý prvok z B je druhým prvkom práve jedného páru v párovaní. Pre každý pár (a, b) hovoríme, že a a 6 sú spolu zosobášení. Hovoríme, že oviec. 3.2 KANTOROVA METODA 71 A a B sú rovnako veľké a píšeme \A\ = \B\ , ak existuje nejaké párovanie množín A a, B. Hovoríme, že A a B sú rôzne veľké a píšeme \A\ŕ\B\ , ak neexistuje žiadne párovanie množín A a B. Uvažujme napríklad množiny A = {2, 3,4, 5} a B = {2, 5, 7,11} na obr. 3.4. obr. 3.4 Obrázok 3.4 znázorňuje párovanie (2, 2), (3, 5), (4, 7), (5,11). Každý prvok z A je práve v jednom páre ako prvý prvok (napríklad 4 z A je v treťom páre) a každý prvok páru z B je práve v jednom páre ako druhý prvok páru (napríklad 5 z B je v druhom páre). Inými slovami, každý prvok z A je zosobášený práve s jedným prvkom z B, každý prvok B je zosobášený práve s jedným prvkom z A a teda žiadny prvok z A, alebo 5 neostal slobodný. Vďaka tomu môžeme usúdiť, že platí |{2,3,4,5}| = |{2,5,7,11}|. Samozrejme medzi A a, B môžeme navrhnúť aj iné párovanie. Príklad iného možného párovania je (2,11), (3, 7), (4, 5), (5, 2). Úloha 3.1 a) Napíšte dve iné párovania množín A = {2, 3,4, 5} a B = {2, 5, 7,11}. 72 KAPITOLA 3 b) Prečo nie je (2, 2), (4, 5), (5,11), (2, 7) párovaním množín A a B? Podľa tohto konceptu sú množina A žien a množina B mužov rovnako mohutné, ak môžeme vydať všetky ženy a oženiť všetkých mužov tak, že nikto neostane na ocot3. Medzi množinami c = {1, 2, 3} a -D = {2,4, 6, 8} neexistuje žiadne párovanie, pretože každý pokus o párovanie sa skončí tým, že v množine D ostane jeden prvok naviac. To znamená, že \D\ ý |C|- Obrázok 3.5 ukazuje jeden neúspešný pokus o párovanie. C D obr. 3.5 Obrázok 3.6 ukazuje iný neúspešný pokus o párovanie množín c a D. Tento pokus nevedie ku korektnému párovaniu, pretože prvok 3 z C je v dvoch pároch (3,4) a (3,8) a teda je dvakrát ženatý. 3Uvažujme len svadby párov s rôznym pohlavím. 3.2 KANTOROVA METODA 73 Koncept párovania sme ale nezaviedli na to, aby sme porovnávali konečné množiny. To sme vedeli robiť už predtým aj bez tohto komplikovaného prístupu. Teraz sme si len overili, že v konečnom svete náš koncept funguje správne. Keby to nebolo tak, bol by to chybný koncept a nemohli by sme ho používať. Pokúsme sa ho teraz aplikovať na nekonečné množiny. Uvažujme najprv množinu všetkých párnych čísiel a množinu všetkých nepárnych prirodzených čísiel. Tieto množiny sa zdajú byť rovnako veľké, takže sa to pokúsime naším konceptom porovnávania veľkosti množín aj zdôvodniť. Budeme párovať každé párne číslo 2i s o jednotku väčším nepárnym číslom 2i + 1. Na obrázku 3.7 vidíme, že takto dostávame nasledovných nekonečne veľa párov: (0,1), (2, 3), (4, 5), (6, 7),..., (2t, 2i + 1),.... Přesvědčme sa o tom, že táto postupnosť párov je korektným párovaním množín Npár a Nnepár. Žiadny prvok z Npár alebo Nnepýr nie je prvkom dvoch alebo viacerých párov (nie je viacnásobne ženatý). Ďalej vidíme, že žiadny prvok neostane slobodný. Pre každé párne číslo 2k z Npár je toto číslo v páre (2k,2k + 1). Pre každé nepárne číslo 2m + 1 z množiny Nnepár existuje v párovaní pár (2m, 2m + 1). Podľa nášho konceptu teda môžeme povedať, že pári |-Nnepári- Úloha 3.2 Dokážte, že |Z+| = |Z"|, pričom Z+ = {1,2,3,4,...} a Z" = {-1. 74 KAPITOLA 3 —2, —3, —4, ...}. Načrtnite párovanie aj graficky, podobne ako sme to urobili na obrázku 3.7. Doteraz prebiehalo všetko podľa očakávania a naša argumentácia bola skutočne priezračná. Teraz prichádza niečo, čo nie je až tak jednoducho na prvý pokus stráviteľné. Uvažujme množiny N = {0,1,2,3,...} a Z+ = {1, 2,3,4,...}. Všetky prvky množiny Z+ sú v N, a teda platí Z+ C N. čo znamená, že Z+ je podmnožinou množiny N. Okrem toho platí, že prvok 0 je v N, ale nie je v Z+. V takomto prípade hovoríme, že Z+ je vlastná podmnožina množiny N a píšeme Z+ C N. Pojem „A je vlastná podmnožina Bu znamená, že A je časťou B, ale nie celým B. Názorne túto situáciu vidíme pre Z+ C^v na obrázku 3.8. Množina Z je v N úplne obsiahnutá, ale nieje to celá množina N, lebo 0 e N a 0 ^ Z+. Napriek tomu teraz tvrdíme, že platí \ |N|. Tento výsledok sme možno na začiatku považovali za možný, ale po absolvovaní časti 3.2 môžeme pochybovať o tom, či táto nerovnosť platí. Reálne čísla majú podobné vlastnosti ako racionálne čísla. Neexistuje žiadne najmenšie pozitívne reálne číslo a medzi ľubovoľnými dvoma rôznymi reálnymi číslami 94 KAPITOLA 3 sa nachádza nekonečne veľa reálnych čísel. Pretože |N| = |Q+|, znamenala by nerovnosť |IR+| > |N| automaticky tiež platnosť nerovnosti \R+\ > |Q+|. Nebolo by to prekvapujúce? V nasledujúcej kapitole pochopíme lepšie kľúčový rozdiel medzi množinami M a Q. Ukážeme dokonca ešte silnejší výsledok. Označme pomocou [0,1] množinu všetkých reálnych čísiel medzi 0 a 1, vrátane nuly a jednotky. Ukážeme, že platí |[0,1]|^|N|. Ako sa dá ukázať nerovnosť mohutnosti dvoch množín? Na dôkaz rovnosti nám stačí nájsť vhodné párovanie. To nemusí byť vždy jednoduché, ale v istom zmysle to nie je až také ťažké, lebo je to konštruktívna úloha. Skonštruujete vhodné párovanie, a tým je jednoducho práca ukončená. Pre nerovnosť \a\ ý \b\ potrebujeme dokázať, že neexistuje žiadne párovanie medzi a a, b. Problém je v tom, že potenciálne môže existovať nekonečne veľa stratégií na konštrukciu hľadaného párovania. Ako sa dá vylúčiť možnosť úspechu pri všetkých možných postupoch na konštrukciu vhodného párovania? Nemôžeme jednu po druhej preveriť nekonečne veľa stratégií. Keď chceme ukázať, že niečo neexistuje, hovoríme o dôkazoch neexistencie. Zdôvodniť nemožnosť existencie nejakého objektu s istými vlastnosťami, alebo vylúčiť možnosť nejakého javu sú najťažšie úlohy, aké si v prírodných vedách môžeme zadať. Slovo „nemožné" nemôžeme takmer vysloviť a ak už ho predsa použijeme, musíme veľmi starostlivo upresniť jeho význam. Jeden známy fyzik mi raz rozprával, že existuje možnosť spätne vytvoriť vajíčko v pôvodnom stave z volského oka upečeného na panvici. Táto možnosť je založená na možnosti „obrátiť chod času" fyzikálnych procesov a nechať ich bežať späť do pôvodného stavu. Fyzici vraj dokážu vypočítať pravdepodobnosť, s akou sa podarí zrealizovať spätný beh procesu od volského oka k vajíčku. Pravdepodobnosť úspechu takého pokusu je tak nízka, že jeho úspech možno pokladať temer za zázrak, ale podstatné je, že táto pravdepodobnosť je väčšia ako nula, a teda táto možnosť existuje. Je veľa vecí a situácií, ktoré sa nám na prvý pohľad môžu zdať nemožné a napriek tomu môžu nastať. V matematike pracujeme v umelom svete abstraktných matematických objektov a vďaka tomu v matematike môžeme úspešne vytvárať dôkazy o ne-existencii matematických objektov. To ale nič nemení na skutočnosti, že aj tu patria dôkazy neexistencie k najťažším úlohám z hľadiska korektnej argumentácie. 3.3 RÔZNE VEĽKÉ NEKONEČNÁ 95 o o CN Pokúsme sa najprv ukázať, že nie je možné očíslovať reálne číslo z intervalu [1,0] a teda, že platí |[0,1]| ý Ako sme už naznačili, na dôkaz neexis-tencie očíslovania čísiel v [0,1] použijeme metódu nepriameho dokazovania. To znamená, že predpokladáme opak toho, čo chceme dokázať. Takže predpokladáme, že existuje očíslovanie reálnych čísiel z intervalu [0,1] a pomocou tohto predpokladu sa snažíme dostať k sporu14. Ak existuje očíslovanie množiny [0,1], môžeme všetky reálne čísla z [0,1] zapísať do postupnosti znázornenej v tabuľke na obrázku 3.25. 1 2 3 4 0. 0. 0. 0. 0. «11 Ql2 «13 «14 «23 «24 «34 «21 «22 «31 «32 «33 «41 «42 «43 «44 «il ««2 ««3 ««4 au a2i ... a^i obr. 3.25 To znamená, že číslo je prvým číslom v našom očíslovaní čísiel z [0,1]. Symboly au, a12, a 13,... sú decimálne cifry. Takže au je prvá decimálna cifra za desatinnou čiarkou, a12 je druhá cifra, ai3 je tretia cifra za desatinnou čiarkou, atď. Vo všeobecnosti i-te reálne číslo z intervalu [0,1] v poradí nášho číslovania. Naša tabuľka je nekonečná v dvoch rozmeroch. Počet riadkov je |N| a počet stĺpcov je tiež |N|. Stĺpec j obsahuje j-te cifry za desatinnou čiarkou všetkých reálnych [ V prípade potreby sa môžeme najprv vrátiť k opisu metódy nepriamej argumentácie v prvej kapitole. Schéma nepriameho dokazovania hovorí, že ak je možné z nejakého tvrdenia Z odvodiť postupnosťou implikácií nejaké očividne neplatné tvrdenie, tak tvrdenie Z neplatí, a teda platí opak tvrdenia Z. 96 KAPITOLA 3 čísiel v našom očíslovaní. Počet stĺpcov musí byť tiež nekonečný, pretože väčšinu reálnych čísiel nie je možné zapísať pomocou konečného počtu cifier za desatinnou čiarkou. Napríklad na zapísanie zlomku 1 3 0.3 = 0.33333... potrebujeme nekonečne veľa miest za desatinnou čiarkou i keď táto reprezentácia je periodická. Čísla ako \/2/2 alebo 7r/4 nie sú periodické a na ich presný zápis v tomto tvare decimálneho zápisu sa nemôžeme vyhnúť použitiu nekonečného počtu desatinných miest v ich presnom zápise. Aby sme zvýšili názornosť uvedenej tabuľky predstavíme si hypotetickú konkrétnu tabuľku ako na obrázku 3.26, kde sú namiesto symbolov konkrétne decimálne cifry. V tejto hypotetickej tabuľke sú očíslované reálne čísla z intervalu [0,1]. 1 2 3 4 5 6 0 6 0. [T] 3 2 0. o [ô] o o 0. 9 9 |~8~| 1 0^- 3 4 [01 0. 3 5 0 1 0. 3 1 4 0 \ 6 ■'é i o o o 0 3 7 8 m 2 5 [Ť] 0 0 > c 34 65 y 66 z 67 A 68 B 69 70 Y 71 Z 72 1 73 2 74 75 9 0 167 + n * Q & i 3 3 ? $ obr. 4.1 To znamená, že najprv sú texty, ktoré sa začínajú prvým symbolom v našom poradí. Ak sme napríklad usporiadali symboly abecedy klávesnice do poradia ako na obr. 4.2, začína naše očíslovanie textov 1 a Texty dĺžky 5 sú usporiadané nasledujúco: člčlčlčlčt ČI ČI ČI ČI 1) čLčLčLčLC člclclclw aaaba aaabb aaabc Prečo sme sa zapodievali textami? „Každý program je text nad abecedou klávesnice." Takže programy sú špeciálne texty, ktoré sú zrozumiteľné pre počítač. Počet programov nie je teda väčší ako počet textov, a preto môžeme tvrdiť: 4.2 KOĽKO RÔZNYCH PROGRAMOV MOŽNO NAPÍSAŤ? 109 „Počet programov sa rovná \N\." Ukázali sme, že počet programov je nekonečný a nie väčší než |N|. To, že |N| a počet programov sú rovnako veľké, vyplýva zo skutočnosti, že |N| je najmenšie nekonečno. Toto sme ale nedokázali. Keď chceme naše tvrdenie dokázať úplne čisto, bez použitia nedokázaného tvrdenia, potrebujeme vytvoriť párovanie medzi číslami a programami. Ako už vieme, očíslovanie je párovanie. Programy očíslujeme tak, že z nekonečnej knihy všetkých textov vytvorených nad abecedou klávesnice, vymažeme tie, ktoré nepredstavujú program. Je dôležité všimnúť si, že vymazanie sa dá urobiť automaticky. Dajú sa napísať programy, ktoré pre zadaný vstupný text rozhodnú, či zodpovedá programu v nejakom uvažovanom programovacom jazyku. Takéto kontrolujúce programy nazývame kompilátory. Treba zdôrazniť, že kompilátor skontroluje len, či je program syntakticky správny, ale nie, či je sémanticky správny. To znamená, že kompilátor skontroluje presne, či je text korektne zapísanou postupnosťou príkazov pre počítač, teda či je programom. Kompilátor nekontroluje, či je program algoritmom, teda, či program počíta niečo zmysluplné, alebo či sa nemôže stať, že by bežal v cykle do nekonečna. V ďalšom si teda môžeme dovoliť uviesť nekonečný zoznam všetkých programov Po, Pi, P2, P3, ■ ■ ■, Pi, ■ ■ pričom Pi označuje i-ty program. , Prečo bolo také dôležité, ukázať, že počet programov, a tým súčasne aj algoritmov, nie je väčší než |N|? Odpoveď je, že počet všetkých možných problémov je väčší než |N|, teda existuje viac rôznych problémov, než programov. Z toho vyplýva, že existujú problémy, pre ktoré neexistujú algoritmy (metódy na ich riešenie). Už predchádzajúcej kapitole sme naznačili, že existuje príliš veľa problémov. Pre každé reálne číslo môžeme uvažovať nasledujúci problém Problem(c). Problem(c) Vstup: prirodzené číslo n Výstup: číslo c s presnosťou na n desatinných miest za desatinou bodkou 110 KAPITOLA 4 Hovoríme, že algoritmus Ac rieši problém Problem(c) alebo, že Ac generuje číslo c, keď pre ľubovoľné zadané číslo n vypočíta v desiatkovej sústave celú časť čísla c a n desatinných miest za desatinou bodkou. Napríklad, • pre c = g, musí A± pre vstup n = 5 vypočítať výsledok 1.33333. • pre c = \pl musí A^ pre vstup n = 4 vypočítať číslo 1.4142. • pre c = 7T musí An pre vstup n = 6 vypočítať 3.141592. Úloha 4.1 Co je výstupom algoritmu Ari, ktorý pre vstup n = 12 generuje -rf? Co sú výsledky algoritmu An, ktorý generuje ir, pre vstupy n = 2, n = 0, n = 7 a y. Úloha 4.2 (tvrdý oriešok) Viete vymyslieť metódu na určenie (generovanie) ľubovoľného počtu desatinných miest čísla ir? Vysvetlite ju! V kapitole 3 sme dokázali, že počet reálnych čísiel je väčší než |N|, to znamená, že \R\ > |N|. Pretože počet algoritmov nie je väčší než |N|, je viac reálnych čísiel než algoritmov. Preto existujú reálne čísla c, pre ktoré nie je Problém (c) algoritmicky riešiteľný. Dokázali sme, že sú reálne čísla, ktoré sa nedajú algoritmicky generovať. Rozumieme ale presne, prečo je to tak? Pokúsime sa vytvoriť si základy intuície, a tak demaskovať sivú eminenciu v pozadí. Prirodzené čísla, racionálne čísla, texty, programy, recepty a algoritmy majú dôležitú spoločnú vlastnosť. „Všetky tieto objekty sa dajú reprezentovať konečným spôsobom." Pre reálne čísla to ale neplatí. Keď je zápis reálneho čísla konečný, môžeme ho chápať ako text. Počet textov je ale menší než počet reálnych čísiel, preto existujú reálne čísla, ktoré nemajú konečný zápis. Čo to presne znamená? Konštruktívne opísať reálne číslo m znamená, že na základe opisu sme schopní získať kompletné číslo m, cifru po cifre. Aj v prípade, keď má číslo m za desatinnou bodkou nekonečne veľa miest, na základe opisu vieme jednoznačne určiť cifru na ľubovoľnom desatinnom mieste čísla m. V tomto zmysle je konečný opis čísla m úplný. Teda na základe konečného opisu m máme algoritmus na generovanie tohto čísla. Napríklad \pl je konečná reprezentácia iracionálneho čísla m = \pl a vieme ho vypočítať s ľubovoľnou presnosťou, ktorú si určíme. Preto platí: 4.3 ÁNO ALEBO NIE, TO JE OTÁZKA 111 Reálne čísla, ktoré sa dajú reprezentovať konečným spôsobom sú presne tie reálne čísla, ktoré sa dajú algoritmicky generovať. Máme aj reálne čísla, ktoré sa nedajú konečným spôsobom reprezentovať, a preto sa nedajú ani algoritmicky generovať. Úloha 4.3 Čo myslíte? Čoho je viac? Reálnych čísiel s konečnou reprezentáciu, alebo reálnych čísiel, ktoré nemajú konečnú reprezentáciu. Zdôvodnite Vaše tvrdenie! Teraz vidíme, že sú úlohy, na ktorých riešenie neexistuje algoritmus. S týmto poznaním sa ale neuspokojíme. Koho zaujíma úloha generovať číslo m, ktorého reprezentácia aj tak nie je konečná? Ako vôbec formulovať takúto úlohu konečným spôsobom? A okrem toho, ak sú toto jediné úlohy, ktoré nie sú algoritmicky riešiteľné, tak môžeme spokojne zabudnúť na celú takúto „umelú" teóriu a venovať sa úlohám, ktoré sa vyskytujú v praxi. Takže čitateľovi musí byť zrejmé, že s takýmto poznaním sa nemôžeme uspokojiť. Musíme pokračovať v našom skúmaní, aby sme zistili, či existujú aj zaujímavé úlohy, ktoré sa dajú sformulovať konečným spôsobom a ktoré sa algoritmicky nedajú riešiť. 4.3 ÁNO alebo NIE, to je otázka, alebo: metóda diagonalizácie trochu inak Najjednoduchšie problémy, ktorými sa zaoberá informatika sú takzvané rozhodovacie problémy. Rozhodovací problém je o rozhodnutí, či daný objekt (alebo dané objekty) má (majú) určitú skúmanú vlastnosť. Napríklad dostaneme digitálnu fotografiu a máme rozhodnúť, či sa na nej nachádza stolička. Alebo, či je na fotografii človek, alebo ešte konkrétnejšie, či je to Aurel Stodola. Odpoveď musí byť jednoznačné „ÁNO" alebo „NIE". Iné odpovede nie sú povolené. Prirodzene očakávame, že odpoveď bude správna. V ďalšom budeme uvažovať o veľmi jednoduchých rozhodovacích problémoch. Nech je M ľubovoľná podmnožina N. Je to teda množina obsahujúca prirodzené čísla. Špecifikujme rozhodovací problém (N, M) takto: Vstup: prirodzené číslo n z N. Výstup: „ÁNO" v prípade, že n je z M, „NIE" v prípade, že n nie je z M. 112 KAPITOLA 4 Ako M môžeme zobrať PRIM, kde PRIM = {2, 3, 5, 7,11,13,17,19,...} je nekonečná množina všetkých prvočísiel. V takom prípade je (N, PRIM) rozhodovací problém, či dané číslo n je, alebo nie je prvočíslo. Problém (N,Npar) označuje rozhodovací problém, či dané číslo je párne alebo nepárne. Pre každú podmnožinu M množiny N, hovoríme, že algoritmus A rozpozná množinu M alebo, že A rieši rozhodovací problém (N, M), keď pre každý vstup n algoritmus A (i) dá výsledok „ÁNO", ak n patrí do M a (ii) dá výsledok „NIE", ak n nepatrí do M. Niekedy používame namiesto „ÁNO" cifru „1" a namiesto „NIE" cifru „0". V prípade, že A pre vstup n odpovie „ÁNO", hovoríme, že algoritmus akceptuje číslo n. Ak pre n odpovie „NIE", hovoríme, že algoritmus A zamietne číslo n. Keď pre rozhodovací problém (N, M) máme algoritmus, potom vravíme, že (N, M) je algoritmicky riešiteľný alebo, že (N, M) je rozhodnuteľný. Je očividné, že problém (N, Npar) je rozhodnuteľný; stačí preveriť, či je zadané prirodzené číslo párne alebo nepárne. Problém (N, PRIM) je tiež rozhodnuteľný, lebo vieme, ako sa presvedčíme, či prirodzené číslo je prvočíslo a na základe tohto spôsobu nie je ťažké vytvoriť algoritmus. Úloha 4.4 Najjednoduchší spôsob preverenia, či číslo n je prvočíslo, je vyskúšať vydeliť číslo n všetkými číslami od 2 po n — 1. V prípade, že žiadne z týchto čísiel nedelí n, je n prvočíslo. Takéto preverenie je veľmi nákladné. Ak chceme preveriť číslo 1000003, musíme vyskúšať miliónkrát deliteľnosť. Viete iný spôsob preverenia, pri ktorom je počet delení podstatne menší? Úloha 4.5 (tvrdý oriešok) Vo formalizme z kapitoly 2 napíšte program, ktorý rozhodne problém (N, QUAD), pričom QUAD = {1,4,9,16,25,...} je množina štvorcov všetkých kladných čísiel (t.j. i2, pre i = 1,2,3,...). Chceme ukázať, že existujú rozhodovacie problémy, pre ktoré neexistujú algoritmy. Takéto rozhodovacie problémy nazývame 4.3 ÁNO ALEBO NIE, TO JE OTÁZKA 113 nerozhodnuteľné alebo algoritmicky neriešiteľné. Už sme sa dozvedeli, že môžeme vypísať všetky programy P0, P1} P2, ... v pevnom poradí jeden za druhým. Neskôr sa dozvieme, že sa to dá urobiť dokonca algoritmicky. Vypísať algoritmicky algoritmy ale nie je také ľahké. Z tohto dôvodu začneme naše úsilie tým, že dokážeme dokonca niečo ťažšie. Ukážeme, že sú rozhodovacie problémy, ktoré sa nedajú vyriešiť nijakým programom. Čo to znamená presne? Kde je rozdiel medzi algoritmickou riešiteľnosťou a riešiteľnosťou pomocou programu? Na pripomenutie: každý algoritmus vieme prepísať ako program, ale nie každý program je algoritmus. Program môže vykonávať nezmyselnú činnosť a pre niektoré vstupy pracovať nekonečne dlho, zatiaľ čo algoritmus beží vždy len konečný čas a vypočíta korektný výsledok. Nech je M podmnožina N. Hovoríme, že program P akceptuje množinu M, keď pre každé zadané prirodzené číslo n (i) P odpovie „ÁNO", keď n patrí do M a (ii) P odpovie „NIE" alebo pracuje nekonečne dlho, keď n nepatrí do M. V ďalšom texte bude označovať M(P) množinu M, ktorú akceptuje P. Teda P môžeme chápať aj ako konečnú reprezentáciu potenciálne nekonečnej množiny M (P). Okamžite vidíme rozdiel medzi rozpoznaním množiny M algoritmom alebo jej akceptovaním programom. Pre vstupy z M musia oba pracovať korektne a v konečnom čase dodať správnu odpoveď „ÁNO" (bod (i)). Pre čísla, ktoré nepatria do M, smie program na rozdiel od algoritmu pracovať nekonečne dlho bez toho, aby dal nejakú odpoveď. V tomto zmysle sú programy nadm-nožina algoritmov3. Preto keď ukážeme, že pre množinu M neexistuje program, nebude pre M existovať ani algoritmus, a teda problém (N, M) je nerozhodnuteľný. Aby sme skonštruovali takúto „ťažkú" podmnožinu prirodzených čísiel, použijeme opäť diagonalizačnú metódu z kapitoly 3. Potrebujeme na to, nasledujúcu reprezentáciu podmnožin prirodzených čísiel (obr. 4.2). 0 1 2 3 4 i i + 1 M 0 1 0 0 1 1 0 obr. 4.2 3Inak povedané, algoritmy sú špeciálne programy. 114 KAPITOLA 4 M reprezentujeme ako nekonečnú postupnosť binárnych cifier. Postupnosť začína 0-tou pozíciou a na i-tom mieste je 1, keď i patrí do M. V prípade, že i nepatrí do M, napíšeme na i-te miesto v postupnosti 0. Množina M na obr. 4.2 teda obsahuje čísla 1, 4 a i. Prvky 0, 2, 3 a i + 1 nepatria do M. Pre Npar vyzerá reprezentácia nasledujúco: 101010101010101010 ... Pre PRIM je reprezentácia 0011010100010100 ... Úloha 4.6 Určite prvých 17 miest v binárnej reprezentácii množiny QUAD. Vytvorme teraz opäť dvojrozmernú tabuľku, ktorá je v oboch rozmeroch nekonečná. Stĺpce tabuľky označme postupnosťou všetkých programov, ktoré prečítajú jediné číslo a ako odpoveď môžu vypísať len „ÁNO" alebo „NIE". Takéto programy sa dajú rozpoznať podľa toho, že obsahujú jediný príkaz „načítaj" a príkazy výstupu smú vytlačiť len text „ÁNO" alebo „NIE". Každý takýto program Pi definuje jednoznačne množinu M (Pi) všetkých prirodzených čísiel, pre ktoré program skončí s odpoveďou „ÁNO". Všetky čísla, pre ktoré program neodpovie, alebo dá odpoveď „NIE", nepatria do M (Pi). Teraz sú riadky tabuľky binárnymi zápismi množín M (Pi), j-ty riadok (pozri obr. 4.3) obsahuje binárnu reprezentáciu množiny M (Pj), ktorá je akceptovaná programom P j. Políčko v i-tom riadku a j-tom stĺpci obsahuje jednotku, keď i-ty program akceptuje číslo j (pre vstup j skončí s „ÁNO"). Nula je na políčku v i-tom riadku a j-tom stĺpci, keď Pi pre vstup j odpovie „NIE", alebo neodpovie vôbec. Takto dostávame nekonečnú tabuľku, v ktorej riadkoch sú reprezentácie všetkých podmnožin, ktoré môžu byt akceptované nejakým programom. Teraz chceme ukázať, že je aspoň jedna podmnožina N, ktorej nezodpovedá žiaden riadok v nekonečnej tabuľke (obr. 4.3). Ukážeme to tak, že skonštruujeme nekonečnú postupnosť DIAG núl a jednotiek, ktorá sa istotne v tabuľke 0,1, 2, 3,4, 5,. všetkých prirodzených čísiel. Riadky označme postupnosťou Po, P\, P2, P3, ..., Pi, ... 4.3 ÁNO ALEBO NIE, TO JE OTÁZKA 115 0 1 2 3 4 5 6 i i m (Pq) [oj 1 1 0 0 1 0 1 0 M (Pi) 0 s 0 0 0 1 1 0 0 M{P2) 1 1 S 0 0 1 0 1 1 M(P3) 1 0 1 1 0 1 1 0 M (Pi) 0 0 0 1 m 0 1 0 1 M(P5) 1 1 1 1 i S 1 1 1 M(P6) 1 0 1 0 0 0 S 0 1 M(P) 0 1 1 0 0 1 0 s M (Pj) 1 0 1 0 1 1 1 0 DIAG obr. 4.3 0 1 2 3 4 5 6 0 0 0 0 0 0 obr. 4.4 nebude nachádzať. Konštrukciu DIAG a aj tomu zodpovedajúcej množiny M (DIAG) uskutočníme diagonalizačnou metódou. Pozrieme sa na políčko a00, kde sa pretína 0-tý riadok a 0-tý stĺpec. Keď aoo = 0 (obr. 4.3), to znamená, že 0 nepatrí do M(P0), dáme na 0-té miesto d0 do DIAG 1 (takže do M(DIAG) zahrnieme 0). V prípade, že a00 = 1 (čiže ak 0 patrí do M (Pi)), dáme na 0-té miesto d0 do DIAG hodnotu 0 (teda 0 nezahrnieme do M(DIAG)). V prvom kroku sme určili iba prvý člen postupnosti DIAG a máme istotu, že DIAG sa líši od 0-tého riadku tabuľky (teda od M(P0)) v aspoň v 0-tom prvku. Rovnakým spôsobom postupujeme v druhom kroku. Uvažujeme druhé políčko na uhlopriečke (diagonále) au, kde sa pretína prvý riadok s prvým stĺpcom. Našim cieľom je zvoliť hodnotu di na prvej pozícii v DIAG tak, aby sa M(DIAG) aspoň na tejto pozícii líšila od postupnosti M (Pi). Preto položíme di rovné 0 (1 nezařadíme do M(DIAG)), keď au = 1 (1 patrí do M (Pi)). V prípade, že au = 0 (1 nepatrí do M (Pi)), položíme di rovné 1 (1 zaradíme do M(DIAG)). Pre binárnu cifru a^ z políčka kde sa pretína i-ty stĺpec a j-ty riadok pred- 116 KAPITOLA 4 stavuje äij obrátenú hodnotu (obrátenie 1 je 1 = 0 a obrátenie 0 je 0 = 1). Na obr. 4.5 znázornená situácia, ktorú sme dosiahli pri vytváraní DIAG po dvoch krokoch. 0 1 2 3 4 i i + 1 DIAG äoo än ? ? ? ? ? obr. 4.5 Prvé dva prvky v DIAG sú ä0o a än, takže M(DIAG) sa líši od M(P0) aj od M(Pi). Zvyšné miesta v DIAG ešte nie sú určené a chceme ich určiť tak, aby sa DIAG líšil od každého riadku z tabuľky na obr. 4.3 a teda sa v žiadnom z jej riadkov nenachádza. Vo všeobecnosti zaručíme aby sa DIAG líšil od ž-teho riadku v tabuľke na obr. 4.3 nasledujúcim spôsobom. Keď políčko au, nachádzajúce sa na priesečníku ž-teho riadku a i-teho stĺpca, obsahuje 1 (i patrí do M (P,)), potom položíme i-ty prvok di v DIAG rovný 0 (i nezařadíme do M(DIAG)). V prípade, že au = 0 (i nepatrí do M (Pi)), potom položíme di = 1 (i zaradíme do M(DIAG)). Teda M(DIAG) sa líši od M(Pi). Takýmto spôsobom vytvoríme postupnosť DIAG tak, že sa nevyskytuje v žiadnom z riadkov v tabuľke. Pre konkrétnu tabuľku na obr. 4.3 je na obr. 4.4 zodpovedajúca postupnosť DIAG. Vo všeobecnosti môžeme DIAG predstaviť ako na obr. 4.6. 0 1 2 3 4 i DIAG äoo än ä22 Ä33 (344 obr. 4.6 Takže platí, že M(DIAG) neakceptuje žiaden program, a preto sa rozhodovací problém (N, M(DIAG)) nedá rozhodnúť žiadnym algoritmom. Definíciu M(DIAG) môžeme vyjadriť nasledujúcim stručným spôsobom: M(DIAG) = {n G N | n nepatrí do M(Pn)} = množina všetkých prirodzených čísiel n takých, že n nie je akceptované n-tým programom Pn). 4.3 ÁNO ALEBO NIE, TO JE OTÁZKA 117 Úloha 4.7 Predstavte si, že prvých 10 riadkov a prvých 10 stĺpcov tabuľky všetkých programov vyzerá ako na obr. 4.7. Určite zodpovedajúcich prvých desať pozícií v DIAG. 0 1 2 3 4 5 6 7 8 9 M(P0) 1 1 1 0 0 1 0 1 0 1 M(P1) 0 0 0 0 0 0 0 0 0 0 M(P2) 0 1 1 0 1 0 1 1 0 0 M(P3) 1 1 1 0 1 1 0 0 0 0 M(P4) 1 1 1 1 1 1 1 0 1 0 M(P5) 0 0 1 0 0 1 0 1 1 0 M(P6) 1 0 0 0 1 0 1 0 0 0 M(P7) 1 1 1 1 1 1 1 1 1 1 M(P8) 0 0 1 1 0 0 1 1 0 0 M(P9) 1 0 1 0 1 0 1 0 1 0 M(P10) 0 0 1 0 0 0 1 1 0 1 obr. 4.7 ■c Úloha 4.8 (tvrdý oriešok) Skúmajme M(2-DIAG) = množina všetkých párnych čísiel 2i, takých, že 2i nepatrí do M(PA. Je alebo nie je algoritmicky rozhodnutelný problém (N, M(2-DIAG))? Zdôvodnite vašu odpoveď. Nakreslite si k tomu aj obrázky analogické k obr. 4.3 a k obr. 4.4. Úloha 4.9 (tvrdý oriešok) Pomôže vám riešenie predchádzajúcej úlohy (4.8) pri definovaní dvoch ďalších algoritmicky nerozpoznateľných podmnožin N? Koľko algoritmicky neriešiteľných problémov sa dá vytvoriť metódou diagonalizácie? Úloha 4.10 (tvrdý oriešok) Definujme M(DIAG2) ako množinu všetkých párnych prirodzených čísiel 2i, takých, že 2i nepatrí do L{P2,j). Vieme povedať niečo o rozhodnuteľnosti (N, M(DIAG2))? Už máme rozhodovací problém (N, M(DIAG)), o ktorom vieme, že nie je algoritmicky riešiteľný. Ale ešte stále nie sme spokojní. Problém sa síce dá 118 KAPITOLA 4 opísať konečným spôsobom (hoci najprv sme ho predstavili ako nekonečnú postupnosť), ale nieje to algoritmický návod na konštrukciu M(DIAG), lebo ako uvidíme neskôr, tabuľka na obr. 4.3 síce existuje, ale nedá sa algoritmicky (automaticky) vygenerovať. Okrem toho (N, M(DIAG)) nezodpovedá žiadnemu prirodzenému praktickému problému. 4.4 Metóda redukcie, alebo ako využiť úspešnú metódu riešenia problémov na dokazovanie neriešiteľnosti O} Už vieme, že neriešiteľné problémy vieme opísať prostredníctvom diago-nalizačnej metódy. Je to dobrá východisková pozícia. V tomto odseku pôjde o to, ako rozšíriť dôkazy algoritmickej neriešiteľnosti na ďalšie problémy. Hlavná myšlienka je zaviesť reláciu „ľahší, alebo rovnako ťažký" vzhľadom na algoritmickú riešiteľnosť. Oh ^ Nech sú U\ a ř/2 dva problémy. Hovoríme O ČTi je ľahší, alebo rovnako ťažký než U2, alebo U2 nie je ľahší než U\ vzhľadom na algoritmickú riešiteľnosť a zapisujeme ak algoritmická riešiteľnosť U2 zaručí algoritmickú riešiteľnosť U\. Čo to presne znamená? Keď máme Ul c* — cr. Označme problém výpočtu veľkosti chýbajúcej strany pravouhlého trojuholníka. "br. 4.9 Uvažujme teraz novú úlohu Up\. Daný je rovnostranný trojuholník (obr. 4.10) so stranami dĺžky m. Úloha je vypočítať plochu tohto trojuholníka. Je očividné (obr. 4.10), že plocha trojuholníka je m ■h. pričom h je výška trojuholníka (obr. 4.10). Vieme ukázať, že Upi 2 do w12! Spoj u13 a u14 do w34! Spoj u15 a uifí do w56! ^12,^34,^56 Algoritmus na rozdelenie W na tri rovnako velké uhly obr. 4.14 V reči nepriamej argumentácie (nepriameho dôkazu) hovorí redukcia na obr. 4.14 o nasledujúcom dôsledku: „Keď sa každý uhol dá KP-algoritmom rozdeliť na šestiny, potom sa dá KP-algoritmom každý uhol rozdeliť aj na tretiny." Podľa definície implikácie platnosť dokázanej implikácie vylučuje druhú možnosť zo štyroch možných prípadov na obr. 4.16. Ak zoberieme do úvahy ešte skutočnosť, že rozdelenie na tretiny sa nedá uskutočniť, musíme vylúčiť aj situácie č. 1 a 3, pre ktoré platí, že „rozdelenie na tretiny sa dá uskutočniť". Jediná možná situácia, ktorá ostala, je č. 4 a tá obsahuje „rozdelenie na obr. 4.15 128 KAPITOLA 4 možnosť rozdelenie na šestiny rozdelenie na tretiny 1 2 3 4 dá sa dá sa nedá sa nedá sa dá sa nedá sa dá sa nedá sa obr. 4.16 šestiny sa nedá uskutočniť" a teda môžeme uzavrieť, že ľubovoľný uhol sa Úloha 4.14 Problém delenia na tretiny si môžeme predstaviť aj v zjednodušenom tvare. Úlohou je pre ľubovoľný uhol W skonštruovať pravítkom a kružidlom uhol V tak, že W je trikrát väčší než V. Dá sa dokázať, že aj takéto zjednodušenie formulácie nič nezmení na KP-neriešiteľnosti. Urobte podobný dôkaz aj s obrázkom, ako je obr. 4.14. Ukážte, že žiadnym KP-algoritmom sa nedá skonštruovať uhol ľubovoľného daného uhla. Vráťme sa zo sveta KP-algoritmov naspäť do sveta všeobecných algoritmov. Náš problém diagonalizácie tu má podobné miesto, ako delenie uhla na tretiny pri KP-algoritmoch. Z jeho algoritmickej neriešiteľnosti chceme usúdiť algoritmickú neriešiteľnosť ďalších problémov. Schéma redukcie pre U\ P odpovie ÁNO na i Algoritmus B rozhodne UNIV NIE ÁNO obr. 4.18 .O Na základe konštrukcie, priamo vidíme, že B rozhodne správne, či i patrí do M (P) alebo nie. Ešte musíme overiť, či B pracuje vždy len konečne dlho. Podľa predpokladov je Ahalt algoritmus, a preto Ahalt odpovie v konečnom čase, to znamená, že v časti Ahalt sa nemôže B dostať do nekonečného výpočtu. Takže B vždy zastane, a teda B je algoritmus na riešenie univerzálneho problému. Práve sme ukázali, že UNIV je ľahší alebo rovnako ťažší než HALT. Chceme ukázať, že oba problémy sú rovnako ťažké. Z tohto dôvodu musíme ešte ukázať aj obrátený vzťah HALT 2. y4DIag zoberie i a Pi a oba dá ako vstup Atjniv- ^univ rozhodne, či Pi akceptuje číslo i (odpoveď „ÁNO"), alebo ho neakceptuje (odpoveď „NIE"). 3. Adiag odpovede Ajniv navzájom vymení. V prípade, že Ajniv odpovedal „ÁNO" (i patrí do M (Pi)), potom i nepatrí do M(DIAG) a AD1AG 134 KAPITOLA 4 správne odpovie „NIE". V prípade, že Atjniv odpovedal „NIE" (i nepatrí do M (Pi)), potom i patrí do M(DIAG) a ADjag musí odpovedať „ÁNO". Z opisu práce Adiag pre i ihneď vidíme, že Adiag pracuje správne, keď pracujú správne Atjniv a Agen. To, že Atjniv Je algoritmus pre UNIV, sme predpokladali v rámci redukcie. Ostáva otázka, či skutočne vieme vytvoriť algoritmus Agen, ktorý pre ľubovoľné číslo i vytvorí v konečnom čase text z-teho programu Pt. Agen môže pracovať nasledujúcim spôsobom. Vytvára po sebe idúce texty vzhľadom na očíslovanie uvedené na začiatku kapitoly. Na každý text aplikuje kompilátor, ktorý preverí, či text predstavuje alebo nepredstavuje program. Pri tom si Agen eviduje počet kladných odpovedí. V okamihu, keď dosiahne i kladných odpovedí, vie, že posledný vytvorený program predstavuje i-ty program P,. Schéma (vývojový diagram) programu Agen je na obr. 4.21. Úloha 4.17 Ukážte, (N, M(DIAG)) |N|, znamená to tiež, že |M| > |N| • |N|. Z tohto dôvodu, je jasné, že počet reálnych čísiel s konečnou reprezentáciou tvorí iba nekonečne menší zlomok množiny všetkých reálnych čísiel. Úloha 4.6 Prvých 17 miest binárnej reprezentácie QUAD môžeme znázorniť najlepšie v nasledujúcej tabuľke. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 QUAD 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 Uvedenú tabuľku môžete rozšíriť na ľubovoľne veľa miest. Úloha 4.7 Prvých 10 pozícií DIAG pre hypotetickú tabuľku na obr. 4.7 je DIAG = 0101000011. Úloha 4.8 Chceme ukázať, že M(2-DIAG) = množina všetkých párnych čísiel 2i, takých, že 2i nepatrí do M(Pi) 138 KAPITOLA 4 o o CN je nerozpoznateľná. Hlavná myšlienka je veľmi podobná diagonalizácii na obr. 4.3. Vytvoríme 2-DIAG tak, že sa bude odlišovať od každého riadku tabuľky. Jediný rozdiel oproti DIAG je, že 2-DIAG sa líši od i-teho riadku na mieste 2i (namiesto i-teho, ako je to v DIAG). Najlepšie to môžeme znázorniť nasledujúcou tabuľkou na obr. 4.22. 0 1 2 3 4 5 6 7 8 9 10 11 12 M(P0) 0 0 1 1 0 1 1 0 1 1 1 1 0 M(Pi) 1 0 0 1 0 0 0 0 1 0 1 1 0 M(P2) 1 1 1 1 0 1 1 1 0 0 0 1 0 M(P3) 0 1 0 1 0 0 0 0 1 1 1 0 0 M(P4) 1 0 1 0 1 0 1 0 0 0 1 0 1 M(P5) 0 1 0 1 1 0 0 1 0 1 0 1 1 M(P6) 0 0 0 0 0 0 0 0 0 0 0 0 0 obr. 4.22 Pozície v rámčeku označujú priesečník i-teho riadku a 2i-teho stĺpca, to znamená pozície, v ktorých sa 2-DIAG odlišuje od jednotlivých riadkov tabuľky. Teda prvých 13 pozícií 2-DIAG je uvedených v tabuľke na obr. 4.22: 2-DIAG = 1000001000101 Vidíme, že na každej nepárnej pozícii sú v 2-DIAG nuly, ktoré nehrajú pri rozpoz-nateľnosti 2-DIAG žiadnu úlohu. Podčiarknuté párne pozície (začíname nultou pozíciou) zodpovedajú orámčekovaným pozíciám na obr. 4.22. Takže 1 na začiatku zaručuje, že 2-DIAG neleží v nultom riadku, 0 na druhej pozícii zaručuje, že 2-DIAG neleží v prvom riadku, atď. Jednotka na 12. pozícii v 2-DIAG zaručuje, že 2-DIAG neleží v šiestom riadku tabuľky. Úloha 4.17 Máme ukázať, že s hypotetickým algoritmom Ahalt pre HALT sa dá rozpoznať diagonálna množina M(DIAG). Začneme podobne ako na obr. 4.20 pri redukcii (N, M(DIAG)) L x-x->X a-X->Y L + c-> D Y + D-> R 4 • 7 = 28 7 • 7 = 49 3 • 49 = 147 28 + 5 = 33 147 + 33 = 180 Takže časová zložitosť A pre I = (a = 3,6 = 4, c = 5, x = 7) je presne 5. Keď sa sústredíme na pamätanie si hodnôt pre a, b, c, x, I, X, Y, D a R, vidíme, že pamäťová zložitosť je presne 9. Všimnite si, že konkrétne hodnoty premenných a, b, c a x nemali žiaden vplyv na zložitosť algoritmu. Preto hovoríme, že časová zložitosť A je presne 5 pre každý prípad problému (pre každý kvadratický polynóm). Úloha 5.1 Zapíšte algoritmus A v programovacom jazyku z 2. kapitoly, ktorý poskytuje iba jednoduché strojové inštrukcie. Myslite aj na načítanie hodnôt pre a, b, c a x. a) Aká je časová zložitosť A v tejto konkrétnej implementácii? b) Ste schopní prepísať program tak, aby ste v ňom použili menej než 9 registrov? Postup algoritmu A môžeme znázorniť aj nasledovnou reprezentáciou polynó-mu: ; a-x-x + b- x + c. Hneď vidíme tri násobenia a dve sčítania, ktoré musíme vykonať. Pokúsime sa algoritmus vylepšiť. Podľa známeho distributívneho zákona platí a ■ x ■ x + b ■ x = (a • x + 6) • x. s jeho pomocou dostaneme nasledujúcu reprezentáciu kvadratického polynomu: ax2 + bx + c = (ax + 6) • x + c . V novej reprezentácii musíme vykonať len dve násobenia a dve sčítania, takže zložitosť výsledného vylepšeného algoritmu je 4. 5.2 AKO MERIAME ZLOŽITOSŤ VÝPOČTOV? 145 Úloha 5.2 Uvažujeme polynóm štvrtého stupňa: f (x) = (I4 ■ X4 + 03 • X3 + (12 ■ X2 + CLi ■ X + ClQ . Vysvetlite, ako sa dá vypočítať hodnota polynomu len s použitím štyroch násobení a štyroch sčítaní. Úloha 5.3 (tvrdý oriešok) Navrhnite algoritmus, ktorý spočíta pre zadané hodnoty ao, • • •, an a x, hodnotu každého polynomu ra-tého stupňa cin • x + an_i - x + ... + 0,2 • x + a\ ■ x + ao s použitím najviac n násobení a n sčítaní. Vidíme, že množstvo práce, ktorú musíme vykonať, závisí od našej šikovnosti pri návrhu algoritmu. Ešte presvedčivejším príkladom je výpočet hodnoty x16 pre dané x. Keď rozpíšeme x16 ako tXj tXj tXj tXj tXj tXj tXj tXj tXj tXj t vidíme, že na výpočet hodnoty xie týmto spôsobom potrebujeme 15 operácií. Nasledujúce vyjadrenie -16 = (((*2)2)2)2 nám dáva efektívnejšiu metódu 2 4 2 2 8 4 4 16 8 8 oc — oc * oc oc — oc * oc oc — oc * oc oc — oc * oc L <— x • x L <— L • L L <— L • L L <— L • L výpočtu x1", ktorej stačia len 4 násobenia. Úloha 5.4 Vypočítajte a) x6 s 3 násobeniami, b) x64 so 6 násobeniami, c) x18 s 5 násobeniami, d) x45 s 8 násobeniami. N Dá sa spočítať x45 s menej než 8 násobeniami? Ale situácia, ktorá bola pri výpočte hodnoty kvadratického polynomu, že zložitosť je rovnaká pre každý prípad polynomu, je dosť netypická. Nastala preto, lebo problém je jednoduchý a v určitom zmysle sme merali veľmi 146 KAPITOLA 5 hrubo. Naše meranie zložitosti jev poriadku, v prípade keď sú všetky vstupné hodnoty a, b, c a x čísla, z ktorých sa každé dá bez problémov zapamätať v jednom 16 alebo 32 bitovom registri. Čo sa ale stane, ak majú čísla veľkosť niekoľko sto bitov? V takom prípade nemôžeme považovať množstvo práce na vykonanie aritmetickej operácie s obrovským číslom za také isté, aké sú nevyhnutné na vykonanie operácie so 16-bitovým číslom, ktorá je k dispozícii v hardvéri počítača. V niektorých aplikáciách sa naozaj používajú také veľké čísla, vtedy je nevyhnutné napísať program, ktorý počíta operácie s veľký-mi číslami a využíva pri tom len operácie s číslami bežnej veľkosti, ktoré sú k dispozícii. Čitateľa nebudeme zaťažovať týmto technickým problémom a budeme predpokladať, že naše čísla neprekročia rozumnú veľkosť. Na základe takéhoto predpokladu budeme merať časovú zložitosť ako počet aritmetických operácií, operácií porovnávania a podobných základných operácií počítača alebo programovacieho jazyka. Aj pri takomto predpoklade nie je typické, že algoritmus pre všetky vstupy (prípady problému) vyžaduje stále rovnaké množstvo práce. Keď máme utriediť podľa abecedy telefónny zoznam obce s 3000 obyvateľmi a mesta s 500000 obyvateľmi, bude množstvo práce očividne veľmi rôzne. To nie je nič prekvapujúce, ale dostávame sa tým k jadru veci. Očakávame, že zložitosť bude závisieť od veľkosti vstupu. Čo je to veľkosť vstupu, lepšie povedané ako ju meriame, je na nás. Pri triedení to môže byť napríklad počet (3000 alebo 500000 mien obyvateľov) objektov, ktoré máme usporiadať. Pri výpočte hodnoty ľubovoľného polynomu, môžeme brať ako veľkosť vstupu stupeň polynomu (teda maximálny možný počet koeficientov mínus 1). V tomto prípade je polynóm anxn + an_ixn_1 + ... + a2x2 + a\x + a§ reprezentovaný ako vstup n + 2 číslami (an, an_i, an-2i ■ ■ ■, o-2-i a\i a0)x) a povieme, že tento prípad problému má veľkosť n. Naivný algoritmus A počíta hodnotu polynomu stupňa n nasledujúcim spôsobom. 5.3 ZLOŽITOSŤ ALGORITMOV 147 o o CN n—1 1.násobenie 2. násobenie Ol • X 0,2 ■ X n-té násobenie (n+l)-vé násobenie (n—l)-vé násobenie (2n—l)-vé násobenie a potom a0 + T 1. sčítanie d\X + T 2. sčítanie + T n-té sčítanie n Takže časová zložitosť a je funkcia Čas^ť^) 3n Teda časová zložitosť Čas^ algoritmu A je funkcia veľkosti vstupu, ktorá určuje počet CasA(n) operácií algoritmu A nevyhnutných a postačujúcich na vyriešenie každého prípadu problému veľkosti n. Môže sa stať, že rôzne vstupy rovnakej veľkosti vyžadujú rôzne náklady. V takom prípade zoberieme Cas^fn) ako časovú zložitosť na najťažšom vstupe veľkosti n, teda ako maximum zložitostí a pre všetky vstupy veľkosti n. A sme v suchu, a preto sa pre túto definíciu rozhodli aj výskumníci. Takto máme hodnotou Cas^fn) zaručené, že algoritmus a úspešne zvládne vyriešiť pomocou Cas^fn) operácií každý prípad problému veľkosti n, a že existuje aspoň jedenvstup veľkosti n, pre ktorý a vykoná presne Cas^fn) operácií. 5.3 Načo slúži meranie zložitosti algoritmov? Rovnako ako aj v iných vedeckých disciplínách slúžia nadobudnuté vedomosti aj na predpovedanie vývoja v rôznych situáciách a činnostiach, ktoré nás zaujímajú. Keď prostredníctvom takzvanej analýzy zložitosti určíme časovú zložitosť algoritmu, vieme pre zadané prípady problému vopred odhadnúť čas práce algoritmu bez toho, aby sme ho na nich nechali bežať. Okrem toho takýmto spôsobom môžeme porovnávať aké sú dobré (efektívne) dva alebo aj 148 KAPITOLA 5 O > o 4 6 veľkosť vstupu obr. 5.1 viac algoritmov pre tú istú úlohu. Väčšinou to robíme tak, že si nakreslíme ich funkcie zložitosti (časovej alebo pamäťovej). Na obr. 5.1 sú v súradnicovej sústave nakreslené dve funkcie 3n — 2 a n2. Na rc-ovej osi je veľkosť vstupu a na y-ovej osi analyzovaná časová zložitosť. Ihneď vidíme, že pre všetky vstupy väčšie než 3, je algoritmus s časovou zložitosťou 3n — 2 efektívnejší než algoritmus so zložitosťou n2. Výpočtom ľahko dokážeme, že 3n - 2 < n2 je pre všetky prirodzené čísla väčšie než 2. Pozrime sa na iný príklad. Nech sú A a B dva algoritmy pre problém U s ČasA(n) = In2 a ČasB(n) = 40n + 7000 . \ Cq Pretože lineárne funkcie ako Cass(n) rastú pomalšie než kvadratické funkcie akou je Cas^n), natíska sa otázka, od akej veľkosti vstupu je pre nás výhodnejší algoritmus B než algoritmus A. Odpovieme výpočtom. Otázka je teda, pre aké kladné celé číslo platí 2n2 > AOn + 7000. Táto otázka je ekvivalentná s otázkou (od oboch strán odpočítame celé číslo 40n + 7000), keď platí 2n2 - AOn - 7000 > 0. Keď nerovnicu vydělíme 2 (obe strany zmenšíme na polovicu), dostaneme n2 - 20n - 3500 > 0 . (5.1) 5.3 ZLOŽITOSŤ ALGORITMOV 149 Teraz môžeme známou metódou riešenia kvadratických rovníc nájsť riešenia rovnice n2 — 20n — 3500 = 0, alebo si jednoducho všimneme, že (n + 50) • (n - 70) = n2 - 20n - 3500 . V oboch prípadoch dostaneme riešenia (takzvané korene) —50 a 70 a vidíme, že (5.1) platí pre n < —50 a n > 70. Pretože nás zaujímajú len kladné celé čísla, skončíme s výsledkom: (i) B je výhodnejší než A pre prípady problémov, ktoré sú väčšie než 70. (ii) A a B sú rovnako dobré pre vstupy veľkosti n = 70. (iii) A je priaznivejší než B pre vstupy veľkosti 1 až 69. Úloha 5.5 Uvažujte tri algoritmy A, B a C, ktoré riešia rovnakú úlohu. Nech sú CasA(n) = n3/2 + 1, Cass(n) = n2 + 7 a Casc(^) = 5n + 140. Pokúste sa zistiť výpočtom a načrtnutím grafu funkcií, ktorý z uvedených troch algoritmov je najlepší, pre ktoré veľkosti vstupov. Iný druh otázok je nasledujúci. Používateľ vie celkom presne, že na výsledok môže čakať najviac určitý čas. Pre interaktívnu aplikáciu môže byť hranica už krátkych lOs. Keď máme dobrý počítač, ktorý je schopný vykonať za sekundu 109 operácií, môžeme vykonať výpočty vyžadujúce najviac 10 -109 = 1010 operácií. Používateľovi ponúkneme algoritmus so zložitosťou 5n3. On si spočíta: 5n3 < 1010 | : 5 n3 < 2 ■ 109 |^/ oboch strán n < 1250 Používateľ týmto vie, že algoritmus môže úspešne použiť na vstupy veľkosti do 1250. Používateľ zvyčajne vie vstupy akých veľkostí sa typicky vyskytujú a môže sa hneď rozhodnúť, či nechá algoritmus implementovat', alebo bude požadovať rýchlejší algoritmus. Teraz predpokladajme, že máme optimalizačnú úlohu, pri ktorej máme vybrať najlepšie z veľkého množstva riešení. Pri tom ide o veľké investície, ako napríklad výstavba cestnej alebo železničnej siete, alebo o umiestnenie vysielačov na nejakom území. Pretože sa chceme dobre rozhodnúť, sme ochotní venovať výpočtu veľa času a použiť drahú výpočtovú techniku. Takýmto spôsobom prídeme veľmi rýchlo na hranice uskutočniteľného, povedzme 1016 operácií. Vizuálne si hranicu môžeme znázorniť ako na obr. 5.2. 150 KAPITOLA 5 Naša hranica je vodorovná priamka y = 1016. Tam, kde dosiahne časová zložitosť Cas^fn) algoritmu A našu hranicu, môžeme na rr-ovej osi prečítať veľkosť vstupu n a- Takto vieme, pre ktoré veľkosti vstupov je použiteľný algoritmus A a pretože je známa veľkosť zadaného problému, ihneď vieme aj rozhodnúť, či je algoritmus pre nás vhodný. Aby sme si ukázali dôležitosť efektívnosti algoritmu, analyzujeme situáciu v prípade niekoľkých časových funkcií. Nech Cas^ť^) = 3n — 2. Potom spočítame 3n — 2 < 1016 | + 2 k obom stranám 3n < 1016 + 2 | vydělíme 3 n < |(1016 + 2) = nA. Vidíme, že o takom veľkom vstupe neuvažujeme, teda algoritmus A môžeme vždy použiť. Pre algoritmus B so zložitosťou Cass(n) = rŕ dostaneme rŕ < 1016 |Jóboch strán n < (1016)1/4 = 104 = 10000. Takže B je použiteľný pre vstupy do veľkosti ub = 10000. Pretože typicky veľkosť vstupu pre väčšinu (ale nie všetky) vstupy nedosiahne nB, B sa dá považovať za dobrý algoritmus. Zoberme, že platí Casc(^) = 10n. Potom to vyzerá nasledovne čo je zlé. Napriek obrovskému počtu operácií, ktorý máme k dispozícii vieme úlohu vyriešiť len pre malé prípady. Keď si všimneme exponenciálnu funkciu 5.4 HRANICE PRAKTICKEJ RIEŠITEĽNOSTI 151 10n < 10ie | logiQ oboch gtrán n < 16. f (n) = 2n, vidíme, že 2n+l = 2 . 2n. takže zväčšenie veľkosti vstupu o 1 má za následok zdvojnásobenie výpočtových nákladov. Z toho môžeme usúdiť, že algoritmy s exponenciálnou časovou zložitosťou majú len veľmi obmedzené použitie. Úloha 5.6 Predpokladajme, že informatici vylepšili algoritmus C so zložitosťou Casc(n) = 10n na algoritmus D so zložitosťou Casoin) = 4 • (1.2)n. Ako sa zväčší rozsah problémov, ktoré môžeme spracovať, keď uvažujeme časovú hranicu 1016? Úloha 5.7 Predpokladajme, že máme k dispozícii počítač, ktorý vie vykonať 109 operácií za sekundu. Počet sekúnd, ktoré uplynuli od veľkého tresku je menší než 1018. Sme pripravení čakať 1018 sekúnd. Aké veľké problémy vieme spracovať algoritmom A, keď (i) CasA(n) = 10 • n2 ? (ii) ČasA(n) = 50 • n3 ? (iii) ČasA(n) = 2n ? (iv)* Casj4(n) = nl = n ■ n(n — 1) • (n — 2) • ... • 2 • 1 ? (tvrdý oriešok) y 5.4 Hranice praktickej riešiteľnosti V predchádzajúcej časti sme videli ako vplýva časová zložitosť algoritmov na ich použiteľnosť. Náš cieľ je ale trocha náročnejší. Chceme merať obťažnosť algoritmických problémov, aby sme vedeli rozhodnúť, či sú alebo nie sú prakticky riešiteľné. Na jednej strane sa zdá, že cesta od merania zložitosti algoritmov k meraniu zložitosti problémov bude krátka a jasná. Ponúka sa nasledujúca definícia: Zložitosť problému U je zložitosť najlepšieho (optimálneho vzhľadom na časovú zložitosť) algoritmu pre U. Hoci definícia vyzerá rozumne, nie je všeobecne požiteľná. Výskumníci ukázali, že sú úlohy, pre ktoré sa nedá určiť najlepší algoritmus. Pre takúto úlohu U sa dá každý algoritmus pre U podstatne2 vylepšiť. 2 pre nekonečne veľa vstupov 152 KAPITOLA 5 Pretože vo všeobecnosti sa nedá zložitosť každého problému U identifikovať s (najlepším) algoritmom pre U, hovoríme v informatike o hornom a dolnom odhade zložitosti problému. Definícia 5.1 Nech je U problém a nech A je algoritmus, ktorý rieši U. Potom hovoríme, že časová zložitosť Cas^^) algoritmu A je horným odhadom časovej zložitosti pre U. O funkcii / hovoríme, že f (n) je dolným odhadom časovej zložitosti pre U, keď neexistuje algoritmus B pre U, pre ktorý ČasB(n) < f (n) pre skoro všetky3 n. Táto definícia obťažnosti problémov stačí na objavenie niektorých dôležitých skutočností. Napríklad, že existujú ľubovoľne ťažké algoritmické problémy. Presnejšie povedané, pre ľubovoľne rýchlo rastúcu funkciu ako napríklad 2n,n\, ba aj 22" sa dajú nájsť problémy, ktoré sú riešiteľné s takouto zložitosťou, ale s menšou nie. Takéto extrémne ťažké (prakticky neriešiteľné) problémy sa našli náročným použitím diagonalizačnej metódy, teda väčšinou sú to umelo vytvorené problémy. Pre praktické problémy je určenie zložitosti oveľa zložitejšie. Poznáme tisíce úloh, s exponenciálnymi hornými odhadmi, napríklad 2n (lebo najlepšie známe algoritmy na ich riešenie potrebujú obrovské množstvo počítačovej práce). Na druhej strane nie sme schopní ukázať, že požiadavky na výpočtovú zložitosť ich riešenia sú vyššie ako lineárne (teda nemáme dolný odhad tvaru napr. n ■ log n alebo n2). Inými slovami, máme hŕbu problémov s obrovskou medzerou medzi ich dolným c • n a horným odhadom ako 2n a nie sme schopní ich zložitosť určiť presnejšie. Informatici a matematici majú za sebou vyše štyridsať rokov neúspešných pokusov, pričom problém je očividne v obťažnosti určiť dolný odhad zložitosti konkrétnych úloh. Dnes považujeme dôkaz dolného odhadu, a tým aj neexistencie efektívneho algoritmu, za najtvrdšie jadro celej informatiky. Je dokázané, že niektoré dolné odhady, ktoré by sme si želali vedieť sa dnešnými matematickými metódami ani nedajú dokázať. Teda je potrebný podstatný pokrok v rozvoji metód dokazovania v matematike, aby sme vedeli presnejšie určiť vyššie dolné odhady zložitosti konkrétnych algoritmických úloh. Výskum zložitosti algoritmov a problémov nastolilo novú a v súčasnosti hlavnú otázku algoritmiky: 3 pre všetky až na konečne veľa 5.4 HRANICE PRAKTICKEJ RIEŠITEĽNOSTI 153 Ktoré algoritmické problémy sú prakticky riešiteľné? Kde sú hranice algoritmickej riešiteľnosti? Keď sa pozrieme na naše skúmanie v časti 5.3 a tabuľku 5.1, vidíme, že exponenciálne algoritmy v žiadnom prípade nemôžeme označiť ako praktické. V tabuľke 5.1 uvádzame počet operácií pre 5 funkcí určujúcich zložitosť lOn, 2n2, n3, 2n a n\ a pre vstupy 4 veľkostí 10, 50, 100 a 200. n 10 50 100 300 f(n) lOn 100 500 1000 3000 2n2 200 5000 20000 180000 n3 1000 125000 1000000 27000000 2n 1024 16 cifier 31 cifier 91 cifier n\ ps 3.6 • 106 65 cifier 158 cifier 615 cifier Tabuľka 5.1 Keď je počet operácií priveľký, píšeme namiesto čísla len počet jeho desiatkových cifier. Okamžite vidíme, že exponenciálne rýchlo rastúce funkcie zložitosti ako 2n a n\ sú prakticky nepoužitelné už pre vstupy malého rozsahu nad 50. Po mnohých rokoch uvažovania sa informatici dohodli na nasledujúcej charakterizácii praktickej riešiteľnosti: V Algoritmus A, ktorého CasA(n) < c ■ n pre nejaké konštanty (konkrétne čísla) c a d nazývame polynomiálny algoritmus. Každý problém, ktorý vieme vyriešiť polynomiálnym algoritmom, považujeme za prakticky riešiteľný. Písmenom P označujeme triedu všetkých rozhodovacích problémov", ktoré sú riešiteľné v polynomiálnom čase. Nebolo vôbec jednoduché všeobecne akceptovať túto definíciu. Dnes ju nepovažujeme, a tým ani polynomiálnu časovú zložitosť, ako ostrú hranicu medzi prakticky riešiteľným a prakticky neriešiteľným, ale len ako priblíženie sa k našemu prvému pokusu ju určiť. K akceptovaniu tejto hranice nás vedú dva celkom odlišné dôvody - praktický a teoretický. 1. Praktický dôvod 4Na pripomenutie: rozhodovacie problémy majú výsledok ÁNO alebo NIE. Rozhodne sa teda, či vstup má, alebo nemá požadovanú vlastnosť, (pozri kapitolu 4.3) 154 KAPITOLA 5 Je založený na skúsenostiach z vývoja algoritmov. Nepraktickosť exponenciálnych algoritmov bola každému jasná. Analýzy a prax nás naučili, že algoritmy s časovou zložitosťou do rŕ a za určitých podmienok až do rŕ sú použiteľné. Ale algoritmus s časovou zložitosťou n100 je pre vstupy reálnych veľkostí ešte menej prakticky použiteľný než algoritmus s časovou zložitosťou 2n, pretože n100 > 2n, pre takmer všetky rozumné veľkosti vstupu n. Môžeme teda nazvať problém, pre ktorý najlepší algoritmus beží v čase n100 prakticky riešiteľný? Skúsenosti s reálnymi problémami ukazujú, že takéto problémy sa v praxi nevyskytujú. Keď sa našiel polynomiálny algoritmus, pričom bol stupeň polynomu vysoký, potom sa takmer vždy podarilo nájsť na riešenie rovnakého problému iný algoritmus, ktorý pracoval v čase menšom než c-rŕ, alebo ešte častejšie v menšom než c-rŕ, pre nejakú konštantu c. Je len málo výnimiek problémov riešiteľných v polynomiálnom čase, ktoré nie sú prakticky riešiteľné. Preto nie je z praktického pohľadu trieda P príliš veľká a problémy z P sú považované za prakticky riešiteľné. *v \ 2. Teoretický dôvod Definícia dôležitej triedy, akou sú prakticky riešiteľné problémy, musí byť robustná v tom zmysle, že bude nezávislá od definície použitého výpočtového modelu. Nesmie sa stať, že problém je prakticky riešiteľný z pohľadu programovacieho jazyka JAVA, ale nie z pohľadu iného modelu, alebo iného programovacieho jazyka. To by bol prípad, keby sme sa pokúsili definovať triedu prakticky riešiteľných problémov, ako takých, ktorých horný odhad časovej zložitosti je c • rŕ. V teórii používané výpočtové modely často majú na simuláciu programu v bežnom programovacom jazyku n2 krát vyššie nároky na čas. Takže problém sa môže dať v jazyku JAVA vyriešiť v čase n3 a v nejakom inom modeli by potreboval čas rŕ. Pojem polynomiálneho algoritmu, a tým aj triedy P, je ale dostatočne robustný. Trieda polynomiálně riešiteľných problémov je rovnaká pre všetky rozumné modely. Teda dôkaz príslušnosti, alebo nepříslušnosti do triedy P je od výpočtového modelu nezávislý, a teda všeobecne platný a môže slúžiť z teoretického hľadiska na klasifikáciu problémov na riešiteľné a prakticky neriešiteľné. V 5.5 Ako rozoznáme ťažký problém? Hlavnou úlohou teórie zložitosti je klasifikácia konkrétnych algoritmických problémov vzhľadom na ich výpočtovú zložitosť. Návrhom algoritmov dostá- 5.5 AKO ROZOZNÁME ŤAŽKÝ PROBLÉM? 155 vame horné odhady zložitosti problémov, ale týmto spôsobom nie sme schopní odvodiť dolný odhad zložitosti konkrétnych problémov. Ako ich teda môžeme klasifikovať? V skutočnosti to v absolútnom zmysle nemôžeme. Robíme to, čo obyčajne robia vedci a ľudia zo zdravým sedliackym rozumom v podobných situáciách. Nepôjdeme hlavou proti múru a namiesto určovania presnej zložitosti znovu a znovu pre každý prípad problému, uspokojíme sa s hodnoverným, hoci aj nie stopercentným odhadom zložitosti. Čo znamená „hodnoverne" odôvodniť, že neexistuje polynomiálny algoritmus, ktorý rieši daný problém? Dnes je známych vyše 4000 zaujímavých úloh, pre ktoré sa napriek veľkej námahe nenašiel žiaden polynomiálny algoritmus. Neúspešná námaha v prípade jednotlivých problémov ale nie je ešte dostatočný dôvod na to, aby sme ich vyhlásili za prakticky neriešiteľné. Bolo by to aj nesprávne. Pre problémy lineárneho programovania a testovania prvočíselnosti sme sa neúspešne pokúšali mnoho rokov5 nájsť polynomiálně algoritmy. A bolo obrovskou udalosťou, keď sa pre ne našli polynomiálně algoritmy. A hoci na základe skúseností sme skôr verili, že existujú, ukazuje to jednoznačne, aké by mohlo byť nebezpečné, vyhlásiť ich za ťažké (prakticky neriešiteľné) na základe roky trvajúcich neúspešných pokusov ich efektívne riešiť. Na začiatku sedemdesiatych rokov, na základe opakovaných negatívnych skúseností s mnohými problémami, formulovali nezávisle na sebe S.A. Cook a L.A. Levin nasledovnú hodnovernú definíciu Problém U je ťažký (nie je v P, alebo je prakticky neriešiteľný), keď existencia polynomiálneho algoritmu pre U by súčasne znamenala existenciu polynomiálnych algoritmov pre tisíce problémov, doteraz považovaných za ťažké (pre ktoré nie sme schopní nájsť efektívny algoritmus). Celé si to môžeme dobre predstaviť pomocou obr. 5.3. Vľavo je trieda P polynomiálně riešiteľných problémov. Vpravo je trieda s tisíckami problémov, pre ktoré sme nenašli žiaden polynomiálny algoritmus. Teraz si predstavte, že sme našli efektívny algoritmus pre jeden problém U z tejto triedy. V dôsledku našej definície ťažkých problémov by to znamenalo efektívne vyriešenie všetkých problémov z tejto triedy. r Teraz je o mnoho uveriteľnejšie, že problém U je naozaj ťažký. Na základe doterajších skúseností takmer nik dnes neverí, že problémy, ktoré považujeme podľa našej definície za ťažké, by sa dali efektívne vyriešiť. Nevieme si predstaviť, že by sme boli takí hlúpi a napriek mnohým pokusom by sme 5 V prípade testov prvočíselnosti dokonca tisíce rokov. 156 KAPITOLA 5 •—3 obr. 5.3 nenevedeli nájsť efektívne riešenie žiadneho z mnoho tisíc problémov, hoci pre všetky takéto riešenia existujú. Odborníci nazývajú tieto problémy, ktorých efektívne riešenie by automaticky znamenalo efektívne riešenie ďalších tisícov problémov, ktoré považujeme za ťažké, NP-ťažké problémy. Otázkou ostáva: /V' „Ako ukážeme, že nejaký konkrétny problém je NP-ťažký?" Opäť nám pomôže metóda redukcie. Používali sme ju, aby sme ukázali, že algoritmická riešiteľnosť jedného problému znamená algoritmickú riešiteľnosť iného problému. V tomto prípade stačí nahradiť vlastnosť „algoritmicky" vlastnosťou „efektívne algoritmicky". To vieme dosiahnuť prostredníctvom modelu efektívnej redukcie. Ako vidíme na obr. 5.4, problém U\ efektívne redukujeme na problém ř72 tak, že nájdeme efektívny algoritmus R, ktorý každý prípad problému U\ prevedie na ekvivalentný prípad R(J) problému Pod ekvivalentným tu rozumieme, že riešenie prípadu R(I) problému ř72, je rovnaké ako prípadu I problému U\. Teda výsledok B(R(I)) výpočtu B pre R(I) môžeme automaticky prevziať ako výsledok pre I. Príklad takejto redukcie sme uviedli už na obr. 4.8 v 4. kapitole. Redukovali sme tam efektívne problém riešenia kvadratickej rovnice na problém riešenia normovanej kvadratickej rovnice. Dôsledok bol, že efektívne riešenie normovanej kvadratickej rovnice znamenalo efektívne riešenie všeobecnej kvadratickej rovnice. Hovoríme, že algoritmus R na obr. 5.4 je polynomiálna redukcia U\ na U2 , keď je i? polynomiálny algoritmus s vlastnosťou: Pre všetky prípady I problému U\ je riešenie I problému U\ zároveň riešením prípadu R(I) pre Ľ2- 5.5 AKO ROZOZNÁME ŤAŽKÝ PROBLÉM? 157 Redukcia R efektívne transformuje každú inštanciu I problému U\ na inštanciu R(I) problému TJ2 B(R(I)) R > R(I) B efektívne rieši TJ2 B A neši efektívne TJx obr. 5.4 Keď sú U\ aj U2 rozhodovacie problémy, znamená to, že buď je pre oba prípady i a r(i) správna odpoveď ÁNO, alebo je pre obe správna odpoveď NIE. V tomto prípade hovoríme tiež, že prípad r(i) problému U2 je ekvivalentný s prípadom i problému U\. Keď máme polynomiálnu redukciu r problému U\ na U2, hovoríme tiež, že L/i je redukovateľný v polynomiálnom čase na U2 a píšeme Podobne ako pri všeobecnej redukcii, znamená U\ 3 je lineárna nerovnica so 4 neznámymi xi,x2,x% a x4. Hovoríme, že ide o nerovnosť nad booleovskými premennými, keď neznáme xi,x2,x% a x4 môžu mať hodnoty len 0 a 1. Prípad problému LIN(0,1) je napríklad X\ + 2x2 + x% + x4 > 3 1—3 %i + %4 > 0 2x1+x2-x3 > 1. O - To je systém 3 lineárnych nerovnic so 4 neznámymi. Úlohou je rozhodnúť pre systém lineárnych nerovnic, či existuje taká voľba hodnôt 0 a 1 pre neznáme, že všetky nerovnice budú súčasne splnené. V našom prípade stačí napríklad zvoliť x\ a x2 rovné 1 {x\ = x2 = 1) a x% a x4 rovné 0 (x% = x4 = 0). Vidíme, xľ + 2x2 + x3 + x4 = 1 + 2-1 + 0 + 0 = 3 > 3 x4 = 1 + 0 = 1 > o 2xl +x2 - x3 = 2 ■ 1 + 1 - 0 = 3 > 1, teda všetky nerovnice sú splnené Úloha 5.14 Nájdite iné booleovské hodnoty premenných xi,x2,x% a x4 nášho systému tak, aby boli splnené všetky tri nerovnice. Úloha 5.15 Má riešenie nasledujúci systém lineárnych nerovnic? x\ + x2 - 3x3 > 2 x\ — 2x2 — x4 > 0 ^1+2:3 + ^4 > 2 Teraz ukážeme, že platí VC 1 {Ulica(Ki,K3) pod dohľadom} x2 ^ - rr4 > 1 {Ulica(Ki,K4) pod dohľadom} - a:3 > 1 {Ulica(K2,K3) pod dohľadom} x2 -t - rr4 > 1 {Ulica(K2,K4) pod dohľadom} ^3 ^ -ar6 > 1 {Ulica(K3,Ke) pod dohľadom} ^4 ^ - a:5 > 1 {Ulica(K4, K5) pod dohľadom} ^4 ^ -x6 > 1 {Ulica(K4, Ke) pod dohľadom} 162 KAPITOLA 5 Teraz platí: Systém Ll má riešenie presne vtedy, keď existuje riešenie prípadu (N, 3) problému stráženia (teda keď traja pozorovatelia stačia na dohľad nad celou sieťou N). Platí dokonca viac: Každé riešenie Ll dáva riešenie (N, 3). Napríklad riešením pre Ll je X\ = 0,X2 = 1,X3 = 1,X4 = l,x$ = 0,x$ = 0, lebo máme len troch pozorovateľov (prvá nerovnosť), x2 = 1 garantuje splnenie štvrtej a piatej nerovnice, x3 = 1 garantuje splnenie druhej, štvrtej a šiestej nerovnosti a rc4 = 1 garantuje splnenie tretej, piatej, siedmej a ôsmej nerovnosti. Tým je splnených všetkých 8 nerovností. Zároveň hneď vidíme, že traja pozorovatelia umiestnení na križovatkách K2,K3 a KA majú pod dohľadom celú sieť N. Úloha 5.16 a) Nájdite všetky riešenia systému Ll (priradenia hodnôt 0 a 1 premenným xi, X2, ■ ■ ■, x q) a im zodpovedajúce riešenia pre (N, 3). b) Existuje riešenie, pri ktorom x^ = 0 (na križovatke K4 nie je pozorovateľ)? Vysvetlite, prečo je to tak. c) Rozšírte sieť N o ulicu Ulica(K3, K4). Novú sieť označme N'. Má (N', 2) riešenie? •*«^ \ Všeobecný opis redukcie VC na LIN(0,1) je na obr. 5.8. 7 = (N, m) N má k križovatiek a u ulíc vytvor u + 1 lineárnych nerovností xl + x2 + • • • + xk < m > 1 pre každú ulicu Ulica(Ký Fjj) R(I) vil B efektívne rieši LIN(0,1) _ B(R(I)) B A efektívne rieši VC A(I) = B(R(I)) obr. 5.8 Vidíme, že redukcia R sa dá veľmi jednoducho realizovať programom. Efektívnosť R garantuje, že z existencie efektívneho algoritmu B pre LIN(0,1) vyplýva existencia efektívneho algoritmu pre VC. 5.5 AKO ROZOZNÁME ŤAŽKÝ PROBLÉM? 163 Úloha 5.17 Uvažujte prípad (N, 3) problému VC pre sieť na obr. 5.7. Využite vyššie opísanú redukciu i? na to, aby ste vytvorili ekvivalentný systém lineárnych rovníc. Nájdite všetky riešenia systému lineárnych rovníc, a tým aj zodpovedajúce riešenia (N, 3). Úloha 5.18 Zostrojte sieť N' tak, že sieť ./V na obr. 5.7 rozšírite o dve ulice Ulica(K2, K%) a Ulica(Kz,, Kq). Ako vyzerá systém lineárnych rovníc pre (iV',4)? Má riešenie? Ukázali sme, že VC 45 — -y>32 ^ 8 t 4 ^ = ((((x2)2)2)2)2-((-2)2)2-(-2)2-- po prepísaní I2 <- x • x , h- h , h- h ■ he ^ h • h i h2 <— -fi6 • -^16 > Z <— Í32 • -^8 • Z <— Z • Í4 , Z <— Z • x s 8 násobeniami. V prípade, že pre x45 zvolíme nasledujúcu špeciálnu na mieru šitú stratégiu OC — OC * OC y OC — OC * OC y OC — OC * OC y OC — OC * OC é OC — OC * OC y OC — OC * OC y OC — OC * OC é vystačíme len so 7 násobeniami. Úloha 5.9 Keď má matematik vyriešiť lineárnu rovnicu a+bx = c+dx, zjednoduší si ju nasledujúcim spôsobom: a + bx = c + dx ^j^^ a — c + bx = dx -p — dx (a — c) + bx — dx = 0 (a — c) + {b — d) ■ x = 0 {využitím distributívneho zákona} Teraz je nová rovnica v požadovanom zjednodušenom tvare, pre ktorý už máme algoritmus. Na obr. 5.11 je grafické znázornenie tejto efektívnej redukcie. Redukcia i? je efektívna, lebo na to, aby sme upravili všeobecnú lineárnu rovnicu na tvar a' + b'x = 0 stačia práve dve odčítania. Algoritmus B zoberie z R čísla a' a b' a vyrieši rovnicu a'+b'x = 0. Keďže a'+b'x = 0 je len iný tvar rovnice a+bx = c+dx. majú obe rovnice rovnaké riešenie a teda algoritmom B vypočítaná hodnota pre x je aj výstupom algoritmu A pre riešenie lineárnej rovnice vo všeobecnom tvare. Úloha 5.10 Musia byť aspoň štyria, lebo z K4 vedú štyri ulice a keď nemôžeme umiestniť pozorovateľa na K4, musia byť štyria pozorovatelia na opačných koncoch týchto štyroch ulíc. Títo štyria pozorovatelia majú pod dohľadom celú cestnú sieť (obr. 5.5). Úloha 5.17 Pre 7 križovatiek a najviac 3 pozorovateľov dostaneme nasledujúce lineárne nerovnosti: x\ + x2 + x3 + X4 + x5 + xG + x7 < 3 . Pre 8 ulíc dostaneme nesledujúcich 8 nerovností: X\ + X5 > 1 , Xi + Xq > 1 , X2 + X5 > 1 , X2 + Xq > 1 , 5.7 ZHRNUTIE 171 a, b, c, d A > rieši rovnicu vo všeobecnom tvare a + bx = c + dx a'<— a — c b-d R > a',b' < i? efektívne rieši rovnice tvaru a' + b'x = 0 B x < x 1 obr. 5.11 x3 + x6 > 1 > x3 + x7 > 1 > x4 + x6 > 1 > X4 + X7 > 1 . Vzhľadom na prvú nerovnosť môžeme priradiť najvac trom neznámym hodnotu 1. Voľba = xq = xj = l & xi = X2 = X3 = X4 = 0 zaručí splnenie zvyšných 8 nerovností. Ir J 6 J Náhoda praje iba pripravenej duši, nepripravená duša nevidí pomocnú ruku, ktorú mu podáva šťastena. Louis Pasteur g Kapitola 6 Náhoda a jej úloha v prírode, alebo náhoda ako zdroj efektívnosti v 8 algoritmike 6.1 Vytýčenie cieľa V tejto kapitole chceme predstaviť jeden z najväčších divov informatiky. Tento div je založený na neuveriteľne šikovnom využití náhody pri návrhu efektívnych algoritmov pre zdanlivo prakticky neriešiteľné úlohy. Prv ako tento div priblížime, musíme sa najprv trochu zoznámiť s významom pojmu náhoda. Z tohto dôvodu najprv nahliadneme do histórie vied, v ktorých donekonečna prebiehali spory o existencii skutočnej náhody. Pri tom by sme mali nadobudnúť predstavu, čo je pravá náhoda, a čo za pravú náhodu nemôžeme považovať. So získanými predstavami o význame pojmu náhoda sa vydáme rovno do informatiky, aby sme využili náhodu pri efektívnom riešení ťažko vypočí-tateľných problémov. Zažijeme pri tom zázrak. Uverili by ste, že systém, v ktorom je šikovne použitá náhoda nás môže priviesť k cieľu biliónkrát rýchlejšie ako akýkoľvek plne deterministický systém? A že toto urýchlenie sa dá dosiahnuť bez toho, aby sme museli podstúpiť väčšie riziko než 1 k 174 KAPITOLA 6 1019, že vypočítaný výsledok bude nesprávny1. Je toto riziko vážne? Ak by sme od Veľkého tresku každú sekundu spustili výpočet randomizovaného systému (t.j. medzi 1018 a 1019 krát) môžeme očakávať, že nijaký z toho obrovského počtu výpočtov nebude chybný. Inak povedané pravdepodobnosť aspoň jednej chyby spomedzi viac než 1018 experimentálnych výpočtov randomizovaného systému je menšia ako pravdepodobnosť, že všetky budú správne. Upozorňujeme, že v praxi môže byť randomizovaný algoritmus (algoritmus využívajúci náhodu) s veľmi malou pravdepodobnosťou chyby spoľahlivejší ako jeho najlepší deterministický náprotivok. Čo tým myslíme? Teoreticky sa deterministické algoritmy nesmú mýliť. Ale v praxi nie sú deterministické programy absolútne spoľahlivé pretože počas ich výpočtu sa môžu vyskytnúť chyby hardvéru, ktoré spôsobia chybné výsledky. Pravdepodobnosť výskytu hardvérovej chyby rastie úmerne s časom výpočtu programu. Preto rýchly randomizovaný algoritmus môže byť spoľahlivejší ako pomalý deterministický program. Napríklad randomizovaný algoritmus, ktorý vypočíta výsledok za 10 sekúnd s pravdepodobnosťou chyby 1/1030 je spoľahlivejší ako deterministický program, ktorý vypočíta výsledok za týždeň. Takže posun od bežných (deterministických) algoritmov a systémov k randomizo-vaným nemusí znamenať zníženie spoľahlivosti. Strata zdanlivej absolútnej spoľahlivosti nie je až tak bolestivá. Randomizácia, myslíme tým vytváranie systémov šikovným kombinovaním deterministických stratégií a náhodných rozhodnutí sa stáva novou paradigmou informatiky. Efektívne randomizo-vané algoritmy, ktoré robia chybu v priemere v jednom z miliárd použití sú praktické a umožňujú riešenie problémov, ktoré považujeme za neriešiteľné deterministickými algoritmami. Na konci kapitoly by ste nemali len dôvernejšie poznať konkrétny náhodný systém a jeho výhody, ale budete mať možnosť sa aj hlbšie zoznámiť s myšlienkami, na ktorých je založená randomizácia (použitie náhody v algo-ritmoch) a získať pritom čiastočne aj intuíciu, prečo vôbec existujú takéto neuveriteľné a zázračné spôsoby riešenia problémov. Na záver sa vás trochu pokúsim povzbudiť, aby ste tieto vedomosti využili v každodennom živote a s ich pomocou sami vytvárali ďalšie „zázraky". 1 Riziko vypočítania chybného výsledku nazývame pravdepodobnosť chyby. 6.2 EXISTUJE OZAJSTNÁ NÁHODA? 175 6.2 Co je náhoda a existuje vôbec ozajstná náhoda? V prvej kapitole sme pochopili, že pre vytváranie a rozvoj vedeckých disciplín je základom tvorba pojmov. Pojem náhoda je jedným z mála fundamentálnych a zároveň jedným z najviac diskutovaných vedeckých pojmov. Filozofi, fyzici, biológovia a chemici už tisícročia diskutujú, či existuje náhoda a skúmajú jej úlohu vo svete. Matematici vyvinuli teóriu pravdepodobnosti ako nástroj na skúmanie náhodných javov a aplikujú ju v štatistike. Informatika skúma, či, prečo a kedy je pre nás výhodné využiť náhodu. Inžinierske disciplíny aplikujú získané poznatky pri vývoji efektívnych a spoľahlivých systémov využívajúcich náhodu. Pojem náhody je úzko spätý s ďalšími dvomi základnými pojmami: determinizmom (určenosťou) a indeterminizmom2 (neurčenosťou). Deterministická predstava sveta je založená na princípe kauzality. Každá udalosť má svoju príčinu. Príčina má následok a ten je zase príčinou pre ďalší následok, atď. Podľa takéhoto chápania, ak poznáme všetky zákonitosti a momentálny stav vesmíru, vieme presne predpovedať, čo sa stane v budúcnosti. Na celé dejiny sa môžeme pozerať ako na reťaz príčin a ich následkov. Nedetermino-vanosť znamená, že príčina môže mať viacero rôznych následkov a neexistuje prírodný zákon, ktorý by určoval, ktorý z nich nastane. Pojem náhody je úzko spätý s indeterminizmom. Podľa definície v slovníku jav označujeme ako náhodný objekt považujeme za náhodný, keď x ^ vznikol alebo bol vytvorený bez akéhokoľvek plánu a vzoru. Prirodzene je existencia náhodných udalostí (teda výskytu náhody) v protiklade s deteministicko-príčinnou predstavou o fungovaní nášho sveta. Z tohto dôvodu je základná otázka vedy, keď Podobne sa vyskytuje nepredvídateľn 2informatici používajú termín nedetrminizmus 176 KAPITOLA 6 či náhoda existuje objektívne, alebo len používame tento pojem, aby sme vysvetlili a modelovali javy, ktorých zákonitosti nepoznáme. O odpovedi na túto otázku vedci vedú spory už od antiky. Demokritos sa nazdával a tvrdil, že náhodné je nepoznané a že príroda je vo svojej podstate deterministická. Tým myslel, že svet sa riadi pevným poriadkom, ktorý určujú jednoznačné zákony. Podľa Demokrita pojem náhoda používame iba subjektívne, aby sme zastreli naše nepochopenie vecí a javov. Takto by bol pojem náhodnosti iba dôsledkom neúplnosti našich vedomostí. Svoj postoj Demokritos rád ilustroval nasledujúcim príkladom. Dvaja páni pošlú svojich otrokov zámerne v tom istom čase ku studni po vodu. Otroci sa pri studni stretnú a povedia si „to je ale náhoda, že sme sa tu stretli." Ale v skutočnosti bolo ich stretnutie určené rozhodnutím ich pánov, ale keďže o tom nevedeli javilo sa otrokom ako náhodná udalosť. Epikuros oponoval Demokritovi nasledujúcim tvrdením „Náhoda je objektívna, je prirodzenou vlastnosťou javov. Epikuros tým myslel, že objektívna náhoda existuje nezávisle od našej vedomosti alebo nevedomosti. Podľa Epikura existujú procesy, ktorých priebeh nie je jednoznačný, ale viacznačný a nepredvídateľný a voľbu spomedzi existujúcich možností nazývame náhoda. Niekto by mohol povedať: „Je zrejmé, že pravdu má Epikuros, veď v hazardných hrách ako kocky alebo ruleta môžu byť rôzne výsledky a len náhoda určí, čo bude výsledok." No vec nie je taká jednoduchá a úvahy o kockách a rulete podporujú skôr mienku Demokrita. Hra v kocky je veľmi komplexný jav, ale keby sme vedeli, akou rýchlosťou, ktorým smerom a na aký povrch ich hodíme, dal by sa dopredu určiť výsledok - ktoré číslo padne na kocke. Prirodzene je pohyb ľudskej ruky v spojení s mozgom príliš zložitý na to, aby sme vedeli určiť všetky parametre potrebné na vypočítanie výsledku. Tento proces ale nemôžeme chápať ako objektívne náhodný, len na základe toho, že je priveľmi zložitý. Podobne je to aj s hádzaním guličky v rulete a iných hrách založených na náhode. Aj vo fyzike sa na mnohých miestach používa na opis a skúmanie fyzikálnych procesov pravdepodobnostný model, hoci nejde o jednoznačne náhodné procesy (a niekedy sú dokonca očividne deterministické). Tieto sú iba priveľmi zložité na to, aby sme ich modelovali plne deterministickým spôsobom. Je zaujímavé, že z tohto istého dôvodu pripúšťal aj Albert Einstein použitie pojmu náhoda len pri modelovaní niečoho ešte nie 6.2 EXISTUJE OZAJSTNÁ NÁHODA? 177 úplne poznaného a veril3, že existujú jednoduchšie a jasnejšie formulovatelné deterministické prírodné zákony. Do 20. storočia sa akceptovalo prevažne Demokritovo kauzálno-deterministické poňatie. Dôvody boli na jednej strane v náboženstve, kde sa v Bohom stvorenom svete nepripúšťala existencia náhody4 a na druhej strane vo veľkom pokroku prírodných vied a techniky dosiahnutom v 19. storočí, čo spôsobilo prílišný optimizmus, že sa všetko dá objaviť a všetko objaviteľné sa dá formulovať priamočiaro sledom príčin a dôsledkov. Netreba podceniť ani úlohe emócií v vzťahu k náhode5. Možnosť existencie náhody sa vtedy pociťovala veľmi negatívne, lebo náhoda sa považovala za synonymum neželateľnej neistoty, chaosu a nepredvídateľnosti. Negatívny postoj k existencii náhody asi najlepšie sformuloval v svojich meditáciách Markus Aurelius: „Sú len dve možnosti: buď vo svete vládne obrovský chaos, alebo poriadok a zákon." Je zrejmé, že aj vedci, ktorí si osvojili názor, že náhoda je emocionálne neželateľná, sa snažili vo výskume vystačiť bez akéhokoľvek uvažovania o potenciálnej existencii náhody. Prípadne išli ešte o krok ďalej a snažili sa výsledkami svojej práce do popredia stavať deterministickú príčinnosť a úplne vylúčiť existenciu náhody. Až rozvojom vedy v 20. storočí sme rozpoznali, že bližšie k realite môže byť Epikurovo chápanie náhody. Matematické modely evolúcie ukazujú, že by sa neuskutočnila bez náhodných mutácií (náhodných zmien v DNA sekven-ciách). K uznaniu existencie náhody prispeli podstatnou mierou úspechy fyziky, predovšetkým kvantovej mechaniky. Tento matematický model správania sa častíc mikrosveta je založený na viacznačnosti, ktorú opisujeme náhodnými udalosťami. Experimentálne sa potvrdili všetky dôležité predpovede založené na tejto teórii, preto určité udalosti v mikrosvete interpretujeme ako naozajstné náhody.6 Uznanie existencie náhodných javov je ale dôležité aj preto lebo ich modelovaním sa prepája náhoda s neurčitosťou a 3„Boh nehádže kockami" je jeden z najznámejších výrokov Alberta Einsteina. A rovnako známa je odpoveď Nielsa Bohra „Boh si nenechá hovoriť do toho čo má robiť." 4Dnes už vieme, že takáto interpretácia nie je správna a ozajstná náhoda nie je v protiklade s existenciou Boha. 5 O postavení emócií vo výskume hovoria takzvané exaktné vedy nerady, ale je to len popieranie skutočnosti, že aj vo vede môžu byť emócie na jednej strane hnacím motorom rozvoja a pokroku a na druhej strane môžu výskum brzdiť alebo poznanie aj na celé roky „zakonzervovať". 6 Túto tému podrobnejšie preberieme v kapitole o kvantových počítačoch. 178 KAPITOLA 6 chaosom. Najvýstižnejšie to sformuloval maďarský matematik Alfréd Rényi: „Neexistuje protirečenie medzi príčinnosťou a náhodou. Vo svete vládne náhoda a práve preto vládnu vo svete poriadok a zákonitosti prejavujúce sa prostredníctvom množstva náhodných udalostí, ktoré sa správajú podľa zákonov teórie pravdepodobnosti." My informatici máme aj iný dôvod zaoberať sa náhodou, ako je modelovanie prírodných procesov a empirický štatistický výskum. Najlepšie to vyjadril prekvapujúco už pred 200 rokmi veľký básnik Johann Wolfgang von Goethe: „Tento svet je vytvorený spleťou nevyhnutnosti a náhody; Ľudský rozum sa stavia medzi ne a vie ich obe ovládať. Nevyhnutné považuje sa základ bytia; náhodné vie usmerniť, viesť a využiť." V tomto zmysle je Johann Wolfgang von Goethe „prvým informatikom", ktorý vidí v náhode (randomizácii) užitočný nástroj na realizáciu niektorých činností. Táto kapitola sa venuje použitiu náhody ako zdroju nevídanej výpočtovej efektívnosti. Našim cieľom bude ukázať, že namiesto plne deterministických systémov a algoritmov sa často oplatí navrhnúť a implementovat (randomizovaný) systém riadený náhodou. Nie je to nič iné ako akceptovanie prírody ako učiteľa. Ukazuje sa, že príroda na dosiahnutie cieľa vždy používa najefektívnejší a najjednoduchší spôsob a využitie náhody je podstatnou črtou jej stratégie. Informatická prax tento prístup potvrdzuje. V mnohých dnešných aplikáciách pracujú jednoduché randomizované algoritmy s vysokou mierou spoľahlivosti, pričom nepoznáme nijaké deterministické algoritmy, ktoré by robili to isté porovnateľne efektívne. Dokonca máme príklady ran-domizovaných algoritmov, pre ktoré je návrh a použitie ich dterministických náprotivkov je fyzikálne neuskutočniteľné. Z týchto dôvodov v súčasnosti nespájame praktickú riešiteľnosť s efektívnosťou deterministických algoritmov, ale s efektívnosťou randomizovaných algoritmov. Aby sme presvedčili aj informatický nepodkutého čitateľa o neuveriteľnej sile randomizácie na jednoduchom a názornom príklade, ukážeme v nasledujúcej časti randomizovaný komunikačný protokol, ktorým vyriešime zadanú úlohu s podstatne menšou komunikáciou, než je nevyhnutne potrebná pri najlepšom možnom deterministickom komunikačnom protokole. Dôležitá poznámka na záver: Nedali sme odpoveď na otázku, či existuje skutočná náhoda a je veľmi nepravdepodobné, že by veda na túto otázku v najbližšom čase našla definitívnu odpoveď. Je to jednoducho preto, lebo je to viac fundamentálna otázka na rovine vedeckých axiómov, než na rovine výsledkov výskumu. A ako sme sa dozvedeli už v prvej kapitole, na tejto základnej axiomatickej úrovni nemajú ani exaktné vedy matematika alebo 6.3 MNOHO SVEDKOV POMÔŽE 179 fyzika všeobecne platné tvrdenia, ale len ako axiómy vyslovené domnienky zodpovedajúce všetkým doterajším skúsenostiam (ako sme už spomínali v kapitole 1). Ako informatici si dovoľujeme veriť v existenciu náhody, nielen preto, lebo tento názor podporujú doterajšie skúsenosti fyziky a evolučnej teórie, ale predovšetkým preto, lebo náhoda je zdrojom efektívnosti. Náhoda nám umožňuje určité ciele dosiahnuť miliardukrát rýchlejšie a informatik by bol veľmi prekvapený, keby príroda nechala nepovšimnutú takúto možnosť urýchlenia procesov. 6.3 Mnoho svedkov je pomoc v núdzi alebo prečo môže byť náhoda užitočná? Na príklade jednoduchej úlohy si ukážeme, ako sa táto dá veľmi efektívne vyriešiť využitím náhody, hoci vieme, že deterministicky (bez náhody) sa efektívne vyriešiť nedá. Bude to príklad, ktorým si ozaj každý môže samostatne vyskúšať silu použitia náhody. Čo presne znamená, keď vravíme o systéme alebo algoritme (programe), že využíva náhodu (je randomizovaný)? V zásade sú možné dve predstavy. Každý deterministický program vykoná pre ľubovoľné vstupné údaje tú istú postupnosť výpočtových krokov, hovoríme, že výpočet je jednoznačný. Randomizovaný program (systém) môže mať pre jeden vstup viacero rozličných výpočtov. Je vecou náhody, ktorý z nich sa ozaj uskutoční. Uvedieme dva spôsoby voľby z viacerých možných výpočtov. 1. Program pracuje deterministickys výnimkou niekoľkých miest, kde si môže hodiť mincou. V závislosti od toho, čo padne (rub alebo líc), sa na tomto mieste rozhodne, ktorým z dvoch možných pokračovaní bude výpočet prebiehať. Náš programovací jazyk týmto spôsobom môžeme názorne rozšíriť pridaním nasledujúcej inštrukcie. Hoď mincou. V prípade, že padne „líc" pokračuj v riadku i, inak pokračuj v riadku j Takže keď padne „líc (hlava)" program pokračuje vykonávaním príkazov v riadku i, keď padne „rub (znak)" pokračuje v riadku j. 2. Program využívajúci náhodu má na začiatku možnosť voľby z viacerých 180 KAPITOLA 6 deterministických stratégií. Program si náhodne vyberie jednu z nich a použije ju pre aktuálne vstupné údaje. Zvyšok výpočtu je úplne deterministický. Pri ďalšom vstupe sa náhodne vyberie nová stratégia. Druhá možnosť modelovania systémov využívajúcich náhodu je jednoduchšia, preto ju použijeme aj v našom vzorovom príklade. Uvažujme nasledujúce zadanie úlohy. Majme dva počítače Rj a Ru spojené sieťou, ktoré sú na dvoch od seba vzdialených miestach. Oba počítače majú uchovávať rovnakú databázu. Pôvodne pracovali oba počítače s rovnakými databázami. Behom času ich obsah dynamicky meníme takým spôsobom, že súčasne vykonávame zmeny v oboch databázach a usilujeme sa, aby na oboch miestach boli rovnaké všetky informácie o skúmaných objektoch (napr. o DNA sekvenciách). Prirodzene čas od času chceme aj preveriť, či sú databázy v Ri a v Ru naozaj rovnaké. Toto preskúšanie si teraz zidealizujeme v zmysle matematickej abstrakcie. Obsahy databáz budeme považovať za postupnosti bitov. Takže v pamäti počítača Ri je postupnosť x dĺžky n bitov v pamäti počítača Ru je tiež postupnosť n bitov, označme ich ako U = ž/12/22/3 • --Vn-lVn- Úlohou je s využitím komunikácie cez sieť preveriť, či x = y (obr. 6.1). Ri komunikačný kanál Ru pamäť XiX2X3 . . . XnA^ pamäť ymy-s ■■■Vn obr. 6.1 Aby sme vyriešili túto komunikačnú úlohu, mali by sme navrhnúť stratégiu komunikácie (komunikačný protokol). Zložitosť komunikácie a tým aj zložitosť riešenia meriame počtom bitov, ktoré si cez komunikačný kanál vymenia Rj a Ru. Žiaľ, dá sa dokázať, že ľubovoľný komunikačný protokol na riešenie tejto úlohy sa nevyhne výmene n bitov. Takže naivné riešenie, pri ktorom Rj pošle celý obsah svojej pamäti x\x2 ■ ■ ■ xn počítaču Ru a Ru ho bit po bite porovná s obsahom svojej pamäti je vlastne najlepšou možnou stratégiou. 6.3 MNOHO SVEDKOV POMÔŽE 181 Keď je n veľmi veľké, napr. n = 1016 (čo zodpovedá asi 250000 DVD) sú komunikačné náklady príliš vysoké. A to neberieme do úvahy, že spoľahlivé prenesenie takéhoto množstva údajov je nerealistické uskutočniť bez straty alebo zmeny jediného bitu. Našim cieľom je navrhnúť komunikačný protokol využívajúci náhodu, ktorým sa táto úloha bude dať realizovať 4 • riog2(n)l komunikačnými bitmi7. Vidíme, že ušetríme exponenciálne na zložitosti. Pre n = 1016 pošleme napríklad len 256 namiesto 1016 bitov! Kvôli názornosti budeme namiesto porovnávania dvoch postupností bitov porovnávať dve prirodzené čísla. Preto budeme interpretovať postupnosti x = xi... xn a y = yi... yn ako binárne zápisy čísiel n Čís\o(x) = ^2n~i-xi t n Číslo(y) = £ 2"-*-^. V prípade, že vám tieto vzorce nič nevravia, nemusíte sa nimi zapodievať. Dôležité je len vedieť, že Číslo(rr) je prirodzené číslo, ktorého binárnym zápisom je x a že 0 < Číslo(rr) < 2n- 1. Analogicky platí, že 0 < Číslo(y) < 2n - 1. Prirodzene, že pre n = 1016 môžu byť tieto čísla obrovské. Už pre n = 106 = 1000000 sú približne 2íoooooo a majú asi 300000 desiatkových cifier. Je zrejmé, že x je identické s y práve vtedy, keď Číslo(rr) = Číslo(y). Takže sa môžeme sústrediť na porovnávanie čísiel Číslo (x) a Číslo (y) v našom ran-domizovanom protokole. 7Pre reálne číslo r, označujeme [r] jeho hornú celú časť, čo je zaokrúhlenie reálneho čísla r na najbližšie väčšie celé číslo. Napríklad pre r = 3,14, [3,14] = 4. 182 KAPITOLA 6 Úloha 6.1 Pre tých, čo to chcú pochopiť detailnejšie: Postupnosť 10110 predstavuje číslo Číslo(lOllO) = l-24 + 0-23 + l-22 + l-21+0-2° = 1-16 + 0-8 + 1-4 + 1-2 + 0-1 = 16 + 4 + 2 = 22. Ktoré číslo je zakódované postupnosťou bitov 101001? Aká je binárna reprezentácia čísla 133? Komunikačný protokol využívajúci náhodu bude pre vstupy xx... xn a y\... y,t dĺžky n, zodpovedať náhodnému výberu jednej deterministickej stratégie (protokolu) z väčšieho počtu možností. Počet možných stratégií sa bude rovnať počtu prvočísiel menších ako n2. V ďalšom pre ľubovoľné kladné celé číslo m označujeme PRIM (m) = {p je prvočíslo | p < m} množinu všetkých prvočísiel v intervale od 1 po m a Prvoč(m) = | PRIM (m) označuje počet prvočísiel v PRIM (m). Zvyšok po celočíselnom delení a : b označujeme r = a mod b. Napríklad platí, že 2 = 14 mod 3, lebo 14 : 3 = 4 a zvyšok je r = 14—3-4 = 2. Keď chápeme delenie a : b ako celočíselné a výsledok je c a zvyšok r, potom môžeme písať a = b ■ c + r. kde r < b. V našom príklade sú a = 14 a b = 3, celočíselný podiel je c = 4 a zvyšok je r = 2. Teda môžeme písať 14 = 3 - 4 + 2, pričom r = 2 < 3 = b. Teraz môžeme nasledujúcim spôsobom opísať protokol využívajúci náhodu na porovnanie x a y (lepšie povedané na porovnanie čísiel Číslo (x) a Číslo (y)). SVEDOK - Komunikačný protokol využívajúci náhodu na dôkaz 6.3 MNOHO SVEDKOV POMÔŽE 183 zhodnosti. Východisková situácia: Počítač Rj má n bitov (to znamená číslo Číslo(ar), 0 < Číslo(ar) < 2n - 1). Počítač Rn má n bitov y = yiy2 ■ ■ ■ yn (teda číslo Číslo(y), 0 < Číslo(y) < 2n - 1). 1. fáza: R[ si náhodne zvolí prvočíslo p z PRIM (n2). Každé prvočíslo v PRIM(n2) má rovnakú pravdepodobnosť, že bude zvolené. 2. fáza: Rj vypočíta číslo s = Císlo(rr) mod p (teda zvyšok po delení čísla Číslo (x) číslom p) a pošle Ru binárnu reprezentáciu s a p. 3. fáza: Po obdržaní s a p počítač Ru vypočíta číslo q = Číslo(y) mod p* V prípade, že q ^ s, vráti Ru odpoveď „sú rozličné". V prípade, že q = s, vráti Ru odpoveď „sú rovnaké". Prv ako budeme skúmať komunikačnú zložitosť a spoľahlivosť protokolu SVEDOK, ilustrujeme si na konkrétnom príklade, ako pracuje. Príklad 6.1 Nech sú x = 01111 ay = 10110. Takže x—v Číslo(ar) = 1 • 23 + 1 • 22 + 1 • 21 + 1 • 2° = 8 + 4 + 2 + 1 = 15, Číslo(y) = 1 • 24 + 1 • 22 + 1 • 21 = 16 + 4 + 2 = 22 n = 5. Teda máme n2 = 25 a dostaneme PRIM(n2) = {2, 3, 5, 7,11,13,17,19, 23}. Preto si komunikačný protokol SVEDOK volí jedno z 9 prvočísiel, a teda aj jeden z 9 deterministických protokolov. Predpokladajme, že Rj si zvolí prvočíslo 5. Potom ďalej počíta s = 15 mod 5 = 0 184 KAPITOLA 6 a pošle čísla p = 5 a s = 0 počítaču Ru. Počítač Ru počíta q = 22 mod 5 = 2. Pretože 2 = q ^ s = 0, odpovedá Ru správne, že „x a y sú rozličné". Predpokladajme, že si Rj z PRIM(25) vyberie prvočíslo 7. Vtedy Rj spočíta s = 15 mod 7 = 1 a pošle počítaču Ru čísla p = 7 a s = 1. Počítač i?// počíta g = 22 mod 7=1. Pretože g = s = 1, i?// odpovie nesprávne „x a y sú rovnaké". Vidíme, že SVEDOK sa môže mýliť a pre niektoré voľby prvočísla odpovie nesprávne. □ Úloha 6.2 Je ešte iné prvočíslo z PRIM(25), ktoré pre x = 01111 a y = 10110 spôsobí, že SVEDOK odpovie nesprávne? Úloha 6.3 Nech sú vstupy x = y = 100110. Môže sa stať, že SVEDOK odpovie nesprávne, že „x ^ y" z dôvodu, že si zvolil nevhodné prvočíslo? Úloha 6.4 Uvažujte, že vstupom sú x = 10011011 a y = 01010101. Určite presne, koľko prvočísiel spôsobí, že SVEDOK odpovie nesprávne „x = yu, a koľko pr-vočísiel spôsobí, že SVEDOK odpovie správne „x ^ y"! Pozrime sa najprv na zložitosť komunikácie protokolu SVEDOK. Každé z čísiel Císlo(rr) a Císlo(í/), ktoré porovnávame, je reprezentované n bitmi, nachádzajú sa teda v intervale od 0 po 2n — 1. Aby sme sa vyhli posielaniu veľkých čísiel, posiela počítač Rľ v protokole SVEDOK len dve čísla menšie než n2, konkrétne prvočíslo p G PRIM(n2) a zvyšok po delení číslom p. Číslo menšie než n2 sa dá zapísať binárne pomocou |~log2 n2] < 2 • [log2 n] bitov. 6.3 MNOHO SVEDKOV POMÔŽE 185 Pretože protokol SVEDOK posiela dve čísla pasa každé sa dá zapísať presne8 2 |~log2 n] bitmi, teda celkovo sa v protokole SVEDOK pošle presne Pozrime sa čo presne to znamená pre n = 1016. Najlepší deterministický protokol sa nevyhne výmene aspoň Rozdiel vo vynaloženej námahe na poslanie 256 bitov a 1016 bitov je obrovský. Aj keby bolo bezpečné prenesenie 1016 bitov uskutočniteľné, náklady na prenos 256 bitov a 1016 bitov sú neporovnateľné. Za tento neuveriteľnú úsporu v komunikačnej zložitosti zaplatíme stratou istoty, že vždy dostaneme správnu odpoveď porovnania. Teraz si kladieme otázku: Aká velká je miera nespoľahlivosti, ktorou platíme za drastické zníženie komunikačných nákladov? Stupeň neistoty, že vypočítaný výsledok je správny, nazývame v informatike pravdepodobnosť chyby. Presnejšie, pravdepodobnosť chyby pre dva vstupné reťazce x a y je pravdepodobnosť že SVEDOK odpovie nesprávne na vstup x a y (keď je obsah pamäti Ri reťazec x a obsah pamäti Ru reťazec y). Pre rozličné vstupy (počiatočné situácie) x ay môže byť Chyba svedok (x, y) rôzna. Našou úlohou je ukázať, že pravdepodobnosť chyby je veľmi malá pre všetky možné vstupy x a y.9 „Aká je presne pravdepodobnosť chyby pre x a y a ako sa dá určiť?" - V prípade, že by bol zápis kratší než 2 |~log2 n], môžeme ho doplniť na začiatku zopár nulami tak, aby mal presne túto dĺžku. V tomto smere kladieme na (randomizované) systémy a algoritmy využívajúce náhodu veľmi vysoké požiadavky. Pre každý jeden vstup požadujeme vysokú pravdepodobnosť toho, aby bol výsledok správny. To je v protiklade s takzvanými pravdepodobnostnými postupmi, v ktorých požadujeme len to, že správny výsledok dostaneme s veľkou pravdepodobnosťou na štatisticky významnej podmnožině prípadov problému. 4 • [log2 n] bitov. 10lb bitov. Našemu randomizovanému protokolu SVEDOK stačí vždy 4 • [log2(1016)] < 4 • 16 • riog2 10] = 256 bitov. 186 KAPITOLA 6 Protokol SVEDOK si pre vstupné reťazce x a y dĺžky n náhodne zvolí prvočíslo z PRIM (n2). Táto voľba prvočísla rozhodne, či protokol dá správnu alebo nesprávnu odpoveď. Preto si rozdelíme množinu prvočísiel PRIM (n2) na dve časti. Všetky prvočísla, ktoré v protokole SVEDOK dajú pre x a y správnu odpoveď, nazveme dobré pre (x, y). V príklade 6.1 bolo prvočíslo 5 dobré pre (01111,10110). Ostatné prvočísla, ktorých voľba vedie pre (x, y) k nesprávnemu výsledku nazývame zlé pre (x, y). Ako sme videli v príklade 6.1, je prvočíslo 7 zlé pre (01111,10110). Pretože pre každé z Prvoč(n2) prvočísiel z PRIM (n2) je rovnako pravdepodobné, že bude zvolené, platí počet zlých prvočísiel pre (x, y) LhybaSVEDOK{x,y) = Prvočín2) ; teda pravdepodobnosť chyby je pomer počtu zlých prvočísiel v urne k počtu všetkých prvočísiel v urne. To je jednoduchá úvaha, ktorú si môžeme názorne ukázať na príklade. Keď máme v urne 15 guličiek, z ktorých sú práve tri biele, potom je pravdepodobnosť toho, že si vytiahneme bielu guličku presne y| = |. Inak povedané, 20% všetkých guličiek v urne je bielych, a preto môžeme očakávať, že pri opakovaných ťahoch vytiahneme bielu guličku v 20% prípadov. Analogicky, keď má SVEDOK v PRIM(72) 15 prvočísiel a dve z nich vedú pre x a y k nesprávnej odpovedi, je pravdepodobnosť chyby 2/15. Na obrázku 6.2 znázorňujeme opísanú situáciu. Našou úlohou je ukázať pre všetky páry postupností bitov x a y, že počet zlých prvočísiel pre x a y je výrazne menší než počet všetkých prvočísiel v množine PRIM (n2). prvočísla dobré pre vstup (x,y) obr. 6.2 6.3 MNOHO SVEDKOV POMÔŽE 187 Aká veľká je množina PRIM(m)? Jedným z najväčších a najdôležitejších objavov matematiky10 je veta o prvočíslach, ktorá hovorí, že Tíl Prvoč(m) je približne--. In m' kde ln m je prirodzený logaritmus čísla m. Veta o prvočíslach tvrdí: prvočísla sú rozptýlené medzi prirodzenými číslami relatívne husto, pretože približne každé lnm-té číslo je prvočíslo. Pre naše výpočty si vezmeme konkrétny výsledok, ktorý platí pre všetky prirodzené čísla m > 67, Tíl Prvoč(m) > -. In m Pre naše účely sa nám bude hodiť aj, že pre všetky n > 9 platí n2 Prvoč(n ) > 2 ln n Náš nasledujúci cieľ je ukázať, že pre ľubovoľný vstup (x, y) je počet zlých prvočísiel pre (x, y) nanajvýš n - 1, teda podstatne menej, než n2/(21nn). Pri skúmaní, aká je pravdepodobnosť chyby, budeme rozlišovať dva prípady v závislosti od vzťahu medzi x a y. 1. prípad x = y, keď je správna odpoveď „rovnaké". V prípade, že x = y, platí aj, že Císlo(rr) = Císlo(í/). Bez ohľadu na to, aké prvočíslo zvolíme, platí s = Císlo(rr) mod p = Císlo(í/) mod p = q, a teda s = q. Vyjadrené v prirodzenom jazyku, keď prvočíslom p delíme dve rovnaké čísla, musia byť aj oba zvyšky po delení rovnaké. Protokol SVEDOK odpovie správne pre všetky prvočísla p z PRIM (n2). Preto platí pre všetky reťazce x, že Chyba,SVEDOK(x,x) = 0. Takže chyba sa môže vyskytnúť len v prípade rozličných vstupných reťazcov x a, y. 2. prípad x ^ y, keď je správna odpoveď „rozličné". 10presnejšie teórie čísiel v matematike 188 KAPITOLA 6 Ako sme už určili pre x = 01111 a y = 10110 v príklade 6.1, je pravdepodobnosť chyby nenulová, lebo pre p = 7 protokol odpovie nesprávne „rovnaké". Všeobecný horný odhad n—l počtu zlých prvočísiel pre (x, y) takých, že \x\ = \y\ = n, nájdeme tak, že budeme skúmať vlastnosti týchto zlých prvočísiel. Prvočíslo p je pre (x, y) zlé, keď sú rovnaké zvyšky po delení Císlo(rr) a Číslo (y) prvočíslom p, to znamená keď platí s = Císlo(rr) mod p = Číslo(y) mod p. Rovnosť s = Číslo (x) mod p Císlo(rr) = hx • p + s, kde hx je výsledok delenia čísla Číslo (x) prvočíslom p a s < p je zvyšok po Císlo(í/) = hy-p + s, delení. Analogicky môžeme písať kde sa p nachádza hy krát v Číslo (y) a s je zvyšok.11 Predpokladajme, že platí Číslo (x) > Číslo (y). (V prípade, že platí Číslo (y) > Číslo (x), môžeme pri analyzovaní situácie postupovať analogicky). Vypočítajme Rozd(x,y) = Číslo (x) — Číslo (y) číslo(rr) hx ■ p + s —Číslo(y) —hy • p — s Rozd(x,y) hx ■ p — hy ■ p teda pre rozdiel Rozd(x, y) platí: Rozd(x, y) = Číslo(rr) — Číslo(y) = hx ■ p — hy ■ p = {hx — hy) • p. Dôsledkom je, že p delí číslo Rozd(x, y) = Císlo(rr) — Číslo(y). Inými slovami Prvočíslo je zlé pre (x, y) práve vtedy, keď p delí číslo Rozd(x, y) = Číslo (x) — Číslo(y). "Napríklad pre x = 10110 je Císlo(x) = 22 a pre p = 5 je Císlo(x) = 22 = 4 • 5 + 2, kde hx = 4 a s = 2 je zvyšok. 6.3 MNOHO SVEDKOV POMÔŽE 189 Čo nám to pomôže? Našli sme rýchly spôsob ako určiť, či je prvočíslo zlé. Príklad 6.2 Nech má počítač Rj reťazec bitov x = 1001001 a Ru má y = 0101011, oba dĺžky n = 7. Úlohou je nájsť množinu zlých prvočísiel. Najprv určíme množinu prvočísiel PRIM(n2) = PRIM(49) = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}, z ktorej sa v protokole SVEDOK náhodne vyberá prvočíslo. Podľa nášho zistenia sú pre (1001001,0101011) zlé práve tie prvočísla, ktoré delia rozdiel Rozd(1001001, 0101011) = Číslo(1001001) - Číslo(OlOlOll) = 73 - 43 = 30. Okamžite vidíme, že 2, 3 a 5 sú jediné prvočísla z PRIM(49), ktoré delia 30, preto sú 2, 3 a 5 jediné zlé prvočísla pre (1001001,0101011). Takže dostávame, že Chyba5yEDOX(1001001, 0101011) Prim(49) 15 5' \& Úloha 6.5 Nájdite všetky zlé prvočísla pre nasledujúce dvojice reťazcov bitov. (i) (01010,11101) (ii) (110110,010101) (iii) (11010010,01101001). Ostáva nám odpovedať ešte na otázku: „Ako nám pomôže poznanie, že zlé prvočísla delia Rozd(rc, y) určiť ich počet?" Pretože obe čísla Číslo(rr) aj Číslo (y) sú menšie ako 2n platí aj, že Rozd(x,y) = Číslo(x) - Číslo(y) < 2n. Chceme ukázať, že číslo menšie ako 2n môže mať najviac n—l prvočiniteľov (prvočísiel, ktoré ho delia). Aby sme to ukázali, využijeme inú známu vetu z hodín školskej matematiky - základnú vetu aritmetiky. Táto hovorí, že každé prirodzené číslo sa dá jednoznačne vyjádřit ako súčin prvočísiel. 190 KAPITOLA 6 Platí napríklad 5940 = 2 • 2 • 3 • 3 • 3 • 5 • 11 = 22 • 33 • 5 • 11 . a teda 5940 má 4 prvočinitele 2, 3, 5 a 11. Nech sú Pi,P2,P3, ■ ■ ■ iPk všetky prvočinitele nášho čísla Rozd(rc,y) a nech Pi < P2 < P3 < ■ ■ ■ < Pk- Platí, že pi > 2 (najmenšie prvočíslo). Vo všeobecnosti vidíme, že pre všetky i platí Pi > i. Takže dostávame Rozd(x,y) = pl1 ■ p22 -pli ■ p\k pre i j > 1 pre všetky j od 1 po A; a môžeme písať Rozd(x,í/) > pi ■ p2 ■ P3 ■ ■ ■ ■ ■ Pk > 1 • 2 - 3 - /c = k\ Keďže Rozd(x,y) < 2n a zároveň Rozd(x,y) > k\ (ako sme práve ukázali), dostaneme T > k\ . Pretože pre n > 4 platí, že n\ > 2n, musí byť k menšie ako n, čím sme dosiahli vytýčený cieľ, že ; k < n — 1. To znamená, že počet prvočiniteľov Rozd(rc, y) je najviac n — 1, a tak je počet zlých prvočísiel pre (x, y) najviac n — 1. Konečne môžeme zhora ohraničiť pravdepodobnosť chyby protokolu SVEDOK pre (x,y),x ý V- Pre všetky dvojice reťazcov bitov (x,y) dĺžky n > 9 platí n. , /rvľS' počet zlých prvočísiel pre (x, y) ChybaSVEDOK(x,y) = - Prvoč(n2) — n2/ln n2 2 ln n < n Takže pravdepodobnosť chyby protokolu SVEDOK pre rôzne obsahy databáz x a y je najviac 2\nn/n, čo v našom prípade, keď n = 1016 je najviac 0.73683 1014 ' 6.3 MNOHO SVEDKOV POMÔŽE 191 V príklade 6.2 sme videli, že pravdepodobnosť chyby bola relatívne vysoká (1/5). Je to preto, lebo pravdepodobnosť chyby sa zmenšuje, čím je vstup väčší. Preto sa v prípade malých vstupných údajov s veľkosťou niekoľko tisíc bitov odporúča porovnávanie vykonať deterministicky, pretože náklady sú v takomto prípade tak, či tak zanedbateľné. Randomizovaný protokol sa oplatí použiť až v prípade dlhších vstupov. Úloha 6.6 Aká je pravdepodobnosť chyby pre vstupné údaje dĺžky n = 103 a n 104? Od akej dĺžky by ste dôverovali randomizovanému protokolu SVEDOK? Úloha 6.7 Určite presne pravdepodobnosť chyby protokolu SVEDOK pre nasledujúce dvojice (x,y). (i) (00011011,10101101) (h) (011000111,000111111) (iii) (0011101101,0011110101). Práve sme zažili zázrak. Randomizovaný postup si vie efektívne poradiť s úlohami, ktoré sa nedajú v praxi vyriešiť deterministicky kvôli nevyhnutným vysokým nákladom. Poznáme viaceré problémy, ktoré sa prakticky nedajú vyriešiť s deterministickými algoritmami, pretože aj najefektívnejšie z nich majú exponenciálnu zložitosť. Mnohé z nich riešime v praxi denne a často to vieme úspešne vykonať len vďaka využitiu náhody. Celá e-komercia, a teda aj online banking a online nakupovanie by nebola možná bez softvéru, v ktorom sú implementované algoritmy využívajúce náhodu. Pre tých, čo hľadajú absolútnu istotu, je to vlastne zlá správa. Ale pre tých, ktorý sú si vedomí rizika, vedia s ním počítať a udržať ho malé, sú programy využívajúce náhodu geniálnym riešením. Teraz je načase, zbaviť zázrak kúzla. Radi by sme sa dopátrali, prečo využitie náhody vyčaruje takýto ohromný efekt, a toto porozumenie by sme mali chápať ako normálne správanie sa vecí okolo nás. Začnime naše úvahy spochybnením tho, čo sme doteraz predstavili. Videli sme, že protokol SVEDOK využívajúci náhodu pracuje skutočne efektívne a veľmi spoľahlivo. Sú naozaj pravdivé naše nedokázané tvrdenia, že najlepší deterministický protokol pre našu komunikačnú úlohu vyžaduje pre niektoré vstupy výmenu n bitov? A že pre väčšinu vstupov (x, y) je potrebných skoro n komunikačných bitov? Prečo by práve na tomto mieste nemohol čitateľ zapochybovať? Pretože tvrdenia ozaj vyzerajú podozrivo. Poďme hlbšie do podstaty veci a pozrime sa ešte raz na obrázok 6.2. Dobré prvočísla pre (x, y) nazývame svedkovia rozličnosti x od y. Hovoríme, že 192 KAPITOLA 6 prvočíslo p dosvedčuje skutočnosť x y, keď platí Číslo (x) mod p ý číslo (y) mod p. Prvočíslo q nie je svedok rozličnosti x a y, keď Číslo (x) mod p = Číslo (y) mod p. Teda dobré prvočísla pre (x, y) sú svedkovia pre (x, y) a zlé prvočísla pre (x, y) nie sú svedkovia pre (x, y) . Po tomto premenovaní vidíme, že práca protokolu SVEDOK je založená na hľadaní svedkov toho, že „x ^ yu. Keď náhodne vyberieme svedka toho, že „x ý ž/"> pokračujeme deterministicky ďalej a spoľahlivo dostaneme správny výsledok. Keď si vyberieme nie svedka, nevyhnutne prídeme k zlému výsledku. Celý protokol pracuje správne s vysokou pravdepodobnosťou preto, lebo v množine PRIM (n2) sú skoro samí svedkovia. Veľkosť skupiny nie svedkov je oproti Prvoč(n2) tak malá, že pravdepodobnosť náhodného výberu nie svedka je tiež veľmi malá. A teraz príde dôvod na pochybnosti. Keď množina kandidátov na svedkov obsahuje len skoro samých svedkov, prečo si z nich nevieme deterministicky jedného vybrat a po krátkej komunikácii úlohu správne vyriešiť? Deterministicky si vybrať svedka znamená odstrániť úplne využitie náhody a takto by sme mohli potenciálne vytvoriť na riešenie úlohy efektívny deterministický protokol. Ako rozpoznáme, že tento na prvý pohľad prijateľný nápad sa nedá uskutočniť? Prirodzene môžeme poskytnúť matematický dôkaz neexistencie efektívneho deterministického protokolu na riešenie tejto úlohy. To vedie k dvom problémom. Tento dôkaz nie je ťažký pre skúseného informatika a matematika, ale vyžaduje vedomosti, ktoré nemôžeme očakávať u všeobecného publika. A po druhé ani pochopenie dôkazu nepomôže porozumieť, prečo predkladaná idea derandomizácie nefunguje. Z jeho argumentácie vyplýva, že sa to nedá, ale skutočné dôvody zostanú nevyjasnené a tajomné. Preto sa pokúsime len o intuitívne priblíženia sa k podstate problému a pritom si prehĺbiť naše chápanie využitia náhody. Neexistuje efektívny12 deterministický algoritmus, ktorý by určil svedka, lebo z pohľadu oboch počítačov Rj aj Rn sú svedkovia „náhodne" rozptýlení medzi všetkými kandidátmi. vzhľadom na komunikačnú zložitosť 6.3 MNOHO SVEDKOV POMÔŽE 193 o o CN Čo to znamená presnejšie? Keď poznáte x, ale o y viete len veľmi málo, nemusíte vystačiť pri hľadaní svedka pre (x, y) ani s viacerými pokusmi. Je to preto, lebo pre rôzne vstupy dĺžky n sú svedkovia v množine kandidátov PRIM(n2) rozdelení úplne inak. Neexistuje žiadne pravidlo, podľa ktorého by sme s obmedzenými vedomosťami o vstupe vedeli vypočítať svedka. Preto vyzerá z pohľadu počítačov Rj a Ru obsah nádoby s kandidátmi ako pravý chaos (chaotická zmes svedkov a nesvedkov). Práve v tom väzí jadro úspechu využitia náhody. obr. 6.3: Chaotická zmes svedkov a nesvedkov. Vedeli by sme efektívne vyriešiť viaceré problémov, keby sme mali svedkov správnej odpovede. V praxi ale žiadnych svedkov nedostaneme. Keď ale vieme vytvoriť množinu kandidátov na svedkov a vieme, že v nej je veľa svedkov, hoci aj chaoticky sa vyskytujúcich, stojí za to vyloviť niekoho náhodne. Keď je rozdelenie svedkov medzi kandidátmi ozaj náhodné a javí sa preto ako chaotické, nemá nijaký deterministický postup šancu nájsť svedka efektívne. Pri hľadaní efektívnych algoritmov využívajúcich náhodu využívame často nasledujúci postup. Hľadáme takých svedkov, ktorí majú tieto tri vlastnosti: (i) Keď máme pre vstup svedka, vieme efektívne deterministicky vypočítať správny výsledok. (ii) Keď máme pre vstup kandidáta na svedka, vieme efektívne preveriť, či je svedok alebo nie. (iii) Svedkovia sa hojne vyskytujú v množine kandidátov. Na základe vlastnosti (iii) nazývame túto metódu návrhu algoritmov využívajúcich náhodu metóda hojnosti svedkov. Veľký počet svedkov je dobrá vec. Ako podľa potreby zvýšiť ich výskyt, je téma nasledujúceho odseku. 194 KAPITOLA 6 6.4 Čo môžeme urobiť, keď zákazník požaduje vysokú mieru istoty? Celá história ľudstva je spätá s hľadaním istoty. Čo sme? Čo tu hľadáme? Čo máme urobiť, aby sme si zabezpečili „peknú" budúcnosť, alebo aspoň nejakú budúcnosť? Život a veda nás poučili, že hľadanie absolútnej istoty je nezmyselné, ba môže sa stať osudným. Usilovať sa o neexistujúcu absolútnu istotu znamená aj mnohého sa nezmyselne zriecť a často skončiť v slepej uličke. Typické následky sú rezignácia, frustrácia a depresie. Keď ale akceptujeme neistotu a spolu s ňou aj náhodu ako neoddeliteľnú súčasť života a naučíme sa s ňou žiť, objavíme namiesto frustrácie možnosti, ktoré sa nám otvoria po vzdaní sa neexistujúcich istôt. Slepé uličky viac nebudú slepými uličkami a budúcnosť bude mať nepreberné množstvo podôb. Presne tak to bolo aj v našom príklade z predchádzajúcej časti a ešte častejšie je aj v algoritmike. Situácia vyzerajúca na pohľad beznádejne, pretože každý protokol riešiaci našu úlohu má príliš vysoké komunikačné nároky. Výmena nedosiahnuteľnej ideálnej absolútnej istoty za praktickú istotu poskytuje dobré možnosti na riešenie. V iných podobných situáciách sa nám nemusí vždy bezpodmienečne podariť nájsť početných svedkov, ako v našom komunikačnom protokole. Niekedy tvoria naozajstní svedkovia len zlomok počtu všetkých kandidátov na svedkov. V takých prípadoch sa sa môže zvýšiť aj pravdepodobnosť chyby, a to až natoľko, že je to v praxi neakceptovateľné. Cieľom nasledujúceho odseku je ukázať ako úspešne zvládnuť takéto situácie. Začnime s príkladom nášho komunikačného protokolu. Pre n = 1016 bola pravdepodobnosť chyby najviac 0.74 • 10~14. Predstavme si, že máme zákazníka, pre ktorého je správnosť výsledku protokolu enormne dôležitá a želá si ešte vyššiu mieru istoty. Napríklad povie: „Chcem aby bola pravdepodobnosť chyby taká malá, že keď protokol použijem toľkokrát, koľko je vek vesmíru v sekundách vynásobený počtom protónov vo vesmíre, tak s pravdepodobnosťou 1 : 1000000 nedostanem nesprávny výsledok ani v jednom z tohto ohromného počtu pokusov." Vieme splniť takéto prepiate požiadavky bez extrémneho zväčšenia zložitosti? Odpoveď je „ÁNO" a prv ako si ukážeme ako na to, urobíme si malú jednoduchú úvahu z teórie pravdepodobnosti. Predstavme si, že máme korektnú hraciu kocku. Hádzanie kockou chápeme ako náhodný experiment, v ktorom je možných presne 6 výsledkov 1, 2, 3, 6.4 ZVÝŠENIE MIERY ISTOTY 195 4, 5 a 6 a je rovnako pravdepodobné, že nastane ľubovoľný z nich, teda pravdepodobnosť každého je presne 1/6. Predpokladajme ďalej, že jediný nepriaznivý výsledok je pre nás, keď padne „1". Všetky ostatné výsledky sú priaznivé. Preto je pravdepodobnosť nepriaznivého výsledku 1/6. Zmeňme teraz pravidlá. Hodíme kocku päťkrát za sebou a jediný nepriaznivý výsledok je, keď padnú samé „1". Inak povedané, sme spokojní, keď z piatich vrhov aspoň raz padne na kocke niečo iné než „1". Aká veľká je pravdepodobnosť, že nastane nepriaznivý výsledok? Máme teda určiť, aká veľká je pravdepodobnosť, že päťkrát za sebou padne „1". Pretože tieto pokusy považujeme za navzájom nezávislé13, počítame to takto. Jednu „1" hodíme s pravdepodobnosťou 1/6. Dve „1" za sebou hodíme s pravdepodobnosťou CN 1 1 1 6 ' 6 ~ 36' Pravdepodobnosť toho, že päťkrát za sebou hodíme „1" je 1 1 1 1 1 _ 1 1 6'6'6'6'6~6Š~ 7776' o « rvy Čo majú spoločné tieto úvahy s naším protokolom? Veľa. Na protokol využívajúci náhodu môžeme nazerať ako na náhodný experiment, v ktorom nepriaznivý výsledok zodpovedá náhodnému výberu nesvedka pre daný vstup. Výskumom protokolu sme zistili, že pravdepodobnosť neprioaznivého výsledku, a teda aj chyby je najviac 2 ln n n Postupujme analogicky ako pri kockách! Keď vyberieme náhodne po sebe 10 prvočísiel, je jediný nepriaznivý výsledok, keď sa pri všetkých desiatich prvočíslach nenájde svedok rôznosti medzi x a y. Desaťkrát za sebou vybrať prvočíslo vedie k nasledujúcemu protokolu využívajúcom náhodu. SVEDOK (10) Východisková situácia: Počítač Rj má n bitov x = x\... xn a počítač Ru má n bitov y = y1...yn. 1. fáza: Ri si zvolí náhodne 10 prvočísiel Pl,p2...p10z PRIM (n2). 13Podrobné vysvetlenie, čo znamená nezávislé, môžeme nájsť v [Hro04b]. 196 KAPITOLA 6 2. fáza: Pre všetky i od 1 po 10 vypočíta i?/ Si = Číslo (x) mod Pi a pošle binárnu reprezentáciu čísiel Pl,P2- ■ - PlO,Sl,S2. . .S10 počítaču Ru. 3. fáza: Po obdržaní 20 čísiel pi,p2 ■ ■ -Pio, s±, s2... sw vypočíta Ru qi = Císlo(í/) mod pt pre všetky i = 1, 2 ... 10. V prípade, že aspoň pre jedno i z 1, 2,... 10 dostaneme, že qi ^ Si, vie Ru s istotou, že x ^ y a dá výsledok „sú rôzne". Keď qi = s j pre všetkých desať j z 1, 2... 10, potom buď x = y alebo x ^ y a žiadne z desiatich zvolených prvočísiel nie je svedkom toho, že x ý V- V tomto prípade Ru odpovie „sú rovnaké". Čo sme si mohli všimnúť? Keď platí x = y, odpovie SVEDOK(IO) tak isto ako SVEDOK zaručene správny výsledok „sú rovnaké". V prípade, že platí x ý Vi môže odpovedať SVEDOK(IO) nesprávne iba v prípade, keď žiadne z desiatich prvočísiel, ktoré si zvolil, nebolo svedkom pre x ay. Ak je z desiatich pokusov čo len jeden svedkom pre x ay, napríklad p4, potom s4 ý 1í svedčí o tom, že x a y nie sú rovnaké a je zaručená správna odpoveď „sú rôzne". Keď je pravdepodobnosť toho, že v jednom pokuse nevyberieme svedka najviac 2\nn/n, je pravdepodobnosť toho, že svedka pre x a y nevyberieme v 10 pokusoch, v najhoršom ' 2 ln n \ 10 210-(hm)10 n10 Pre n = 1016 je to najviac 0.4717 - 10141 Počet sekúnd od veľkého tresku vynásobený počtom protónov vo vesmíre je menší než ^q99 Vynecháme matematické zdôvodnenie toho, že Šanca, že pri 10" použitiach SVEDOK(IO) dostaneme nesprávnu odpoveď je menšia než 1 ku 1030. 6.4 ZVÝŠENIE MIERY ISTOTY 197 Pravdepodobnosť chybnej odpovede sme tým stlačili hlboko pod hranicu všetkých praktických požiadaviek na obmedzenie výskytu chyby. A za tento zázrak platíme veľmi málo. Keď si náhodne zvolíme 10 prvočísiel namiesto jedného, komunikačné náklady sa zdesaťnásobia, čo znamená, že pre SVEDOK(10) budú 40 • riog2n] . Tieto náklady sú zanedbateľné. Vidno to, keď pre n = 1016 zistíme, že SVEDOK(IO) potrebuje komunikovať len 2560 bitov. Pretože SVEDOK(IO) je desať opakovaní protokolu SVEDOK, v informatike hovoríme, že so zvýšením počtu opakovaní (pokusov nájsť svedka) rastie zložitosť lineárne a pravdepodobnosť chyby sa zmenšuje exponenciálne. Je to vlastne asi najpriaznivejšia situácia, aká vôbec môže nastať. Náš algoritmus SVEDOK(IO) využívajúci náhodu je prakticky spoľahlivejší ako hocičo, čo môžeme asociovať s pojmom bežná spoľahlivosť. Je to preto, lebo už aj SVEDOK bol vlastne veľmi spoľahlivý. Metódou opakovaných pokusov dokážeme pravdepodobnosť chybného výsledku podstatne znížiť aj v prípade, keď je neveľká pravdepodobnosť, že svedok bude vybraný spomedzi kandidátov v jednom pokuse. V nasledujúcich cvičeniach prenecháme čitateľovi, aby použil predstavené myšlienky, a prehĺbil si tak pochopenie sily randomizácie. Úloha 6.8 Nech je A úloha, pre ktorú všetky známe deterministické algoritmy na jej riešenie majú zložitosť aspoň 2n. Obsahom úlohy A je rozhodnúť, či vstup x má alebo nemá určitú vlastnosť. Pre x veľkosti n máme spôsob svedčenia s nasledujúcimi vlastnosťami: (i) Keď je z svedkom pre x, potom sa vieme v čase potrebnom na vykonanie 10 • n2 operácií presvedčiť, že x má želanú vlastnosť. V prípade, že z nie je svedkom, algoritmus nie je schopný určiť, či x má alebo nemá želanú vlastnosť. Na určenie, že z nie je svedkom pre x potrebuje algoritmus tiež čas 10 • n2. (ii) Počet svedkov v množine kandidátov je aspoň polovica (t.j. pravdepodobnosť, že vyberieme svedka je aspoň 1/2). Zadanie úlohy: 198 KAPITOLA 6 1. Navrhnite algoritmus využívajúci náhodu, ktorý sa 20 krát pokúsi vybrať svedka z množiny kandidátov. Aká je zložitosť a aká je pravdepodobnosť chyby algoritmu? 2. Zákazník si želá algoritmus, ktorý vyrieši úlohu A s pravdepodobnosťou chyby najviac 1 k 109. Koľko pokusov na výber svedka nevyhnutne potrebujeme? Aká je zložitosť takéhoto algoritmu? Úloha 6.9 Vyriešte úlohu 6.8 v prípade, keď je splnený predpoklad (i) a namiesto (ii) platí jedna z nasledujúcich podmienok: •—3 a) Podiel svedkov v množine kandidátov je presne 1/6. b) Podiel svedkov v množine kandidátov je iba jedna ra-tina, pričom n je veľkosť vstupných údajov. +=> ■v 6.5 Co sme objavili? Keď trváme na stopercentnej teoretickej záruke, že vypočítané riešenie jednotlivých prípadov daných úloh je vždy správne, môžeme sa ocitnúť v bezvýchodiskovej situácii. Všetky algoritmy, spĺňajúce požiadavku absolútnej spoľahlivosti, vyžadujú také výpočtové náklady, ktoré ich robia prakticky neuskutočniteľnými. Poznáme príklady problémov, pri ktorých najlepšie známe algoritmy vyžadujú viac času ako je vek vesmíru a viac energie ako je v celom vesmíre. Riešenie takýchto problémov v prípade požadovanej absolútnej spoľahlivosti je mimo fyzikálne realizovateľného. A v tejto zdanlivo bezvýchodiskovej situácii zistíme, že môžeme urobiť zázrak. Zriekneme sa tak, či tak nedosiahnuteľnej absolútnej spoľahlivosti výpočtu a budeme požadovať iba, aby sme vypočítali s vysokou pravdepodobnosťou správny výsledok pre každý prípad problému. Smieme pri tom požadovať tak malú pravdepodobnosť chyby, že môžeme hovoriť o zámene hypoteticky absolútnej spoľahlivosti za praktickú spoľahlivosť. Týmto iba zdanlivým rezignováním na maximálne požiadavky, pokiaľ ide o korektnosť riešenia, vieme ušetriť obrovské množstvo práce počítača. Pri niektorých problémoch dosiahneme vďaka šikovnému využitiu náhody v algoritme na ich riešenie skok od fyzikálne nerealizovateľného množstva výpočtov k výpočtom, ktoré sa dajú za pár sekúnd vykonať na bežnom počítači. Naučili sme sa dve dôležité paradigmy návrhu systémov využívajúcich náhodu. Metóda hojných (početných) svedkov odhalila najhlbšie korene sily ran-domizácie. Svedok pre konkrétny prípad problému predstavuje dodatočnú informáciu, pomocou ktorej tento prípad vieme efektívne vyriešiť, čo by sme 6.5 ČO SME OBJAVILI? 199 bez svedka neboli schopní. Metóda má dobré vyhliadky na úspech, keď vieme nájsť taký spôsob svedčenia, pri ktorom sa svedkovia hojne vyskytujú medzi kandidátmi. Vtedy vieme náhodným (podľa potreby aj opakovaným) výberom s vysokou pravdepodobnosťou získať z množiny kandidátov svedka, napriek tomu, že nevidíme možnosť efektívne určiť svedka deterministicky. Základnú otázku, či sú ťažké problémy, ktoré vieme efektívne riešiť random-izovane, ale nedajú sa riešiť deterministicky, môžeme vyjadriť rečou metódy hojných svedkov takto: V prípade, že pre ťažké výpočtové problémy máme len množiny kandidátov na svedkov, v ktorých sú náhodne rozptýlení (rozmiestnení) často sa vyskytujúci svedkovia náhodne, sú tieto problémy efektívne riešiteľné randomizovane, ale nie sú efektívne riešiteľné deterministickými algoritmami. Druhý dôležitý princíp návrhu randomizovaných algoritmov, ktorý sme sa naučili je paradigma Zvýšenia pravdepodobnosti úspechu (rýchle zmenšenie pravdepodobnosti chyby) opakovaným spustením navrhnutého systému využívajúceho náhodu. Desaťnásobné opakovanie protokolu SVEDOK vyústilo do protokolu SVEDOK(IO), ktorého pravdepodobnosť chyby sa približovala k nule exponenciálne rýchlo vzhľadom na počet opakovaní. Pritom zložitosť rástla vzhľadom na počet opakovaní len lineárne. Situácia nie je vždy taká priaznivá, ale väčšinou sme schopní bez veľkého zníženia efektívnosti dosiahnuť (zákazníkom) požadovanú mieru spoľahlivosti. Kniha „Randomisierte Algorithmen" alebo „Design and Analysis of Randomized Algorithms" [Hro04b, Hro05] podrobne predstavuje metodiku tvorby systémov využívajúcich náhodu pre začiatočníkov. Na jednej strane sa snaží malými krokmi vytvoriť intuitívne pochopenie predmetu, na druhej strane používa dôsledne rigorózny jazyk matematiky, aby mohla poskytnúť jednoznačné zdôvodnenie všetkých tvrdení a výsledkov analýzy algoritmov. Najpodrobnejšie a najhlbšie predstavenie témy randomizácie nájdeme v monografii „Randomized Algorithms" [MR95] od Motwaniho a Raghavana, ktorá je veľmi náročná a je určená predovšetkým výskumníkom a študentom tejto oblasti. Lahôdkou pre labužníkov je kniha „Geschichte der Algorithmenentwicklung für den Primzahltest" od Martina Dietzfelbingera [Die04], ktorá je ovplyvnená konceptmi randomizácie, najmä použitia metódy hojných svedkov. Ďalšie efektívne komunikačné protokoly využívajúce náhodu obsahujú knihy [KN97, Hro97]. Nájdete v nich prezentáciu matematicky dokázateľných výhod randomizácie oproti deterministickému prístupu. Žiaľ, tieto knihy sú matematicky náročné, a preto ťažko prístupné pre širšie publikum. 200 KAPITOLA 6 Návody riešenia vybraných úloh Úloha 6.2 Žiadne prvočíslo okrem 7 z PRIM(25), nevedie k chybnej odpovedi „sú rovnaké" pri použití SVEDOK pre x = 01111 a y = 10110. Úloha 6.5 (i) Nech x = 01010 a y = 11101. Preto platí n = 5 a do úvahy berieme prvočísla z PRIM(52). Čísla zodpovedajúce x a y sú Číslo(01010) = 23 + 21 = 8 + 2 = 10 Číslo(lllOl) = 24 + 23 + 22 + 2° = 16 + 8 + 4 + 1 = 29. Aby sme určili zlé prvočísla z PRIM(25), nemusíme skúšať všetky prvočísla. Vieme, že každé zle prvočíslo musí deliť rozdiel O Číslo(lllOl) - Číslo(01010) = 29 - 10 = 19. Číslo 19 je prvočíslo, takže jediné prvočíslo z PRIM(25) deliace 19, je samotná 19. Preto je 19 jediné zlé prvočíslo pre 01010 a 11101. • o Úloha 6.7 (i) Aby sme spočítali pravdepodobnosť chyby protokolu SVEDOK pre x = 00011011 a y = 10101101, musíme určiť veľkosť PRIM(82) a počet zlých prvočísiel pre x a y v PRIM(82). PRIM(64) = {2, 3, 5, 7,11,13,17,19, 23, 29, 31, 37,41,43,47, 53, 59, 61} a platí, že |PRIM(64)| = 18. Ďalej platí, že V Číslo(x) = 24 + 23 + 21 + 2° = 16 + 8 + 2 + 1 = 27 Číslo(y) = 27 + 25 + 23 + 22 + 2° = 128 + 32 + 8 + 4 + 1 = 173. Takže Číslo(y) —Číslo(x) = 173 — 27 = 146. Číslo 146 sa dá rozložiť na prvočinitele: ^^yV 146 = 2 • 73 . Teda jediné prvočísla, ktoré delia Číslo(y) — Číslo(x) = 146, sú čísla 2 a 73. Pretože 73 sa nenachádza v PRIM(64), je v PRIM(64) presne jedno zlé prvočíslo pre x a y. Pravdepodobnosť chyby je preto presne 1/18. Úloha 6.8 1. Algoritmus sa skončí, keď nájde svedka pre x. V najhoršom prípade urobí 20 pokusov a každý pokus stojí najviac 10 • n2 operácií potrebných na preverenie, či vybraný objekt je svedok. Takže zložitosť algoritmu využívajúceho 6.5 ČO SME OBJAVILI? 201 náhodu je v najhoršom prípade 20 • 10 • n2. Keď vstup x nemá hľadanú vlastnosť, dá algoritmus s istotou správnu odpoveď „NIE". Keď x má vlastnosť, môže algoritmus odpovedať nesprávne „NIE" iba vtedy, keď 20-krát po sebe nevyberie svedka. Pravdepodobnosť, že pri pokuse nevyberieme svedka, je najviac 1/2 (podľa (ii)). Pravdepodobnosť, že v 20 po sebe idúcich pokusoch nevytiahneme svedka je teda najviac Takže pravdepodobnosť chyby nie je menšia ako 1 k miliónu. 2. Koľko pokusov potrebujeme, aby sme stlačili pravdepodobnosť pod 1/109? Vieme, že 210 = 1024 > 1000. Takže 230 = (210)3 > 10003 = 109. Teda stačí 30 pokusov, aby bola pravdepodobnosť chybnej odpovede menej než 1 k miliarde. Ir J 6 J Z geniálnej myšlienky sa dajú odstrániť všetky slová. Stanislaw Jerzy Lee Kapitola 7 O} o Kryptografia, alebo ako spravit zo slabiny prednosť 7.1 Magická veda súčasnosti Najfascinujúcejšou vedou dvadsiateho storočia bola pravdepodobne fyzika. Priniesla hlboké a fundamentálne poznatky, ktoré podstatným spôsobom zmenili náš pohľad na svet. Mnohé aplikácie a interpretácie fyzikálnych objavov, akými sú teória relativity alebo kvantová mechanika, pôsobia ako zázraky. Málokto veril, že niečo také je vôbec možné. Podľa môjho názoru naj magickej šou vedeckou disciplínou súčasnosti je kryptografia. Verili by ste, že • každý sa môže presvedčiť o tom, že vlastníte tajomstvo bez toho, aby ste z neho čo len zlomok prezradili? • šifrovaná správa sa dá poslať viacerým príjemcom tak, že títo ju môžu dešifrovať a prečítať iba keď všetci bez výnimky spolupracujú (spolu-vytvoria tajný kľúč)? • sa dá elektronicky podpísať dokument tak, aby sa každý mohol presvedčiť o jeho pravosti, ale nikto nevedel elektronický podpis sfalšovať? • vo verejnom rozhovore sa dá s inou osobou dohodnúť na tajnom kľúči bez toho, aby sa prípadný načúvajúci o ňom čokoľvek dozvedel? 204 KAPITOLA 7 Všetko uvedené a mnoho ďalšieho je možné. Jednoducho čistá „mágia"! Komunikácia je heslom dňa Nezáleží na tom, Ci ide o mobilné telefóny, sms-ky, internet, elektronickú poštu, alebo klasický fax, písanie listu alebo telefonovanie, všade sa komunikuje alebo sa komunikačnými sieťami prenášajú údaje. Pri takomto množstve odosielaných správ ustavične rastú nároky na ochranu súkromia zúčastnených, keďže odoslané správy by nemal byť schopný prečítať nikto okrem prijímateľa, ktorému boli určené. Nároky na bezpečnosť stúpajú predovšetkým pri elektronickom nákupe a predaji1, peňažných transakciách2 alebo elektronických voľbách. Kryptológia pôvodne znamenala náuku o tajných písmach a je skoro taká stará ako samotné písmo. V kryptológii rozlišujeme medzi kryptografiou a kryptoanalýzou. Kryptografia sa zapodieva návrhom kryptosystémov (tajných kódov) a kryptoanalýza študuje spôsoby ako kryptosystémy prelomiť (tajne čítať správy). Kedysi dávno, keď ľudia objavili a zdokonalili písmo, vedelo písať a čítať iba pár zasvätených. V tomto úzkom kruhu ľudí ho mohli používať namiesto šifrovaného písma. Ako rástol počet ľudí, ktorí vedeli čítať a písať, rástla aj potreba po ozajstnom šifrovanom spôsobe písania. V tejto kapitole sa najprv krátko obzrieme do histórie, keď sa kryptológia ešte považovala za umenie. Vyvíjali sa šifry, používali sa pokým niekto neprišiel na spôsob ako šifrované správy prečítať, čím príslušná šifra prestala byť bezpečná. V krátkosti sa pozrieme, ako šifrovali správy Caesar a Riche-lieu. Pritom sa naučíme koncept tvorby kryptosystému (šifrovaného písma) a čo rozumieme pod spoľahlivosťou alebo bezpečnosťou kryptosystému. Našim ďalším cieľom bude ukázať, ako sa vďaka informatike (najmä algorit-mike a teórii zložitosti) umenie vytvárať šifry zmenilo na vednú disciplínu, ktorá sa nazýva kryptografia. Kryptografia vďačí informatike za základný pojem: bezpečnosť kryptosystému (axiomatický základný kameň), ktorý umožňuje vedecký výskum v tejto oblasti. Vďaka nemu sa vyvinula moderná kryptografia, založená na magickom koncepte takzvaných Public-Key-kryptosystémov3. Vysvetlíme hlavnú myšlienku tohto konceptu a ukážeme, ako môžeme využiť vlastné slabé stránky v náš prospech. Na základe teórie zložitosti vieme, že existujú problémy, ktoré sa nedajú efektívne algoritmicky vyriešiť (študovali sme ich v kapitole 5). Tieto využijeme pri vytváraní kryptosystémov, ktoré sa prakticky nedajú ohroziť. A nakoniec si pozrieme ešte pár divov, ako sa dá tento koncept magicky využiť. e-commerce 2 online-banking 3kryptosystémov s verejnými kľúčmi 7.2 PREHISTÓRIA KRYPTOLOGIE 205 7.2 Koncept krypt osy stému, alebo prehistória kryptológie Najprv uvedieme odborné pojmy. Ako sme už spomínali, kryptológiu chápeme ako náuku o tajných písmach. V rámci kryptológie rozlišujeme medzi kryptografiou, vedeckou disciplínou zaoberajúcou sa vytváraním kryptosys-témov a kryptoanalýzou, umením tieto prelomiť. V ďalšom sa sústredíme na kryptografiu. Náš scenár je na obrázku obr. 7.1. tajný kľúč tajný kľúč Osoba, nazývaná odosielateľ, posiela tajnú správu druhej osobe, ktorú voláme prijímateľ. Tajná správa má podobu textu, budeme ju označovať ako otvorený text. Otvorený text je napísaný v prirodzenom jazyku a je teda pre každého dobre čitateľný. Správu doručuje nie celkom stopercentne spoľahlivý posol, alebo sa posiela nechráneným verejným komunikačným kanálom. Aby sme zabránili niekomu nepovolanému, kto by sa akokoľvek k správe dostal, prečítať jej tajný obsah, pošleme správu v šifrovanej forme4. Spôsob šifrovania a dešifrovania je spoločným tajomstvom odosielateľa a prijímateľa a šifrovanie sa vykonáva pomocou takzvaného kľúča. Zašifrovaný text voláme kryptotext. Po prijatí prijímateľ kryptotext dešifruje. Dešifrovaním sa z kryptotextu vytvorí opäť pôvodný otvorený text, ktorý prijímateľ môže bez problémov čítať. Opis procesu šifrovania a dešifrovania poskytuje úplnú informáciu o kryptosystéme, umožňujúcu nám ho použiť. Pre lepšie znázornenie sa pozrime na kryptosystém CAESAR, ktorý Caesar skutočne používal. Otvorené texty boli texty napísané v latinskej abecede, z ktorej boli vynechané prázdne znaky, čiarky, otázniky, bodky atď. Takže VENIVIDIVICI 4tajným písmom 206 KAPITOLA 7 môžeme považovať za otvorený text. Caesar šifroval každé písmeno jednoznačne za nejaké iné písmeno. Kľúč bol daný jedným číslom od 1 po 26. 0, 1, 2, 3, 4, 5, 23, 24, 25 Použiť kľúč i znamená, nahradiť každé písmeno písmenom, ktoré je od neho v abecede o i miest neskôr. Obrázok 7.2 znázorňuje kódovanie kľúčom i = 3. To znamená, že písmeno A nahradíme s D, lebo A je na prvej pozícii v abecede a posunom o tri pozície dostaneme štvrtú pozíciu, na ktorej je písmeno D. Analogicky sa písmeno B z druhej pozície zakóduje písmenom E z piatej pozície, atď. Týmto spôsobom sa dostaneme až k písmenu W na 23. pozícii, ktoré sa zakóduje písmenom Z z 26. pozície. Čo sa ale stane so zvyšnými tromi písmenami X, Y a Z, ktoré sú na pozíciách 24, 25 a 26? Na zakódovanie nám ostali ešte písmená A, B a C. Napíšeme si teda A B C na pozície 27, 28 a 29 za spodnú abecedu na obr. 7.2 a pokračujeme v kódovaní rovnakým spôsobom ako predtým. Teda X sa zakóduje ako A, Y ako B a Z ako C. Iný spôsob ako si tento proces znázorniť je takýto, predstavme si, že máme kruhový pás, ktorý je nastoknutý na pevnom hriadeli, okolo ktorého sa môže otáčať. Abecedu napíšeme na otočný pás a na pevný hriadeľ si napíšeme zodpovedajúce pozície písmen v abecede. Keď pás otočíme o tri pozície dostaneme hľadané kódovanie písmen. Pre kľúč i = 3 sa správa VENIVIDIVICI zakóduje ako YHQIYLGIYLFL ABCDEFGHI J KLMNOPQRSTUVWXYZ ABCDEFGHI J KL NOf O P Q R S T U V WX Y Z A B C obr. 7.2 CDEFGHIJKl obr. 7.3 7.2 PREHISTÓRIA KRYPTOLOGIE 207 Úloha 7.1 a) Zakódujte Cézarovým kryptosystémom text VENIVIDIVICI kľúčom i = 5 a potom i = 17. b) Zakódujte otvorený text „Roma aeterna docet" kľúčom i = 7 a otvorený text „Homines sumus, non dei!" kľúčom i = 13. Ako dekóduje príjemca kryptotext? Jednoducho, každé písmeno kryptotextu nahradí písmenom, ktoré sa nachádza v abecede o tri pozície skôr. Zodpovedá to otočeniu pásu na obr. 7.3 o tri pozície doľava. Pritom sa napríklad písmeno S kryptotextu nahradí písmenom P, písmeno U sa nahradí písmenom R a L sa nahradí I. Teda keď príjemca dešifruje kryptotext SULPXPQHQRFHDV kľúčom i = 3, dostane otvorený text PRIMUMNENOCEAS Úloha 7.2 Dešifrujte kryptotext WYPTBTBAWYVMPJLHZ kľúčom i = 7. Úprimne povedané, Caesar nechcel zbytočne riskovať, že niekto takýto relatívne jednoduchý kryptosystém pochopí, a preto v kryptotexte (po posunutí písmen) nahradil písmená v latinke, písmenami gréckej abecedy. Takže prijímate! musel najskôr nahradiť grécke písmená, aby dostal príslušný kryptotext v latinke, a až potom posunúť pomocou kľúča abecedu naspäť. Jules Verne vo svojich románoch používa rovšeobecený Cézarov kryptosystém. Kľúč mohlo byť ľubovoľné celé číslo. Pre celé číslo s m ciframi A = &\&2 • • • Q>m rozdelil text na bloky dĺžky m a j-te písmeno v každom bloku nahradil písmenom, ktoré je v abecede o a, pozícií za ním. Napríklad pre a = 316 a otvorený text CRYPTOGRAPHY 31631631631 6, dostaneme cryptotext FSESUUJSGSIE Na rozdiel od vecnéhopostupu Cézarovho šifrovania, Richelieov spôsob šifrovania by sa dal označiť ako umenie. Nasledujúci príklad použitia RICHELIEU kryptosystému pochádza od Salomaa [Sal96]. Kryptotext je obyčajný popísaný list papiera. Každé písmeno má svoje presné miesto, napríklad H leží v druhom riadku a treťom stĺpci na obr. 7.4 (b). Kľúč je matica na 208 KAPITOLA 7 (a) I L 0 V E Y 0 U I H A V E Y 0 u D E E P U N D E R M Y S K I N M Y L 0 V E L A S T S F 0 R E V E R I N H Y P E R S P A C E obr. 7.4 (a), v ktorej sú určité (sivé) políčka zakryté a určité otvorené. Cez otvorené políčka vidíme otvorený text. (obr. 7.4 (c)) YOUKILLATONCE. 7.3 Kedy je kryptosystém bezpečný? Ľudia sa ustavične snažia dosiahnuť bezpečnosť. Dôvody ich úzkosti sú často pocity neistoty a nebezpečna. No veda a najmä fyzika nás učia, že absolútna istota neexistuje. Bezhlavo sa o ňu usilovať môže spôsobiť až zdravotné 7.3 KEDY JE KRYPTOSYSTÉM BEZPEČNÝ? 209 problémy. Lepšie je naučiť sa žiť s neistotou. Napriek tomu má ale zmysel usilovať sa o dosiahnuteľné bezpečnostné záruky. Kedy budeme považovať kryptosystém za „bezpečný"? Vždy vtedy, keď náš protivník, alebo niekto nepovolaný nebude vedieť na základe kryptotextu zrekonštruovať zodpovedajúci otvorený text. Táto požiadavka má dve možné interpretácie. Malo by byť ťažké, ak nie nemožné, aby kryptoanalytik dešifroval kryptotext, keď nevie nič o kryptosystéme, alebo aj vtedy, ak je umenie ako text zašifrovať známe a neznámy je iba šifrovací kľúč? Prvú možnosť, keď uchovávame v tajnosti spôsob šifrovania nazývame „Security by Obscurity" a nepovažuje sa za dostatočnú na definovanie bezpečnosti kryptosystému. Dôvodom je naša skúsenosť, že je to vždy len otázka času, kým niekto príde na spôsob, ako sa v novom systéme šifruje. Preto už v 19. storočí sformuloval Auguste Kerckhoffs nasledujúcu bezpečnostnú požiadavku, ktorú poznáme ako Kerckhoffsov princíp: Kryptosystém je bezpečný, keď z prijatého kryptotextu nevieme bez znalosti kľúča odvodiť pôvodný otvorený text, hoci spôsob šifrovania je verejne známy. Kryptosystém CAESAR nie je navidomoči v uvedenom zmysle bezpečný. Keď je známy jeho princíp, tak na to, aby sme rozšifrovali ľubovoľný kryptotext, stačí vyskúšať všetkých 25 možných kľúčov. Z tohto príkladu môžeme hneď usúdiť, že bezpečný kryptosystém musí mať na výber z veľkého počtu kľúčov. Stačí to ale naozaj? Vylepšime systém CAESAR tým, že dovolíme vytvárať ľubovoľné dvojice písmen. Kľúčom bude teraz takzvaná permutácia z 26 písmen, ktorú si môžeme predstaviť ako 26-ticu čísiel od 1 po 26, pričom každé číslo od 1 po 26 sa v nej vyskytuje iba raz. Napríklad nasledujúci kľúč^ (26, 5, 1, 2, 3, 4, 25, 24, 23, 8, 9, 22, 21, 20, 7, 6, 10, 11, 18, 17, 12, 13, 19, 14, 16, 15) zodpovedá šifrovaniu, pri ktorom sa písmeno A nahradí 26. písmenom - Z, písmeno B sa nahradí piatym písmenom - E, písmeno C písmenom A, atď. obr. 7.5 znázorňuje zodpovedajúce dvojice písmen. Keď použijeme tento kľúč dostaneme kryptotext EJZFWLZQZMEBWNZMCXBEJCQUMFKXBEJWKSZAYSCLCQM z nasledujúceho otvoreného textu CHODSVOJOUCESTOUANECHAJLUDINECHSIROZPRAVAJU 210 KAPITOLA 7 ABCDEFGH I J KLMNOP QRSTUVWXYZ ZEABCDYX WH IVUTGF J KRQLMSNPO obr. 7.5 Úloha 7.3 Dešifrujte nasledujúce kryptotexty, ktoré vznikli použitím kľúča z obr. 7.5. BZTQCZVWYXWCKW h) YCBLVBWRQBCKRAXVLCRRCVDLCKDKCLBC Koľko kľúčov má tento kryptosystém? Na zakódovanie písmena A máme na výber z 26 písmen. Po tom, čo si zvolíme zašifrovanie písmena A, máme ešte 25 možností ako zakódovať B. Pre písmeno C máme 24 možností, atď. Takže počet rôznych kľúčov je \ Í7> 26! = 26 • 25 • 24 • 23 • ... • 3 • 2 • 1 čo je (v reči kombinatoriky) počet všetkých permutácií 26 prvkov. Je to ozaj obrovské číslo, približne 4.03 • 1026. Takýto počet kľúčov nik nemôže preskúšať ani s pomocou najrýchlejších počítačov. Je teda už kryptosystém bezpečný? Odpoveď je, žiaľ, jednoznačná: „nie". Na to, aby sme objavili ten správny kľúč, nemusíme nevyhnutne vyskúšať všetky možné. Postačí nám šikovná myšlienka, ktorá neprišla na um tvorcovi kryptosystému a systém poľahky prelomíme. V prípade šifrovania permutáciou písmen stačí vedieť, v ktorom prirodzenom jazyku sa komunikuje. Pre každý prirodzený jazyk je známe, ako často sa vyskytujú jednotlivé písmená v slovách a tieto početnosti sú navzájom dosť rôzne. Okrem toho sa niektoré kombinácie písmen vyskytujú častejšie, napríklad v nemčine je to SS alebo SCH. Toto kryptoanalytikovi stačí na to, aby kryptotext rozšifroval, a teda aj určil tajný kľúč. Uvedený príklad ilustruje, ako ťažko je formálne uchopiť pojem „nebyť schopný, alebo len veľmi ťažko dešifrovať". V Kerkhoffsovej definícii bezpečnosti je navyše jeden stupeň voľnosti. Nejde iba o samotný kryptosystém, ale aj o protivníka. čo je nemožné pre niektorého protivníka, môže byť pre iného hračkou. Čo môžeme o protivníkovi predpokladať, alebo ako dostať všetkých protivníkov pod spoločný klobúk? 7.4 SYMETRICKÉ KRYPTOSYSTÉMY 211 Dlhotrvajúcu nejasnosť pojmu bezpečnosť v kryptológii ukončila informatika. Zjednotila všetky rovnako jednoduché, ako aj geniálne, stratégie kryptoana-lytikov pod pojem algoritmus. Krypto systém považujeme za bezpečný, keď neexistuje efektívny (randomizovaný polynomiálny) algoritmus, ktorý na základe poznania kryptotextu a spôsobu šifrovania, bez tajného kľúča vypočíta pôvodný otvorený text. Je zrejmé, že takáto definícia bezpečnosti kryptosystému nemohla vzniknúť pred zavedením pojmu algoritmus.5 Tým vieme vyjadriť prvé dve dôležité požiadavky na „dobrý"kryptosystém v terminológii teórie zložitosti. (i) Šifrovanie a dešifrovanie vieme pri známom kľúči realizovať efektívnym algoritmom. (ii) Dešifrovanie bez kľúča predstavuje ťažký (prakticky neriešiteľný) problém. 7.4 Symetrické kryptosystémy Kryptosystémy, o ktorých bola doposiaľ reč nazývame symetrické. Slovo symetrické znamená, že odosielateľ i prijímate! správy sú rovnocenní v tom zmysle, že rovnaký tajný kľúč sa použije na zašifrovanie aj dešifrovanie správy. V princípe by si mohol odosielateľ s prijímateľom hocikedy vzájomne vymeniť úlohy bez toho, aby zmenili kľúč. Ich komunikáciu môžeme teda chápať ako rozhovor alebo vzájomnú výmenu informácií. Teraz si ukážeme bezpečný symetrický komunikačný systém. Pre účely tohto kryptosystému budeme chápať otvorený text ako postupnosť núl a jednotiek. Nijako nás to neobmedzí, pretože každé písmeno a ľubovoľný symbol, ktorý vieme napísať na klávesnici, má ASCII kód, ktorý je binárnou reprezentáciou príslušného symbolu v počítači. Takto sa dá každý text premeniť na postupnosť núl a jednotiek. Ako kľúč použijeme tiež postupnosť núl a jednotiek, napríklad zoberieme niekoľko sto náhodne vygenerovaných bitov, aby sme prípadnému tretiemu sťažili, alebo mu až úplne znemožnili kľúč nejakým spôsobom vypočítať. Skôr ako definujeme spôsob šifrovania a dešifrovania, musíme sa naučiť jednu operáciu s bitmi (binárnymi číslami). Táto operácia sa nazýva „exkluzívne 5Zavedeniu pojmu algoritmus vďačíme za viacero podobne podstatných pokrokov vo vede. 212 KAPITOLA 7 alebo" alebo „XOR", označuje sa © a definujeme ju nasledujúco: 0©0 = 0 1 © 1= 0 001 = 1 100 = 1 Na základe označenia zo 6. kapitoly platí a © 6 = a + b mod 2. Dva rovnaké sčítance dávajú nulu a dva rôzne dávajú jednotku. Predpokladajme, že kľúč je 01001011. Kľúč má dĺžku 8 a môžeme ho použiť na zašifrovanie 8 bitov otvoreného textu. Pritom použijeme i-ty bit kľúča a operáciou © zašifrujeme i-ty bit otvoreného textu. Názorne to vidieť, keď si kľúč napíšeme pod otvorený text: otvorený text 00001111 © kľúč_01001011 = kryptotext 01000100 z-ty bit kryptotextu je XOR-súčet i-teho bitu otvoreného textu a i-teho bitu kľúča. Teraz použijeme rovnaký postup na rozšifrovanie: kryptotext 01000100 © kľúč_01001011 = otvorený text 00001111 Vidíme, že to funguje a dostaneme pôvodný otvorený text. Je to založené na skutočnosti, že a © a = 0 a teda platí 6 © a © a = b Dvojnásobné použitie kľúča nás privedie k pôvodnému textu. Inak povedané druhé použitie kľúča zruší jeho prvé použitie. Okrem toho platí aj a@b = b@a. Preto hovoríme, že tento spôsob šifrovania je komutatívny. Úloha 7.4 Zašifrujte a dešifrujte otvorený text 0001110011 s kľúčom 0101101001. Úloha 7.5 Vytvorte podobný kryptosystém, ktorý bude založený na nasledujúcej maskovacej binárnej operácii: 0_L0 = 1 1_L0 = 0 1X1 = 1 0_L1 = 0 Druhý bit b v a _L b nazývame maskovací. Keď 6 = 1, tak sa prvý bit skopíruje. A v prípade keď 6 = 0, sa prvý bit a preklopí na ä (teda 1 na 1 = 0 a 0 na Ô = 1). 7.4 SYMETRICKÉ KRYPTOSYSTÉMY 213 a) Použite operáciu _L na zašifrovanie a dešifrovanie otvoreného textu 00110011 kľúčom 00101101. b) Zdôvodnite, prečo aj kryptosystém založený na operácii _L funguje. c) Co majú operácie la® spoločné? Je medzi nimi úzky vzťah? Ak je na otvorený text použitý ako „maska" kľúč, ktorý náhodne generujú odosielateľ aj prijímate!6, dá sa matematicky zdôvodniť, prečo sa krypto-text každému inému zdá ako náhodná postupnosť bitov. V takom prípade nepomôžu kryptoanalytikom ani hypoteticky použiteľné exponenciálne algoritmy a najrýchlejšie počítače. Takýto kryptosystém môžeme považovať pri jednorazovom použití ako bezpečný. Keď máme dlhý otvorený text, šifrujeme ho zvyčajne podobným spôsobom kľúčom s pevnou dĺžkou n, pričom otvorený text rozdelíme na úseky dĺžky n a každý z nich zašifrujeme kľúčom osobitne. Napríklad keď je kľúč 0101, rozdelíme otvorený text 1111001100001101 na štyri časti 1111, 0011, 0000 a 1101 a každú časť zašifrujeme samostatne a odošleme postupnosť vzniknutých kryptotextov 1010011001011000. To je typický spôsob použitia kryptosystémov, vytvorených pre otvorené texty pevnej dĺžky. V prípade XOR-kryptosystémov sa takéto rozšírenie neodporúča, pretože pri opakovanom použití rovnakého kľúča, je možné ho určiť. Platí otvorený text © kryptotext = kľúč (7.1) Preveríme, či to platí na našom prvom príklade s kľúčom 01001011. otvorený text 00001111 © kryptotext 01000100 = kľúč 01001011 Prečo ie to tak? otvorený text © kľúč = kryptotext (7.2) zodpovedá šifrovaniu. Teraz pripočítajme zľava k obom stranám rovnice (7.2) otvorený text a dostaneme: otvorený text © otvorený text © kľúč = otvorený text © kryptotext (7.3) 6teda ho nie je potrebné prenášať 214 KAPITOLA 7 Keďže a © a = O pre každý bit a otvorený text © otvorený text = 00 ... 00. A keďže 0 © b = b pre každý bit b, ľavá strana rovnice (7.3)sa rovná kľúču, čím dostávame rovnicu (7.1). Rovnica (7.1) je pre bezpečnosť kryptosystému veľmi nebezpečná. Keby sa pri viacnásobnom použití rovnakého kľúča dostal nepriateľovi nejako do rúk čo len jediný pár (otvorený text, kryptotext), okamžite by využitím (7.1) vedel vypočítať kľúč a dešifrovať všetky nasledujúce kryptotexty. Z tohto, ale nielen z tohto dôvodu je XOR-kryptosystém bezpečný iba pri jednorazovom použití kľúča. Úloha 7.6 (tvrdý oriešok) Pokúste sa vytvoriť bezpečný kryptosystém pre nasledujúcu úlohu. Osoba A zašifruje otvorený text kľúčom, ktorý pozná len ona (tajná správa). Správa je určená pre dvoch ľudí B a C. Osoba A chce tajný kľúč rozdeliť medzi B a C tak, aby ani jeden z nich nebol schopný kryptotext sám dešifrovať a ani zistiť čo len jediný bit otvoreného textu. Keď ale B a C budú spolupracovať, kryptotext bez problémov rozšifrujú. Sú aj iné symetrické kryptosystémy, ktoré sú bezpečné a pri ktorých dokonca bez váhania môžeme kľúč opakovane použiť. Najznámejší a v súčasnosti najrozšírenejší symetrický kryptosystém je DES (Data Encryption Standard), ktorý bol vyvinutý spoločne IBM a NSA (National Security Agency). Používa sa v ňom okrem iných aj operácia XOR, ale je príliš zložitý na to, aby sme ho tu opísali. Napriek doteraz spoľahlivému použitiu niekoľkých symetrických kryptosys-témov nie sme ešte na konci nášho hľadania bezpečného systému. Problém je v tom, že symetrické kryptosystémy sa dajú spoľahlivo použiť iba v prípade, keď sa odosielateľ a prijímate! dopredu dohodnú na spoločnom kľúči. Ale ako to majú urobiť bez toho aby sa stretli? Ako sa majú na začiatku bez kryptosystému a prostredníctvom nie bezpečného komunikačného kanála dohovoriť na spoločnom kľúči? Riešenie tohto problému je predmetom nasledujúcej podkapitoly. 7.5 Zhodnutie sa na spoločnom kľúči cez nechránený verejný komunikačný kanál Dve osoby, Alica a Bob, chcú vytvoriť spoločný symetrický kryptosystém. Spôsob šifrovania je obom známy, potrebujú sa iba dohodnúť na spoločnom 7.5 DOHODNUTIE SA NA SPOLOČNOM KĽÚČI 215 kľúči. Pretože sa ale nemôžu stretnúť osobne, musia sa dohodnúť na tomto spoločnom tajomstve bez kryptosystému a len využitím verejného komunikačného kanála, ktorý môže každý odpočúvať. Je to vôbec možné? Odpoveď je „áno", a je prekvapujúce ako elegantne sa dá tento problém vyriešiť. Ukážeme si najprv názorne hlavnú myšlienku pomocou truhlice a nie stopercentne spoľahlivého posla. Alica použije zámok, od ktorého má kľúč iba ona a analogicky Bob použije zámok, ktorý vie otvoriť len on.7 Alica sa s Bobom dohodne, že budúci spoločný kľúč vloží do truhlice a pošle Bobovi. Postupujú nasledujúco: 1. Alica vloží tajný kľúč do truhlice a uzamkne ju svojim zámkom. Okrem nej truhlicu nemôže nik otvoriť, lebo iba ona má správny kľúč od svojho zámku. Truhlicu pošle Bobovi. 2. Posol prinesie truhlicu Bobovi, ktorý ju samozrejme tiež nevie otvoriť. Namiesto toho, aby sa ju pokúšal otvoriť, aj Bob zamkne truhlicu jeho zámkom. Truhlicu uzamkutú dvomi zámkami pošle naspäť Alici. Teraz nik nemôže truhlicu otvoriť. 3. Alica dostane truhlicu s dvomi zámkami. Odomkne ju a odstráni svoj zámok. Na truhlici zostal iba Bôbov zámok, a tak pošle truhlicu znova 4. Bob dostane truhlicu, zamknutú iba jeho zámkom. Otvorí ho a z truhlice si prevezme spoločný tajný kľúč. Dohovorenie sa na tajomstve je zábavným spôsobom znázornené na obr. 7.6 od Arto Salomaa [Sal96]. Bobovi. obr. 7.6 Nemajú ešte spoločný kľúč. 216 KAPITOLA 7 Úloha 7.7 (tvrdý oriešok) Alica chce rovnaký tajný kľúč bezpečne poslať trom ďalším osobám. Jedna možnosť je zopakovať trikrát horeopísanú procedúru. Pritom bude musieť posol bežať 3-3 = 9 krát medzi dvoma ľuďmi. Dá sa uskutočniť odovzdanie kľúča trom osobám tak, aby posol musel bežať menejkrát? odosielateľ zamkne otvorený text 101011 kľúč odosielateľa 011011 prvý kryptotext 110000 príjmateľ zamkne odosielateľ odomkne prvý kryptotext 110000 kľúč príjemcu 101010 druhý kryptotext 011010 druhý kryptotext kľúč odosielateľa 011010 011011 tretí kryptotext 000001 príjmateľ odomkne obr. 7.7 tretí kryptotext 000001 kľúč príjemcu 101010 otvorený text 101011 Dá sa tento proces realizovať aj elektronicky? Skúsme to najprv s operáciou XOR. Týmto spôsobom dostaneme veľmi jednoduchú implementáciu (realizáciu) truhlice s dvomi zámkami. Ako neskôr uvidíme, táto implementácia ešte nespĺňa všetky bezpečnostné kritéria. Na obr. 7.7 je znázornený priebeh komunikácie medzi odosielateľom a príjemcom. Odosielateľ (Alica) chce príjemcovi oznámiť kľúč, ktorý je znázornený na obr. 7.7 ako otvorený text. Otvorený text je postupnosť núl a jednotiek. Súkromné kľúče odosielateľa a príjemcu sú tiež postupnosti núl a jednotiek a majú rovnakú dĺžku ako otvorený text. Postup má tri komunikačné kroky, preto 7.5 DOHODNUTIE SA NA SPOLOČNOM KĽÚČI 217 ho v kryptografii nazývame komunikačný protokol. Priebeh protokolu je nasledujúci: 1. Odosielateľ vypočíta otvorený text © kľúč A = krypto 1 a pošle krypto 1 príjemcovi. 2. Príjemca vypočíta krypto 1 © kľúč B = krypto 2 a pošle krypto 2 naspäť odosielateľovi. 3. Odosielateľ vypočíta krypto 2 © kľúč A = krypto 3 [všimnime si, že platí krypto 3 = krypto 2 © kľúč A = krypto 1 © kľúč B © kľúč A {lebo krypto 2 = krypto 1 © kľúč B} = otvorený text © kľúč A © kľúč B © kľúč A {lebo krypto 1 = otvorený text © kľúč A} = otvorený text © kľúč A © kľúč A © kľúč B {vďaka komutatívnosti © môžeme vymeniť poradie argumentov} = otvorený text © kľúč B {lebo a©a = 0a6©0 = 6}. 1 4. príjemca vypočíta krypto 3 © kľúč B = otvorený text © kľúč B © kľúč B {pretože, ako sme pred chvíľou ukázali, krypto 3 = otvorený text © kľúč B} = otvorený text Úloha 7.8 Zahrajte sa tak, že vyskúšate priebeh komunikačného protokolu na bezpečnú výmenu kľúča pre nasledujúce údaje: otvorený text a zároveň aj budúci tajný kľúč je 01001101. Kľúč odosielateľa je 01010101 a kľúč príjemcu je 10101010. Pri opise komunikačného protokolu na výmenu kľúča sme zdôvodnili, prečo takto príjemca na konci skutočne dostane odoslaný kľúč. Hlavná myšlienka 218 KAPITOLA 7 spočíva v tom, že druhé aplikovanie kľúča automaticky zruší prvé aplikovanie aj keby boli medzi týmito aplikáciami iné akcie. Môžeme to zapísať takto text © kľúč © akcie © kľúč = text © akcie © kľúč © kľúč zruší sa = text ©akcie. Úloha 7.9 Opísaný protokol funguje pretože operácia © má pekné vlastnosti a © a = 0, a©6 = 6©aa6©0 = 6. Preskúmajte, či sa dá tento komunikačný protokol implementovat' pomocou operácie _L . Je tento komunikačný protokol bezpečný? Poskytuje rovnakú záruku bezpečnosti ako truhlica s dvoma zámkami? Bohužiaľ nie. V prípade, že kryptoan-alytik nepozná postup a získa iba jednotlivé kryptotexty, ktoré sa v rámci protokolu posielajú, nevie ich odlíšiť od náhodných postupností bitov. V tomto zmysle je naša implementácia postupu bezpečná. Podľa Kerkhoffsovho princípu musíme ale počítať s tým, že protivník pozná komunikačný protokol a jediné, čo nevie, sú dva tajné náhodne vygenerované kľúče. Ako vidno z nasledujúceho výpočtu, keď ale získa všetky tri kryptotexty (obr. 7.7), vie určiť kľúče odosielateľa i príjemcu kľúč príjemcu = prvý kryptotext © druhý kryptotext kľúč odosielateľa = druhý kryptotext © tretí kryptotext Úloha 7.10 Využitím vlastností operácie © overte platnosť predchádzajúcich rovníc na výpočet kľúčov odosielateľa a príjemcu. Tým je prezradené celé tajomstvo, lebo stačí jeden z nich, aby sme dešifrovali otvorený text: otvorený text = kľúč odosielateľa © prvý kryptotext otvorený text = kľúč príjemcu © tretí kryptotext Ako vidieť, náš komunikačný protokol nie je veľmi bezpečný. Nedal by sa nejako náš „fyzický" postup s truhlicou a dvoma zámkami preniesť do digitálneho sveta pri zachovaní rovnakej miery bezpečnosti? Túto otázku zodpovedali kladne v roku 1976 Whitfield Diffie a Martin Hellman [DH76]. Použili pri tom šikovným spôsobom počítanie modulo prvočíslo, s ktorým sme narábali už v Kapitole 6. Opíšeme tento postup podobným spôsobom ako na obr. 7.7, bez toho aby sme zachádzali do podrobného matematického zdôvodnenia jeho správnosti. Pokiaľ nemáte k matematike vzťah, nevadí, môžete nasledujúci opis protokolu preskočiť. Komunikačný protokol Diffie-Hellman 7.5 DOHODNUTIE SA NA SPOLOČNOM KĽÚČI 219 Východisková situácia: odosielateľ a príjemca sa otvorene dohodnú na dvoch veľkých prirodzených číslach cap, pričom p je prvočíslo a platí, že c < p. Odosielateľ náhodne vygeneruje číslo aODO a toto číslo bude jeho tajný súkromný kľúč. Príjemca vygeneruje náhodne číslo aPRI a to bude tajný kľúč príjemcu, ktorý nik okrem neho nepozná. Spoločná úloha príjemcu a odosielateľa je po vzájomnej komunikácii vypočítať nový kľúč, ktorý bude ich spoločným tajomstvom a ktorý obaja použijú pri symetrickom šifrovaní. Postup CN 1. Odosielateľ vypočíta Kryptotext 1 = ca°DO mod p a pošle číslo kryptotext 1 príjemcovi. 2. Príjemca vypočíta Kryptotext 2 = capRI mod p a pošle kryptotext 2 odosielateľovi. 3. Odosielateľ vypočíta S a = (kryptotext 2)a°DO mod p a Sa považuje za nový spoločný kľúč. 4. Príjemca vypočíta S b = (kryptotext l)a«« m0(j p a Sb považuje za nový spoločný kľúč. Jadrom úspechu je, že platí Sa = Sb- Neuvedieme presné matematické zdôvodnenie. Vidíme ale, že Sa nie je nič iné, než c zašifrované najprv s dpRi a potom s oodo- Kľúč Sb je tiež zašifrované c najprv s clodo a potom s aPRI. Teda sú oba Sa aj S b zašifrované s aODO a s aPRI, len v opačnom poradí. To je také, ako keď v jednom prípade truhlicu zamkneme najprv ľavým a potom pravým zámkom a v druhom prípade najprv pravým a potom ľavým zámkom. Je očividné, že v prípade truhlice je výsledok rovnaký. Matematická funkcia ca mod p tu bola zvolená preto, aby ani poradie použitia súkromných kľúčov clodo a a p m nehralo úlohu. 220 KAPITOLA 7 Ak sú odosielateľov i príjemcov kľúč uchované v tajnosti, tak je spôsob šifrovania Diffie-Hellmana podľa našich doterajších kritérií bezpečný8. Práve pri pojme bezpečnosť musíme byť ale opatrnejší. Jasne sme sformulovali, čo považujeme za bezpečný kryptosystém v prípade posielania správy spôsobom CAESAR alebo DES. Pri komunikačných protokoloch, ktoré využívajú viacnásobnú výmenu informácií, sa musíme ešte raz zamyslieť nad pojmom bezpečnosť. Doteraz sme uvažovali pasívneho protivníka (kryptoanalytika). Mohol načúvať, dozvedieť sa kryptotext a potom sa pokúšať rozlúsknuť ho. Voči takémuto pasívnemu protivníkovi je naša výmena kľúčov bezpečná. Ale všetko je inak, keď máme do činenia s aktívnym protivníkom, ktorý sa nazýva aktívny preto, lebo vstupuje do komunikácie. Predstavte si nasledujúci scenár. Protivník prehovorí posla, aby truhlicu doniesol jemu namiesto príjemcovi. Alebo preruší vedenie tak, že kryptotext 1 sa dostane iba k nemu a nie k príjemcovi. Potom protivník zamkne truhlicu svojím zámkom a pošle ju naspäť odosielateľovi. Ten nevie, že namiesto pravého príjemcu komunikuje s protivníkom, otvorí svoj zámok a pošle príjemcovi truhlicu, zamknutú zámkom protivníka. Nespoľahlivý posol ju ale znovu zanesie protivníkovi, ktorý si ju odomkne a získa tajomstvo. Odosielateľ pri tom nemá najmenšie podozrenie, že tajomstvo je prezradené. Vidíme, že náš protokol ešte nie je vôbec perfektný, ale potrebuje ďalšie vylepšenia. Či sa vieme vysporiadať aj s aktívnym protivníkom bude témou v nasledujúcom odseku. V 7.6 Kryptosystémy s verejnými kľúčmi Najprv vymenujeme slabé miesta doteraz predstavených symetrických kryp-tosystémov. (i) Symetrické kryptosystémy vyžadujú počiatočnú bezpečnú výmenu kľúčov. Voči aktívnemu protivníkovi ju nevieme spoľahlivo zabezpečiť. (ii) V praxi sa do komunikácie často zapája veľa účastníkov. Informácie od mnohých sa zbierajú v centrále. Ak majú všetci rovnaký kľúč, stačí jediný zradca, a celý systém je odhalený. Keď má každý z nich vlastný kľúč, treba viesť administratívu o mnohých kľúčoch a navyše pri posielaní správy odosielateľ musí vydať napospas svoju identitu. 3Nie je známy efektívny algoritmus, ktorým by sa dal vypočítať Sa = Sb z daných dvoch kryptotextov a z c a p bez toho aby sme poznali kľúč odosielateľa alebo príjemcu. 7.6 KRYPTOSYSTÉMY S VEREJNÝMI KĽÚČMI 221 (iii) Mnohé komunikačné úlohy sa nedajú realizovať symetrickými kryp-tosystémami. Pri elektronických voľbách sa chceme preukázať ako právoplatný volič, ale pri samotnom hlasovaní sa nechceme vzdať anonymity. Potrebujeme protokoly, ktorými môžeme preukázať kontrole našu právomoc (tým, že vlastníme nejaké tajomstvo, napríklad doklad totožnosti, alebo heslo) bez toho, aby sme odhalili čo i len jeden bit tohto tajomstva. Tieto a iné príčiny si vyžiadali ďalší intenzívny výskum v kryptografii. Pri hľadaní riešenia nám opäť pomohli algoritmika a teória zložitosti, pričom sme našu slabinu, totiž neschopnosť riešiť ťažké problémy, premenili na na našu kryptografickú silnú stránku. Hlavná myšlienka je založená na existencii takzvaných jednosmerných funkcií, spomedzi ktorých máme niekoľko kandidátov, ktorí prichádzajú do úvahy. Ako jednosmernú funkciu označujeme funkciu / s nasledujúcimi vlastnosťami: (i) Funkcia / sa dá efektívne vypočítať, teda sa dá použiť na efektívny spôsob šifrovania. (ii) Inverzná funkcia ktorá z hodnoty f (x) vypočíta spätne argument x (/^(/(rr)) = x) sa nedá efektívne vypočítať; teda neexistuje efektívny (randomizovaný) algoritmus, ktorým z daného kryptotextu = /(otvorený text), vypočítame argument otvorený text. Takže je na základe našej definície f (x) kryptotext bezpečný. (iii) Pre príjemcu ale musí existovať možnosť, ako z f (x) efektívne vypočíta x. Teda o funkcii / musí existovať nejaké tajomstvo (niečo podobné ako bol svedok pri randomizovaných algoritmoch), na základe ktorého sa z f (x) dá x rýchlo určiť. Čo nám pomôže hypotetická jednosmerná funkcia /? Príjemca pozná o / určité tajomstvo, o ktoré sa nemusí počas komunikácie s nikým deliť (obr. 7.8). Funkcia /, a tým aj spôsob šifrovania môžu byť verejne známe a k dispozícii každému potenciálnemu odosielateľovi. Preto nazývame kryp-tosystémy, ktoré využívajú jednosmerné funkcie kryptosystémy s verejným kľúčom (Public-Key-Cryptosystem). Je zrejmé, že pri tomto spôsobe odpadne problém s výmenou tajných kľúčov, lebo nepotrebujeme mať spoločné tajomstvo. Týmto sme odstránili slabé miesta (i) a (ii) symetrických kryptosystémov. Navyše kryptosystémy s verejným kľúčom spĺňajú aj želanie (iii), ale detailné vysvetlenie tejto skutočnosti presahuje rámec tejto knihy. Zatiaľ všetko sedí. Keď sa nám podarí nájsť jednosmerné funkcie, dosiahneme vytúžený cieľ. Existujú ale vôbec? Nevyzerajú tri požiadavky na také- 222 KAPITOLA 7 to funkcie prepiate a neprirodzené? V nasledujúcom príklade sa vás pokúsim presvedčiť, že náš nápad nie je vôbec scestný. odosielate! odosielate!^ odosielatel'3 jediný pozná tajomstvo / odosielatel'4 odosielatelf obr. 7.8 Uvažujme nasledujúci spôsob šifrovania. Každé písmeno jednoznačne nahradíme postupnosťou 14 desiatkových cifier. Pre každé písmeno vyberieme náhodne z nejakého telefónneho zoznamu meno začínajúce týmto písmenom a do kryp-totextu zapíšeme zodpovedajúce telefónne číslo. V prípade, že číslo má menej ako 14 cifier, doplníme ho na začiatku príslušným počtom núl. Podľa tohto návodu dostaneme pre slovo KRYPTOGRAFIA napríklad: K R Y P T 0 A F 1 A meno telefónne číslo ►Knuth Rivest Yao Papadimitriou Thomas Ogden Good Rabin Adleman Floyd Ibarra Aho 00128143752946 00173411020745 00127345912233 00372453008122 00492417738429 00012739226541 00015402316555 00048327450028 00173555248001 00013782442358 00124327010098 00183274553211 Predpokladajme, že okrem prijímateľa správy majú všetci len klasické telefónne zoznamy, ktoré sú abecedne usporiadané podľa priezvísk. S pomocou takýchto zoznamov by bolo veľmi náročné zistiť k jednotlivým tele- 7.6 KRYPTOSYSTÉMY S VEREJNÝMI KĽÚČMI 223 fónnym číslam v kryptotexte príslušné priezviská. Prijímate! správy má k dispozícii celosvetový telefónny zoznam, utriedený podľa telefónnych čísiel, vďaka ktorému vie kryptotext efektívne rozšifrovat'. Iné riešenie, ktoré príde na um často ako prvé, je zavolať na každé číslo. Okrem toho že tento spôsob vyžaduje finančné náklady, nemáme nijakú istotu, že zistíme skutočné meno majiteľa telefónnej prípojky. Tento príklad ilustruje len myšlienku. Uvedený spôsob nechceme považovať za ozajstný kryptosystém, pretože pre počítač nieje usporiadanie telefónneho zoznamu podľa čísiel nijako ťažká úloha. Ako jednosmernú funkciu budeme potrebovať inú operáciu. Akých kandidátov na jednosmerné funkcie máme v praxi? Predstavíme najprv tri funkcie, ktoré spĺňajú podmienky (i) a (ii). 1. Násobenie Hocikto vie poľahky vynásobiť dve prvočísla p a g, f (p, q) = p ■ q. Vypočítať ale z f (p, q) naspäť hodnoty p a g je ťažká úloha, na riešenie ktorej existujú len exponenciálne algoritmy. 2. Modulárna druhá mocnina Je ľahké vypočítať funkciu /n(rr) = x2 mod n. Umocníme x na druhú, dostaneme x2, to vydělíme n a určíme zvyšok po delení, x2 mod n. V prípade keď n nie je prvočíslo, je algoritmicky ťažké určiť hodnotu x na základe známych hodnôt fn{x) a n. 3. Modulárně umocňovanie Pre známe čísla e a n a otvorený text c (považujeme ho za číslo) ľahko vypočítame číslo a = ď mod n. Keď n nie je prvočíslo, je algoritmicky ťažké spätne určiť otvorený text c zo známych hodnôt a, e a n. Zdôvodnenie, že kryptosystémy s verejným kľúčom pracujú korektne, vyžaduje určité vedomosti z teórie čísiel, ktoré nebudeme uvádzať. Z tohto dôvodu objasníme iba ako vytvoríme jednoduchý kryptosystém s verejným kľúčom založený na modulárnej druhej mocnine. Tento kryptosystém objavil Michael O. Rabin, preto ho nazveme RABÍN. Vytvorenie kryptosystému RABIN: Príjemca vygeneruje náhodne dve veľké prvočísla p a q, každé približne 500 ciferné. Tieto dve prvočísla sú jeho tajomstvo. Potom príjemca vypočíta číslo n = p ■ q 224 KAPITOLA 7 a zverejní ho spolu s funkciou fn(x) = x2 mod n. Takto môže hocikto zašifrovať otvorený text x vypočítaním fn(x) = x2 mod n a kryptotext fn{x) poslať príjemcovi. Spôsob činnosti kryptosystému RABÍN: Odosielatelia otvorené texty x zašifrujú ako fn{x) = x2 mod n a pošlú príjemcovi. Bez toho, aby sme poznali p a q nie je známy efektívny algoritmus, ktorý vypočíta na základe n a fn(x) otvorený text x. Príjemca určí x na základe svojho tajomstva, hodnôt p a q. Hlavná myšlienka je takáto: pre ľubovoľné prvočíslo p sa dá efektívne vypočítať x ako odmocnina z fp(x). Využitím teórie čísiel príjemca vie určiť odmocninu fn{x) modulo p a a j modulo q. Z týchto dvoch odmocnín vie určiť aj otvorený text x ako odmocninu fn{x) modulo n = p ■ q. Príklad 7.1 Pretože nechceme narábať s číslami, ktoré majú niekoľko sto desiatkových cifier, na znázornenie spôsobu vytvorenia kryptosystému RABÍN použijeme len malé prvočísla p = 107 a q = 73. Príjemca vypočíta n = p ■ q = 107 • 73 = 7811 a zverejní číslo n = 7811 a spôsob šifrovania x2 mod 7811 Hocikto ho môže použiť a kladné celé čísla menšie než 7811 ako otvorené texty premeniť na kryptotext, ktorý pošle príjemcovi. Uvažujme, že odosielateľ chce poslať otvorený text x = 6204. Vypočíta x2 mod n = (6204)2 mod 7811 = 38489616 mod 7811 = 4819 {lebo 38489616 = 7811 • 4927 + 4819 } Takže kryptotext je 4819. Pretože stále počítame modulo n, je kryptotext vždy menší než n. Ktoré čísla z {1,2,...,7811} umocnené na druhú modulo n = 7811 dajú číslo 4819? Bez toho aby sme poznali faktorizáciu 7811 = 107 • 73, nevieme lepší spôsob ako vyskúšať skoro všetkých 7811 kandidátov. V prípade čísiel n, ktorých veľkosť je až 101000 je takýto postup ale fyzikálne nerealizovateľný. Keď poznáme prvočinitele n, vieme efektívne určiť všteky celé čísla y, pre ktoré rovnice y2 mod n = kryptotext. 7.6 KRYPTOSYSTÉMY S VEREJNÝMI KĽÚČMI 225 Môžu existovať najviac štyri také hodnoty y. Ktorý z nich je otvorený text, určíme podľa významu. Alebo požiadame Alicu aby nám poslala navyše ešte jeden bit obsahujúci špeciálnu číselno teoretickú informáciu. □ Úloha 7.11 Vytvorte zodpovedajúci kryptosystém RABÍN pre prvočísla 13 a 17. Určite kryptotext k otvorenému textu 100. Nájdite všetky y z {1, 2,..., 13 • 17} s vlastnosťou y2 mod 13 • 17 = kryptotext Pretože nechceme ísť hlbšie do teórie čísiel, nepokúšame sa ani ukázať, ako vie príjemca, vďaka svojmu tajomstvu - rozkladu čísla n - efektívne vypočítať otvorený text. Je ale dôležité povedať, že nemáme matematické dôkazy o tom, že predkladaní kandidáti na jednosmerné funkcie sú naozaj jednosmerné funkcie. Súvisí to s nám už známym problémom, že nie sme schopní dokázať dolné odhady zložitosti konkrétnych problémov. A tak sú všetky systémy s verejným kľúčom založené len na skúsenosti, že sa doteraz nikomu nepodarilo nájsť efektívny algoritmus na výpočet inverznej funkcie teda ani na dešifrovanie. Pre predstavený kryptosystém RABÍN vieme, že jeho prelomenie je rovnako ťažké ako rozklad daného čísla na prvočinitele. Presnejšie sformulované, keď vieme efektívne prelomiť kryptosystém RABÍN, vieme aj efektívne rozkladať na prvočísla. A aj naopak platí, že ak existuje efektívny spôsob rozkladu na prvočinitele, potom je možné RABÍN efektívne prelomiť. Voľba veľkosti prvočísiel p a q v kryptosystéme RABÍN s niekoľko sto desiatkovými ciframi je potvrdená praxou, lebo ani najlepšie algoritmy na rozklad na prvočinitele bežiace na najrýchlejších súčasných počítačoch nevypočítajú p a q pre zadané n = p ■ q ani za miliardy rokov. Preto sa ich veľkosť zväčšuje ako sa zvyšuje rýchlosť počítačov. V čom sú prednosti systémov s verejným kľúčom? Pokúsime sa o zhrnutie: (i) Máme iba jedno tajomstvo, ktoré je u príjemcu. Nemusí sa oň s nikým deliť, a preto sa ho nemôže ani nik od niekoho iného dozvedieť. Príjemca si ho môže sám vytvoriť. (ii) Spôsob šifrovania sa uverejní. To je jediná komunikácia pred použitím kryptosystému s verejným kľúčom a táto komunikácia nevyžaduje šifrovanie. Po zverejnení spôsobu šifrovania môže príjemcovi poslať hocikto šifrovanú správu. Okrem uvedených dvoch hlavných výhod kryptosystémov s verejným kľúčom môžeme objaviť veľa ďalších výhod, keď ich chceme použiť na bezpečnú komunikáciu tam, kde sa nedajú použiť symetrické kryptosystémy. Na ilustráciu ukážeme jednoduchý komunikačný protokol pre digitálny (elektronický) 226 KAPITOLA 7 podpis. Po právnej stránke je vlastnoručný podpis druh záruky pravosti. V digitálnej komunikácii (napríklad pri elektronickom prevode peňazí) nemôžeme poskytnúť vlastnoručný podpis. Okrem toho by sme chceli, aby bol podpis voči falšovaniu bezpečnejší ako vlastnoručný podpis. Sformulujme presne naše požiadavky na komunikačný protokol, ktorý chceme vytvoriť. Zákazník Z chce banke B preukázať záruku pravosti prevodného príkazu z jeho účtu, alebo podpísať nejaký iný dokument. Pritom požadujeme nasledujúce: (i) Banka B musí byť presvedčená o pravosti podpisu Z. Aj B, aj Z musia byť chránení pred treťou stranou (falšovateľom), ktorá sa chce pred B vydávať za Z. (ii) Z musí byť uchránený pred takými aktivitami B, pri ktorých B tvrdí, že má dokument podpísaný Z, hoci Z ho nepodpísal (B sa nesmie naučiť falšovať podpis Z) (iii) V prípade, že Z podpísal dokument u, má B možnosť presvedčiť hocikoho tretieho, že dokument u naozaj podpísal Z. Požiadavku (i) dokážeme splniť aj symetrickým kryptosystémom. Ale žiaden symetrický kryptosystém nemôže zaručiť súčasné splnenie podmienok (i) a (ÍÍ)' í> Úloha 7.12 Vytvorte komunikačný protokol pre digitálny podpis, založený na klasickom kryptosystéme, ktorý zaručí splnenie požiadavky (i). Vlastnosť (ii) dokážeme splniť ťažšie než (i), lebo na prvý pohľad sa javí proti našej intuícii. Najednej strane, podmienka (i), by sa B mala presvedčiť o pravosti podpisu Z, teda očakávame, že bude vedieť niečo o spôsobe podpisovania, aby mohla podpis overiť. Na druhej strane, podmienka (ii), B nesmie o tom, ako sa Z podpisuje, vedieť priveľa, aby ho nevedela napodobniť. Napriek tomu vytvoríme na základe konceptu verejného kľúča protokol spĺňajúci všetky tri požiadavky (i), (ii) a (iii). Vytvorenie protokolu Zákazník Z má kryptosystém s verejným kľúčom, pričom jeho verejná šifrovacia funkcia je Sifz a tajná dešifrovacia funkcia Dešz- Kryptosystém je komu-tatívny, teda pre ľubovoľný otvorený text platí 7.6 KRYPTOSYSTÉMY S VEREJNÝMI KĽÚČMI 227 Dešz(Šifz(otvorený text)) = otvorený text = Šifz(Dešz(otvorený text)) To znamená, že môžeme nielen najprv použiť na šifrovanie Šifz(otvorený text) a potom na dešifrovanie Dešz(Šifz(otvorený text)), ale na šifrovanie môžeme použiť najprv aj Dešz (otvorený text) a potom na dešifrovanie Šifz(Dešz(otvorený text)) = otvorený text. Banka pozná verejnú šifrovaciu funkciu Šifz. Komunikačný protokol Vstup: Dokument u, ktorý má Z podpísať. O} Postup: 1. Z vezme dokument u a vypočíta Dešz(w). Potom Z pošle banke B dvojicu (u, Dešz H) 2. Použitím verejnej šifrovacej funkcie Sifz na prijatý podpísaný dokument Dešz(w) banka B vypočíta Šifz(Dešz(w)) a porovnaním u = Šifz(DešzH) overí pravosť podpisu. Splnenie podmienok korektnosti (i) Nik iný okrem Z nevie efektívne vypočítať správu Dešz(w) (podpísaný dokument u). Takže B je presvedčený o pravosti podpísaného dokumentu. (ii) To že B pozná u a Dešz(w) jej nepomôže podpísať iný dokument u' ako Dešz C"')> lebo B nevie efektívne vypočítať funkciu Dešz. (iii) Vďaka tomu, že spôsob šifrovania Šifz je verejne známy, môže banka B hocikomu, kto má o to záujem, ukázať dvojicu (w,Dešz(w)) a ten si môže overiť platnosť podpisu vykonaním výpočtu Šifz(DešzH) u Toto elegantné riešenie problému digitálneho podpisu môže pôsobiť ozaj magicky. No to je iba začiatok mnohých ďalších zázračných protokolov, ktoré neočakávane riešia rôzne komunikačné úlohy. Odôvodnenie ich správnosti vyžaduje hlbšie vedomosti z algebry, teórie čísiel a algoritmiky, preto sa musíme, žiaľ, zriecť ich prezentácie. Sú to jedny z najkrajších príkladov 228 KAPITOLA 7 vysokej a fascinujúcej užitočnosti „suchých" výsledkov matematiky, ktorým sa často v našom školstve bohužiaľ nevenuje patričná pozornosť. Úloha 7.13 V predstavenom protokole sa neudržiava dokument u v tajnosti, lebo sa prenáša nešifrovaný. Každý, kto načúva komunikácii, sa môže dozvedieť, čo je v u. Zmeňme teraz požiadavku (iii) takto: (iii') Nik tretí, kto načúva komunikácii medzi B a Z, nesmie zistiť obsah podpísaného dokumentu. Navrhnite komunikačný protokol, ktorý spĺňa všetky tri požiadavky (i), (ii) aj (iii'). Úloha 7.14 (tvrdý oriešok) Všimnime si problém autentifikácie. Tu netreba podpisovať žiaden dokument, ale musíme presvedčiť niekoho o našej identite. Požiadavky na protokol pre autentifikáciu sú nasledujúce: (i') rovnaká ako (i), v zmysle, že B sa presvedčila o identite Z. (ii') Z musí byť chránený, pred aktivitami, v ktorých by B chcela pred niekým tretím vystupovať ako Z. Predstavený protokol nie je vhodný na autentifikáciu. B sa počas digitálnej komunikácie dozvie podpis9 (u, Dešz(^)) a v komunikácii s tretím sa ním môže preukazovať ako Z. Navrhnite komunikačný protokol, ktorý spĺňa (i') a (ii'). Casť o kryptosystémoch s verejným kľúčom zakončíme niekoľkými poznámkami. Keď sa teraz niekomu vidí, že kryptosystémy s verejným kľúčom sú len pre jednostranú komunikáciu mnohých odosielateľov jedinému príjemcovi, neuvedomuje si ešte všetky možnosti. Môže komunikovať každý s každým. Každý, kto chce komunikovať si vygeneruje svoje vlastné tajomstvo (napr. p a g) a zverejní vo verejnom telefónnom zozname zodpovedajúcu šifrovaciu funkciu (napr. n = p ■ q). Ak chceme niekomu súkromne napísať, použijeme na zašifrovanie otvoreného textu príslušnú verejnú šifrovaciu funkciu príjemcu. Kryptosystémy s verejným kľúčom nepredčia vo všetkých parametroch symetrické kryptosystémy. Klasické kryptosystémy, akým je DES, majú jednu podstatnú výhodu, že sú vďaka hardvérovej realizácii často stovky krát rýchlejšie ako kryptosystémy s verejným kľúčom. To sa pri veľkých objemoch dát už významne prejaví. V praxi to vedie k tomu, že kryptosystém s verejným kľúčom sa použije iba na výmenu kľúča pre symetrický kryptosystém, ktorý sa využíva pri ďalšej komunikácii10 na prenos všetkých ostatných údajov. 9 preukaz 10to znamená na väčšinu komunikácie. 7.7 MÍĽNIKY V KRYPTOGRAFII 229 7.7 Míľniky našich objavov - cesta krajinou zázrakov kryptografie r—M Kryptografia sa zaoberá tvorbou kryptosystémov umožňujúcich bezpečnú výmenu tajných informácií. Pôvodne sa pestovala kryptografia ako umenie vytvárania tajných písiem. Komunikujúci (odosielateľ a príjemca) a ich protivníci (kryptoanalytici) hrali navzájom duchaplnú hru. Jedna strana vymyslela šifrovanie založené na rôznych trikoch a druhá strana sa ich snažila nájsť a odhaliť a prelomiť tým daný kryptosystém. Pojem bezpečnosti sa pri tejto hre vtipných nápadov nedal vôbec sformulovať. Auguste Kerckhoffs vypracoval prvé požiadavky na bezpečnosť kryptosys-tému založené na tom, že spoľahlivosť kryptosystému závisí len na utajení kľúča (a nie na utajení spôsobu šifrovania). To viedlo sprvu k predstave, že na zaručenie bezpečnosti je nevyhnutný a postačujúci veľký počet kľúčov. Je to dosť zrejmá požiadavka, ale rýchlo sa ukázalo, že bezpečnosť kryptosystému nezaručí ani veľký počet kľúčov. Na fundovanú definíciu bezpečnosti sme museli čakať až pokým sa nezačali vytvárať pojmy v informatike akými sú algoritmus, výpočtová zložitosť a tým aj efektívna (praktická) riešiteľnosť. Potom informatika definovala bezpečnosť kryptosystému ako neexistenciu efektívneho algoritmu, ktorý by umožnil dešifrovať správu bez toho, aby poznal kľúč. Od tohto okamihu sa začínajú moderné dejiny kryptológie ako vednej disciplíny na hranici informatiky, matematiky a čoraz viac aj fyziky11. Klasické kryptosystémy sa vyznačujú tým, že kľúč určuje spôsob šifrovania a rovnako aj spôsob dešifrovania, tým predstavuje spoločné tajomstvo príjemcu a odosielateľa. Hlavným problémom je zhodnúť sa na jednom spoločnom kľúči skôr ako máme k dispozícii bezpečný kryptosystém. Ukázali sme si, že vieme vytvoriť komunikačný protokol, na výmenu kľúča, ktorý je ale bezpečný len voči pasívnemu protivníkovi. Tajomstvo sa prezradí v prípade, keď sa protivník vie zapojiť do komunikačnej linky a vydávať sa za príjemcu. Východisko z tejto situácie prinieslo skonštruovanie kryptosystému s verejným kľúčom. Hlavná myšlienka vychádza z teórie zložitosti a takzvaných jednosmerných funkcií. Jednosmerná funkcia sa dá efektívne vypočítať, ale zodpovedajúca inverzná funkcia nie, pokiaľ nemáme nejakú dodatočnú vedomosť (a tú má ako jediný iba príjemca). Tajná dodatočná vedomosť hrá 11 kvôli kvantovým efektom používaným v kryptografii. Viac o tejto téme prezentujeme v kapitole 9. 230 KAPITOLA 7 podobnú úlohu ako svedkovia pri vytváraní efektívnych randomizovaných algoritmov. Samotná jednosmerná funkcia je zverejnená a používa sa na šifrovanie dokumentov. Tajnú vedomosť má len príjemca, ktorý s jej využitím vie pomocou inverznej funkcie efektívne dešifrovať kryptotexty. Pretože je ťažké dokázať dolný odhad výpočtovej zložitosti konkrétnych algoritmických úloh, nik zatiaľ matematicky nedokázal, že nejaká konkrétna funkcia je jednosmerná. Vyskúšaní a v praxi používaní kandidáti na jednosmerné funkcie sú násobenie, ktorého inverzná funkcia je faktorizácia a umocňovanie (na druhú) modulo prirodzené číslo n, ktorého inverzná funkcia je počítanie zodpovedajúcej modulárnej odmocniny. Vďaka kryptosystémom s verejným kľúčom sú tu dnešné aplikácie v oblasti e-komercie, ktoré by so symetrickým spôsobom šifrovania neboli možné. Ďalší vývoj sa uberá smerom k elektronickým voľbám a mnohým iným aplikáciám. Koncept kryptosystémov bol prvý raz predstavený v roku 1976 dvojicou Diŕfie a Hellman [DH76]. Najrozšírenejší systém je RSA kryptosystém, ktorý vymysleli v roku 1978 Rivest, Shamir a Adleman [RSA78]. Podobne ako v mnohých iných prípadoch trvalo približne 20 rokov, kým sa tento neuveriteľný poznatok základného výskumu dočkal širokého komerčného využitia. Ako úvod do kryptografie doporučujeme knihy [Beu02a, Beu02b]. Záujemcom o hlbšie vedomosti doporučujeme knihy Salomaa [Sal96], Delfs und Knebl [DK02] a [Hro04c]. a) Máme: 00110011 -L 00101101 11100001 -L 00101101 00110011 b) Tento spôsob funguje, pretože platí a teda dvojnásobnou aplikáciou kľúča na otvorený text dostaneme opäť ten istý otvorený text. Návody na riešenie vybraných úloh Úloha 7.5 (a _L c) _L c = a 7.7 MÍĽNIKY V KRYPTOGRAFII 231 c) Výsledok operácie _L je vždy obrátením výsledku operácie ffi. Keď platí a ffi b = 1, potom platí a _L b = 0 a v prípade, že platí a ffi b = 0, platí aj, že ol6 = l. Úloha 7.6 Osoba A vygeneruje náhodne postupnosť bitov aia2...an. Zašifruje otvorený text k\k2 ■ ■ ■ kn vypočítaním k\ ... kn © a±... an = d\d2 ... dn. Potom A znova vygeneruje n bitov b\b2 .. .bn a vypočíta a±a2 ... an © b\b2 ...bn . c\c2 ...cn Potom A pošle kľúč b\b2.. .bn a kryptotext d\d2... dn osobe B a kľúč c\c2 ... cn a kryptotext d\d2 ... dn osobe C. Pretože je postupnosť bitov bib2 ... bn zvolená náhodne, ani B ani C nemôžu určiť kľúč a±a2 ... an, s ktorým bol zašifrovaný otvorený text k\k2 ... kn. Bez toho aby poznali kľúč a\a2...an nie je možné dešifrovať kryptotext did2...dn. Ak ale B a C vzájomne spolupracujú, dokážu kľúč a\a2 ... an vypočítať nasledovne b\b2 ...bn © CjC2 ...Cn ■ a±a2 ...an Keď majú pôvodný kľúč a\a2 ... an, vedia spočítať otvorený text k\k2,... kn = d±d2 ... dn © a\a2 ... an. Ir J 6 J Vedecké objavy sa robia takto: Všetci vedia, že sa niečo nedá urobiť. Potom príde niekto, kto to nevie a objaví to. Albert Einstein Kapitola 8 Počítanie s DNA molekulami, alebo biopočítačová technológia na obzore Mnohé science fiction romány sa začínajú zmesou obsahujúcou biologické a elektronické prísady alebo spájajú ľudský mozog s počítačovými komponentmi a na konci je z toho inteligentný biorobot. Téma tejto kapitoly je vzdialená od takýchto utopických predstáv a nerealistických proroctiev niektorých vedcov v oblasti umelej inteligencie zo šesťdesiatych rokov. Predstavíme už existujúcu technológiu biopočítačov, ktorá nie je len hypotetická. Či sa ona presadí v praxi závisí od toho sko pokročiv ďalší rozvoj biochemických metód na výskum DNA sekvencií. Ako takéto biopočítače vyzerajú? Ako sme sa dostali k realistickej biologickej počítačovej technológii? Naša skúsenosť s počítačmi za posledných päťdesiat rokov ukazuje, že sú každé dva roky dvakrát menšie a súčasne dvakrát rýchlejšie ako predtým. Exponenciálne zlepšenie v čase. Takto to nemôže pokrčovať 8.1 Ako to bolo doteraz 234 KAPITOLA 8 a obr. 8.1 2j obr. 8.2 donekonečna, elektronické technológie čoskoro dosiahnu hranice miniaturizá-cie, čím sa definitívne skončí rýchly rast výkonu počítačov. Fyzikálne hranice výkonu počítačov sa spočítali už veľmi dávno, a už v roku 1959 sa známy fyzik Richard Feyman pýtal „Ako to pôjde ďalej? Môžeme miniaturizovat tým, že realizujeme výpočtové procesy na úrovni molekúl a častíc?" Výsledkami týchto úvah sú DNA-počítač a kvantový počítač, ktoré predstavíme v tejto a nasledujúcej kapitole. Teraz rozumieme, že potreba miniaturizácie a s ňou spojený nárast výkonu viedol k želaniu počítať na úrovni molekúl a atómov. Je ale toto želanie 8.1 AKO TO BOLO DOTERAZ 235 realizovateľné? Nie je to neprirodzená myšlienka? Máme nútiť molekuly robiť niečo, na čo vôbec neboli určené? Prv ako odpovieme na tieto otázky, zamyslime sa nad tým čo je prirodzené, a čo neprirodzené. V našom umelom svete matematických modelov skutočnosti pracujeme so symbolmi. Všetky čísla, alebo iné údaje sú zapísané ako texty, teda postupnosti symbolov. Už sme sa naučili, že prácu počítača si môžeme vo všeobecnosti predstaviť ako transformovanie vstupných textov (údajov) na výstupné texty (údaje). Ako je to s DNA sekvenciami? Vieme, že sú nositeľmi biologických informácií a že všetky procesy v živých organizmoch sú riadené informáciami uloženými v DNA sekvenciách. V súčasnosti rozumieme len malému zlomku tohto riadenia, ale vôbec nepochybujeme, že na biologické procesy môžeme nazerať aj ako na spracovávanie informácií. Napriek tomu nie sme dostatočne ďaleko v chápaní týchto procesov, aby sme ich vedeli využiť na počítanie. Hlavná myšlienka DNA počítača je oveľa jednoduchšia. DNA sekvencie si môžeme predstaviť ako texty zostavené z písmen A, C, G a T. Štyri písmená predstavujú bázy Adenin (A), Cytosin (C), Guanin (G) a Thymin (T), z ktorých je zložený DNA kód. Typicky sa DNA vyskytuje ako molekula v tvare dvojitého reťazca (obr. 8.1 a obr. 8.2), pričom väzby vznikajú len medzi A a T a medzi G a C. Chemické väzby A — TaG — C sú podstatne slabšie než ostatné väzby v reťazci na obr. 8.1. Dôležité je, že do určitej miery vieme regulovať molekulárnu stabilitu DNA. Naše údaje si môžeme predstaviť ako texty zložené so symbolov A, C, G a T a zo zodpovedajúcej symbolickej DNA sekvencie k nim vytvoriť fyzickú reprezentáciu. S údajmi reprezentovanými týmto spôsobom môžeme vykonávať v reagenčných nádobách v laboratóriu biochemické operácie, ktorými DNA sekvencie meníme. Vytvorené DNA sekvencie na konci prečítame a interpretujeme ako výsledok. /—v Na počudovanie sa dá matematicky dokázať, že takéto DNA počítače sú schopné urobiť presne to isté ako klasické elektronické počítače. To znamená, že naše chápanie algoritmickej riešiteľnosti sa ani trochu nespochybnilo. Čo dokážeme vyriešiť algoritmicky (automaticky na počítači), to vieme urobiť aj s DNA algoritmami a platí to aj opačne. Čo máme z toho keď namiesto elektronického počítača použijeme DNA počítač? Kvapka vody obsahuje 1019 molekúl. Keď máme v reagenčnej miske 1021 DNA sekvencií, všetky operácie sa vykonajú súčasne (paralelne) na všetkých 1021 molekulách. Na bežnom počítači nikdy nevykonáte súčasne operáciu s 1021 údajmi. Tadiaľ vedie cesta k ďalšiemu želanému urýchleniu výpočtových procesov. Preto sme dnes azda na začiatku produktívnej konkurencie dvoch rôznych počítačových technológií. Táto predstava je zobrazená obrázkoch (obr. 8.3, 236 KAPITOLA 8 obr. 8.3 óbr. 8.4 obr. 8.4 a obr. 8.5) v knihe „DNA-Computing", ktorú napísali Päun, Rozen-berg a Salomaa. Na obr. 8.3 vidíme dnes vedúcu a najrozšírenejšiu technológiu klasických elektronických počítačov. Obr. 8.4 predstavuje DNA-Computing, pri ktorom sa vykonávajú biochemické operácie v reagenčných nádobách v laboratóriu. Co vznikne z tejto konkurencie? Možno rozumná zmes elektroniky a biomasy. Namiesto toho, aby sa chemické operácie vykonávali ručne, môže ich realizovať elektronický robot ako na obr. 8.5. V tejto kapitole ukážeme v odseku 8.2 zoznam realizovateľných biochemických operácií, ktoré postačujú na to, aby sme mohli vykonať ľubovoľný 8.2 AKO ZMENÍME LABORATÓRIUM NA BIOPOČÍTAČ 237 obr. 8.5 výpočet. Potom prezentujeme známy experiment Adlemana1, ktorý ako prvý vytvoril „biopočítač" a vo svojom laboratóriu na ňom na začiatku deväťdesiatych rokov vyriešil konkrétny prípad optimalizačnej úlohy obchodného cestujúceho. Nakoniec všetko zhrnieme a prediskutujeme silné a slabé stránky technológie DNA počítačov a objasníme, za akých predpokladov ich môže čakať úspešná budúcnosť. Pri varení podľa receptu a pri modelovaní počítača sme sa v druhej kapitole naučili, že keď sa chceme dohodnúť na pojmoch „počítač" a „algoritmus", musíme zafixovať spôsob reprezentovania a pamätania si údajov a tiež určiť zoznam operácií s údajmi, pri ktorých nemáme pochybnosti ako ich vykonať. V modeli DNA počítača sú údaje DNA sekvencie ako molekuly v tvare dvojitého reťazca. Tieto dvojreťazcové molekuly sú fyzickým nosičom informácie. Samotné DNA molekuly môžeme uložiť v reagenčných nádobách. K dispozícii máme konečný počet reagenčných nádob. Aby sme mohli s obsahmi reagenčných nádob vykonať operácie, môžeme používať rôzne prístroje a potrebné predmety. Nemáme v úmysle podať Všimnite si, že je to ten istý Adleman, ktorý je jedným z troch vynálezcov známeho RSA kryptosystému. 238 KAPITOLA 8 TTCGGATG -> ÁÁGCČŤÁČ obr. 8.6 detailné vysvetlenie, ako a prečo sa dajú vykonať príslušné biochemické operácie, pretože nepredpokladáme rozsiahle predchádzajúce vedomosti z molekulárnej biológie. Na druhej strane chceme sprostredkovať aspoň predstavu o tom, z akých dôvodov sú možné určité chemické operácie. Preto si stručne zopakujeme niektoré základné vedomosti z biológie2. James D. Watson a Francis H. C. Crick v roku 1953 objavili, že DNA molekula ma štruktúru v tvare dvojitej závitnice (obr. 8.1, obr. 8.2). Nobelova cena, ktorú za to dostali, je len malým potvrdením skutočnosti, že to bol jeden z najvýznamnejších objavov dvadsiateho storočia. Fakt, že sa navzájom môžu spájať len bázy G s C a A s T, nazývame Watson-Cricková komplemen-tárnosť. Idealizovaná predstava3 DNA molekuly je dvojitý reťazec na obr. 8.6. Úloha 8.1 Nakreslite alebo doplňte kresbu molekúl DNA, ktorých vrchné reťazce sú AACGTAT, GCCACTA a AACG. Väzby v reťazci TTCGGATG sú približne desaťkrát silnejšie než chemické väzby medzi nukleotidmi A • • • T a G • • • C. Reťazce JGATG AAGCCTAC v dvojitom reťazci (obr. 8.6) majú svoj smer, Vrchný ide zľava doprava a spodný ide zprava doľava. Smer dostaneme, keď očíslujeme atómy uhlíka v cukre (Z na obr. 8.1), ktoré vytvárajú väzby s fosfátovými zvyškami (P na obr. 8.1) a s bázou (jednou z báz A, T, C alebo G na obr. 8.1). Je presne 5 uhlíkových atómov na jeden nukleotid4 a zjednodušene môžeme situáciu znázorniť ako na obr. 8.7. 2Podrobné predstavenie pre nebiológov môžeme nájsť v [BB03, PRS05]. 3Molekuly DNA majú zložitú trojrozmernú štruktúru, ktorá je podstatná z hľadiska ich funkčnosti. 4Nukleotid sa skladá z fosfátového zvyšku, jedného cukru a jednej zo štyroch báz A, C, G, T. 8.2 AKO ZMENÍME LABORATÓRIUM NA BIOPOCITAC 239 fosfátový zvyšok naľavo od Z-CH2 na Obr. 8.1 s \^ fosfátový zvyšok C- C-vpravo od Z na Obr. 8.1 •—3 báza (A, C, G, T) O obr. 8.7 Na obr. 8.7 je znázornená molekula cukru (Z na obr. 8.1). Päť atómov uhlíka C je očíslovaných ľ, 2', 3', 4' až 5'. Atóm ľ sa stará o väzbu k báze. Atóm uhlíka 3' zodpovedá za väzbu na fosfátový zvyšok v reťazci vpravo a uhlíkový atóm 5' tvorí väzbu s fosfátovým zvyškom v reťazci vľavo. Preto sa smer zľava doprava označuje v biológii ako smer 5' —► 3'. Pre nás je teraz dôležité vedieť len to, že zvýšením energie (napr. ohriatím) môžeme dosiahnuť rozpad väzieb medzi bázami A • • • T a C • • • G, ktoré sú podstatne slabšie než väzby v rámci jednotlivých reťazcov. Tak vieme rozdeliť dvojreťazcovú DNA molekulu na dve samostatné jednoreťaz-cové DNA molekuly. Za „vhodných" podmienok sa môže z dvoch samostatných reťazcov znova vytvoriť jedna dvojreťazcová molekula, ale iba, keď sú postupnosti báz Watson-Crick komplementárne. Ďalšou dôležitou vlastnosťou molekuly DNA je, že má záporný náboj, ktorého veľkosť je priamo úmerná dĺžke molekuly. Teraz už vieme dosť na to, aby sme si mohli predstaviť niektoré základné chemické operácie s obsahmi reagenčných misiek. Z týchto operácií potom môžeme zostavovať DNA-programy. Označme si reagenčné nádoby ako Ri, R2, R3 atd.5 (i) Uniony, i^Äfc) Obsahy reagenčných nádob Ri a R j daj do reagenčnéj nádoby Rk ■ 5 Podobne ako registre v počítači. 240 KAPITOLA 8 (ii) Amplify^) Znásob počet DNA-postupností v Ri. Tieto operácie sú založené na Watson-Crickovej komplementárnosti a nazývajú sa polymerázová reťazová reakcia. Táto metóda spôsobila revolúciu v molekulárnej biológii a Kary Mullis, ktorý ju v roku 1985 objavil, dostal za tento objav Nobelovu cenu. Dvojité DNA molekuly sa zahrievajú pokým sa nerozpoja väzby medzi bázami. Tým dostaneme z dvojitého reťazca dva jednoduché, bez toho, aby sa tieto porušili. Táto fáza sa nazýva denaturovanie. Potom sa do vzniknutej „DNA polievky" pridajú6 jednotlivé nukleotidy a všetko sa ochladí. Pritom sa nukleotidy naviažu na zodpovedajúce komplementárne bázy jednotlivých jednoduchých reťazcov a znovu sa vytvoria identické dvo-jreťazcové DNA-molekuly, čím sa ich počet zdvojnásobí. Celý proces sa niekoľkokrát opakuje. (iv) Length-Separate^,/) pre l e N. Táto operácia odstráni z Ri všetky DNA-sekvencie, ktoré nemajú dĺžku presne / báz Pri týchto operáciách sa využíva technika gélovej elektroforézy. Vieme, že keď umiestnime DNA-molekuly do elektrického poľa, budú sa vďaka ich zápornému náboju premiestňovať smerom ku kladnej elektróde. Veľkosť molekuly ju brzdí a znižuje jej rýchlosť. Zároveň čím má molekula väčší náboj, tým rýchlejšie sa pohybuje. Väčšie molekuly majú väčší náboj. Výsledkom je, že sa brzdiaci a zrýchľujúci faktor navzájom zrušia a všetky molekuly sa pohybujú ku kladnej elektróde rovnakou rýchlosťou. Preto pridáme do poľa gél, ktorý dodatočne zníži rýchlosť pohybu väčších molekúl (dlhších DNA-sekvencií). Dôsledkom toho sa kratšie DNA-molekuly pohybujú rýchlejšie ako dlhé (obr. 8.8). Dá sa vypočítať rýchlosť jednotlivých DNA-molekúl v závislosti od ich dĺžky. Keď dosiahne prvá (najkratšia) molekula kladnú elektródu, elektrické pole sa vypne a podľa dĺžok prejdených dráh sa dajú určiť dĺžky DNA reťazcov. Keďže DNA-molekuly sú bezfarebné, aby sme mohli celý proces sledovať, môžeme ich označiť fluorescenčnými farbami. (v) Concatenate (Ri) (iii) Empty?(i?í) Testuj, či Ri obsahuje aspoň jednu DNA-molekulu alebo vôbec nič. 6Toto je značne zjednodušená predstava ďalších fáz polymerázovej reťazovej reakcie nazývajúcich sa „Priming" a „Extension". Podrobnejšie informácie možno nájsť v [PRS05]. 8.2 AKO ZMENÍME LABORATÓRIUM NA BIOPOČÍTAČ 241 + obr. 8.8 DNA-sekvencie v Ri sa môžu náhodne spájať7 do dlhších, dlhšie DNA-sekvencie vznikajú tým, že sa kratšie zapoja za seba. X (vi) Separáte (i?j, w) pre reagenčnú nádobu Ri a DNA sekvenciu w. Operáciou sa odstránia z Ri všetky DNA-molekuly, ktoré v sebe neobsahujú sekvenciu w. V Napríklad w = ATTC je časťou x = AATTCGATC, lebo sa v celku vyskytuje v x. Vykonanie takejto operácie vyžaduje trochu viac námahy. Najprv môžeme všetky dvojité reťazce zahriatím rozpojit' na jednoduché. Potom pridať mnoho kópií DNA sekvencií komplementárnych k w a mierne všetko ochladiť. Napríklad k reťazcu w = ATTC je komplementárny reťazec TAAG. Sekvencie komplementárne k w sa naviažu na zodpovedajúce časti w jednoduchých reťazcov. Jednoduché reťazce, ktoré neobsahujú w, sa nedoplnia a ostanú jednoduché. Potom všetko přefiltrujeme cez filter prepúšťajúci len jednoduché reťazce. To, čo ostane, sú reťazce ako AATTCGATC ŤÁAG presnejšie vysvetlenie je v časti 8.3 dlhé reťazce krátke reťazce 242 KAPITOLA 8 kde nie sú už jednoduché reťazce, ale ani kompletné dvojité reťazce. No pridaním jednotlivých nukleotidov môžeme úplný dvojitý reťazec opäť reprodukovať. (vii) Separate-Prefix(f?j, w) pre Ri a DNA-sekvenciu w. Odstránime všetky DNA-molekuly, ktoré sa nezačínajú8 na w. (viii) Separate-SufRx(i?j,m) pre Ri a DNA-postupnosť. Odstráň všetky DNA-molekuly, ktoré sa nekončia na u. Úloha 8.2 Nech reagenčná nádoba r obsahuje ATTGCCATGCC, ATATCAGCT, TTGCACGG, AACT,AGCATGCT. Ktoré DNA-molekuly zostanú po vykonaní nasledujúcich operácií? O a) Length-Separate (r, 7) b) Separáte (r, TTGC) c) Separate-Prefix (r, TTGC) d) Separate-Suffix (r, GCT) Úloha 8.3 Chcete vykonať operáciu Separate(i?, AACT). Ktoré DNA-reťazce musíte po zahriatí pridať k r, aby ste mohli nasledujúcou filtráciou oddeliť nevhodné jednoduché reťazce. X Z uvedených 8 operácii sa už dá vytvoriť DNA počítač, ktorý vie robiť to isté ako PC. Ako sa to dá, ukážeme v nasledujúcom odseku. 8.3 Adlemanov experiment alebo biohľadanie cesty V) V časti 8.2 sme tvrdili, že s tam uvedenými biochemickými operáciami vieme urobiť všetko, čo sme schopní vykonať aj na klasickom počítači. Nechceme tu robiť matematický dôkaz, aleje najvyšší čas uviesť aspoň príklad ako DNA počítač vie vyriešiť algoritmický problém. Všimneme si problém Hamiltonovej cesty v orientovanom grafe (v literatúre sa označuje ako HPP) a povieme si, ako Adleman v chemickom laboratóriu úspešne vyriešil prípad problému HPP. Adlemanov experiment sa ukázal ako velmi podnetný a mnohé špičkové univerzity realizujú výskumné projekty, v ktorých sa usilujú vyvíjať DNA technológiu na riešenie ťažkých problémov. 3Tu sa zriekneme podrobnejšej predstavy ako sa to uskutočňuje. 8.3 ADLEMANOV EXPERIMENT 243 obr. 8.9 Prípad HPP problému zadáme prostredníctvom cestnej siete (alebo siete leteckých liniek). Mestá (alebo križovatky) sú znázornené (obr. 8.9) ako vrcholy a spojenia medzi mestami ako rovné čiary. Keď sa čiary pretínajú mimo mesta, nemá to pre nás význam (rovnako ako pri leteckých linkách) pretože sa nemôžeme z jednej dostať na druhú. Spojnice sú jednosmerné. Keď použijeme spojnicu Lin(si,s2) z si do s2, dostaneme sa nevyhnutne do s2. Ďalšia časť prípadusú mená dvoch rôznych miest Sj a s j. HPP problém je rozhodovací problém a otázka je, či je možné začať v Sj, prejsť práve raz každým mestom v sieti a skončiť v s j. Takáto cesta sa nazýva Hamiltonova cesta z Si do s j. Znázornime si to na konkrétnom prípade problému. Prípadom je sieť na obr. 8.9, štart je v si a cieľ v s5. Riešením je napríklad V sl s2 s3 ~^ s4 ~^ s5 (Hamiltonova cesta z si do s5), lebo každé mesto sme navštívili práve raz a navštívili sme všetky mestá v sieti. Na prejdenie cesty potrebujeme štyri spojnice Lin(si, s2), Lin(s2, s3), Lin(s3, s4) a Lm(s4, s5), ktoré v sieti aj skutočne sú. Takže správna odpoveď pre túto inštanciu problému je „ÁNO". Pre sieť na obr. 8.9, štart s2 a cieľ si neexistuje Hamiltonova cesta. Správna odpoveď v tomto prípade musí byť „NIE". Spoznáme to podľa toho, že cieľ si je prístupný len zo štartu s2 a to jediným spôsobom. Z s2 musíme ale najskôr navštíviť všetky ostatné mestá. Keď ale potom chceme ísť do s1 musíme prejsť opäť cez s2, čo ale nie je dovolené, lebo by sme ho navštívili druhý raz. Úloha 8.4 Uvažujme sieť na obr. 8.10. Existuje Hamiltonova cesta a) z si do S7? b) z s7 do si? c) z S4 do S3? d) z S5 do si? Úloha 8.5 Pre ktoré dvojice miest štart a cieľ existujú Hamiltonové cesty v sieti a) na obr. 8.9 ? b) na obr. 8.10 ? c) na obr. 8.11 ? V ďalšom budeme nazývať cesta z si do sn, ľubovoľnú postupnosť uzlov takých, že v sieti sú spojenia Lin(s1,s2), Lin(s2,s3), ..., Lm(sn_i,sn). Namiesto Lin(si,Sj) budeme skrátene písať e^j. Teda si, s7, si, s7, si alebo s7, s1; s2, s5, s2, s5, s6, si, s7 sú cesty, lebo na ceste sa môžu uzly ľubovoľne opakovať. Adleman uvažoval prípad problému na obr. 8.11 so štartom s0as cieľom s6. Jeho stratégia bola nasledujúca: Mená miest v sieti zakóduj sekvenciami DNA. Potom umožni, aby sa mená vzájomne prepojených miest mohli spojiť za sebou do DNA sekvencie. Použi toľko DNA sekvencií pre každé miesto v sieti, že pri náhodne zvolených vzájomných prepojeniach vzniknú všetky možné cesty v sieti. Aplikáciou rôznych operácii Separáte odstraň z reagenčnej nádoby všetky cesty, ktoré nepredstavujú Hamiltonovu cestu z s0 do se. Prv ako biochemicky uskutočnil túto stratégiu, vybral pre miesta najprv „DNA mená" ako texty z písmen A, C, G, T. Napríklad nasledujúce sekvencie báz dĺžky 20 zvolil ako jednoduché reťazce predstavujúce s2, s3 a s4: Teraz chceme reprezentovať prepojenie (ulicu) z Sj do s j ako také jednoduché DNA reťazce, že operáciou Concatenate(-R) budú môcť vzniknúť iba také dlhšie DNA reťazce, ktoré zodpovedajú existujúcej ceste v sieti. 8.3 ADLEMANOV EXPERIMENT 245 obr. 8.11 s2 = TATCGGATCGGTATATCCGA s3 = GCTATTCGAGCTTAAAGCTA s4 = GGCTAGGTACCAGCATGCTT Pritom využijeme vlastnosti DNA, že bázy môžu vytvárať výlučne dvojice A s T alebo C s G. Pre cestu z e^j z s j do s j • rozdelíme ich texty (DNA reprezentácie Sj a s j) vždy v strede na dve polovice; • vytvoríme takzvané doplnky k druhému dielu Sj a k prvému dielu s f Nahradíme A s T, C s G a tiež aj obrátene; • pre ulicu e,i^j vytvoríme text (DNA reprezentáciu) spojením týchto dvoch doplnkov. Všimnime si, že sme tým určili aj smer ulice. V našom príklade to znamená e2^3 = CATATAGGCT CGATAAGCTC; e3^2 = GAATTTCGAT ATAGCCTAGC; e3^4 = GAATTTCGAT CCGATCCATG. Tým sa jednotlivé reťazce pre s2 a s3 môžu spojiť do jedného reťazca pre e2^3 ako na obr. 8.12. Úloha 8.6 Nakreslite prepojenie s3 a s4 spojom 63^4 analogicky ako je to pre s2 a s3 na obr. 8.12. Úloha 8.7 Predstavme si, že do siete ulíc na obr. 8.11 pridáme spojenie e2^4. 246 KAPITOLA 8 S2 S3 /" ^---- ~N TATCGGATCGGTATATCCGAGCTATTCGAGCTTAAAGCTA CATATAGGCTCGATAAGCTC V_ _J -v— obr. 8.12 O} O o CN s3 s4 S2 S3 s4 s5 s2 ei^3 e3^4 e4^i ei^2 Č2->3 e3^4 e4^5 e5^2 e2^3 s0 s3 s2 Sl eo^3 e3^2 e2^i ei^2 obr. 8.13 s0 s6 eo^e s0 s3 s4 s5 s6 e0^3 e3^4 e4^5 e5^6 Aký musíme zobrať pre e2^4 reťazec? Nakreslite zodpovedajúce prepojenie s2 a Keď teraz zoberieme jednoduché reťazce ako DNA sekvencie zodpovedajúce tomuto kódovaniu a dáme ich za vhodných podmienok do reagenčnej nádoby, môžu sa spájať do dvojitých reťazcov tak, ako je to na obr. 8.13. Každý takýto dvojitý reťazec opisuje nejakú cestu v cestnej sieti. Aby to celé bezchybne fungovalo, musíme zabezpečiť, aby sa zakódovania ciest mohli predlžovať len spôsobom, ako je to v uvedenom príklade. Predovšetkým musia byť všetky polovice kódov miest navzájom rôzne. Po tom, čo sme mestá a cesty takto zakódovali môžeme zrealizovať Adle-manovu stratégiu hľadania Hamiltonovej cesty nasledujúcim DNA algoritmom: 1. Daj do reagenčnej nádoby T DNA kódy všetkých miest a ciest (ako jednoduché reťazce). Pridaj DNA sekvenciu dĺžky 10, ktorá je doplnkom k prvej polovici s0 a DNA sekvenciu dĺžky 10, ktorá je do- 8.3 ADLEMANOV EXPERIMENT 247 plnkom k druhej polovici cieľového miesta sn. 2. Opakuj (2n ■ log2n)-krát operáciu Amplify (T), aby vzniklo aspoň n2n kópií z každého z týchto DNA reťazcov. 3. S Concatenate (T) vytvor veľké množstvo dvojreťazcových DNA sekven-cií, ktoré predstavujú rôzne dlhé cesty v cestnej sieti. Tento proces prebieha náhodne a veľký počet mien miest nám zaručí, že s vysokou pravdepodobnosťou9 vznikne každá zo všetkých možných ciest, ktorých dĺžka je až n. 4. Aplikuj operáciu Length-Separate (T,/), pričom / je n násobok dĺžky kódu jedného mesta. V T ostanú len kódovania zodpovedajúce cestám, ktoré prechádzajú presne cez n miest. CN 5. Použi Separate-Prefix (T, s0), aby v T ostali len také DNA sekvencie, ktoré zodpovedajú kódom ciest začínajúcim sa v so =ŠTART. bJO _ 6. Použi Separate-Suffix (T, sn), aby v T ostali len také DNA sekvencie, ktoré zodpovedajú kódom ciest končiacim sa v sn =CIEĽ. 7. Použi (n — 2)-krát Separate (T, x) pre každé z n —2 kódovaní zvyšných miest. Takto v T ostanú len tie cesty, ktoré každé mesto obsahujú aspoň raz. {Pretože vykonanie kroku 4 nám zaručí, že v T sú len cesty prechádzajúce presne n mestami, obsahujú tieto cesty každé mesto práve raz.} 8. Preskúmaj obsah T s Empty?(T) a odpovedaj ÁNO, ak v T ostala aspoň jedna DNA sekvencia. V opačnom prípade odpovedaj NIE. Použitím algoritmu na sieť na obr.8.11 so štartom s0 a cieľom se dosiahneme, že v reagenčnej nádobe ostanú molekuly dvojitého reťazca DNA, predstavujúce Hamiltonovu cestu so —► si —► s2 —► ^ —► S4 —► S5 —► se. Teda potvrdili sme správnu odpoveď ÁNO. Úloha 8.8 Nájdite aspoň tri rozličné cesty v sieti z obr. 8.11, ktoré ostanú v reagenčnej nádobe po vykonaní piatej operácie z Adlemanovho DNA algoritmu. Čo zostane po vykonaní šiestej operácie? Úloha 8.9 Uvažujeme cestnú sieť na obr. 8.14: a) Uveďte (čo najkratšie) kódovanie (prostredníctvom DNA) miest, také, aby boli splnené nasledujúce podmienky: 3 Prirodzene pri tom náhodne vzniknú aj cesty dlhšie než n. 248 KAPITOLA 8 y Start z obr. 8.14 1. Kód každého mesta sa odlišuje od kódu ľubovolného iného mesta najmenej na štyroch pozíciách. 2. Prvá i druhá polovica kódu každého mesta sa odlišuje od prvej aj druhej polovice kódu ľubovoľného iného mesta. b) Určite DNA kódy ulíc, ktoré sa budú hodiť k vašim kódom miest. Úloha 8.10 Opíšte detailne priebeh Adlemanovho algoritmu pre vstup z úlohy 8.9, pričom uvediete postupnosť operácií s konkrétnymi parametrami (DNA sekvenci- Úloha 8.11 Sú požiadavky na kódovanie miest uvedené v úlohe 8.9 (a) postačujúce na to, aby každý vytvorený dvojitý DNA reťazec zodpovedal ceste ulicami? Opodstatnite vašu odpoveď. Vidíme, že Adlemanov algoritmus z pohľadu algoritmiky používa veľmi jednoduchú stratégiu. Využíva masívny paralelizmus a vytvára všetky možné cesty sieťou, ktoré sú kandidátmi na riešenie. Potom skúša vytriediť spomedzi kandidátov hľadané riešenie (Hamiltonovu cestu od štartu k cieľu). Od začiatku 90-tych rokov boli vyvinuté mnohé ďalšie DNA algoritmy na riešenie rôznych NP-ťažkých problémov a pre malé prípady problémov boli aj v laboratóriu zrealizované. Aktuálny výskum sa venuje zvyšovaniu spoľahlivosti a rýchlosti uskutočňovania biochemických operácií a tiež vývoju šikovnejších algoritmických konceptov pre DNA algoritmy, ako je úplné prehľadávanie všetkých možností. ami a dĺžkami). 8.4 SILNÉ A SLABÉ STRÁNKY DNA POČÍTAČA 249 8.4 Silné a slabé stránky DNA počítača a vízie za horizont Silnou stránkou DNA technológie je veľká miera miniaturizácie, čím sa dosahuje masívny paralelizmus spracovania údajov. Aj keď priebeh niektorých biochemických operácií trvá celé hodiny či dokonca dni, je počet pri tom paralelne uskutočnených operácií taký vysoký, že by simulácia na hociakom elektronickom počítači trvala roky. V súčasnosti DNA počítače ešte nekonkurujú elektronickým, pretože DNA technológia je len na počiatku. Uskutočnenie operácií trvá hodiny a dni a výsledky nie sú spoľahlivé. DNA sekvencie vieme čítať s 3% chybou, pri vykonávaní operácií dochádza k chybám, zlému nadviazaniu, medzerám pri nadviazaní atď. Slovom nevieme operácie vykonávať dostatočne spoľahlivo a presne. Aby sme sa týmto problémom vyhli, využívame takzvanú redundanciu. Aby sa zvýšila pravdepodobnosť správneho vykonania operácií aspoň na jednom reťazci musí sa zmnohonásobiť počet dvojitých reťazcov - nosičov informácií. Ale čím väčší počet operácií DNA počítač vykoná, tým je menšia pravdepodobnosť, že dostaneme správny výsledok. Vzhľadom na súčasný stav rozvoja DNA technológií to znamená, že pre mnohé prakticky zaujímavé prípady problémov nemáme k dispozícii dostatočný objem potrebného biologického materiálu, aby sme mohli spoľahlivo vykonať existujúce DNA algoritmy. Skeptici by mohli povedať: „Nemrhajme časom, a venujeme sa radšej niečomu užitočnému, kde vieme predvídať skoré uplatnenie." Moja odpoveď je, že to by bola najväčšia chyba, ktorú by mohol manažment vedy urobiť. Keby sme sa vo vede sústredili len na ciele, ktoré prinášajú celkom predvídateľný a dosiahnuteľný prospech, nikdy by sme nič podstatné neobjavili a pravdepodobne by sme sa ešte dnes šplhali po stromoch a nepoznali oheň. Pozrime sa na úroveň počítačovej techniky pred 40-50 rokmi. Počítač potreboval veľkú miestnosť a dennú údržbu, čo znemožňovalo dlhšie výpočty. Bojovali sme s chladením čoraz väčšmi sa zahrievajúcich zariadení a často sme zistili, že vo výsledkoch niečo nesedí, zavše sme museli celodenný výpočet opakovať. Programy sa zadávali do počítača takzvanými diernymi štítkami. Dierny štítok obsahoval jeden riadok programu (jeden príkaz) v binárnom kóde (diera alebo „nie diera"). Nešlo len o problém ako vyvinúť správny program. Keď mal program tisíce riadkov a niekto rozsypal krabicu s neočíslovanými diernymi štítkami, pozbieranie a utriedenie štítkov nemuselo byť najrýchlejším spôsob opätovného zostavenia programu. Koľkí verili v obrovský komerčný úspech počítača? Ale vývoj si nevšímal skeptikov. Kto dnes vie, čo všetko bude možné vďaka DNA technológiám? Na prelomenie 250 KAPITOLA 8 štandardne používaného DES kryptosystému, ktorý sa považuje za bezpečný, potrebujú dnes DNA počítače 18 rokov[PRS05]. Ale keď sa zvýši spoľahlivosť a rýchlosť vykonávania biochemických operácií, je mysliteľné aby to bolo len pár hodín. Možnosti na vylepšenie DNA technológií nesporne existujú. A napriek tomu, že krátkodobo nevidíme komerčné využitie, veda musí ísť cestou objavovania hraníc tejto technológie. Som presvedčený, že v tejto oblasti sa ešte dočkáme divov, ktoré nás potešia. V súvislosti s biologickým spracovaním údajov formuloval Adleman aj celkom odlišnú predstavu, ktorej realizácia je ešte ďaleko za horizontom. Informácie sa nespracovávajú len v počítačoch alebo našich hlavách. Nachádzajú sa ako obyčajný prírodný fenomén v biologických alebo fyzikálnych systémoch. DNA molekula obsahuje okrem génov, ktoré slúžia ako návody na vytváranie určitých bielkovín aj ďalšie informácie, ktoré riadia výber príslušného návodu. Nespráva sa v tomto ohľade jediná molekula ako samostatný počítač? Keď pochopíme lepšie jednotlivé programy a biologické mechanizmy, existuje možnosť programovať molekulu ako univerzálny počítač. Potom nebudeme potrebovať tony biomasy na uskutočnenie biologického spracovania informácií. Naše algoritmy budú vykonateľné na základe naprogramovania DNA molekuly. Pre nebiológov, ktorí sa zaujímajú o základy manipulácie s DNA molekulou, doporučujeme učebnicu Bôckenhauera a Bongartza [BB03]. Vynikajúci úvod do molekulárnej biológie pre začiatočníkov je učebnica Drlicu [Drl92]. Podrobný a s nadšením napísaný úvod do DNA počítania je v [PRS05]. Koncept je výstižne predstavený aj v [Hro04a]. Keď neočakávaš neočakávané, O} O o CN nenájdeš nič drahocenné, čo ťažko nájsť. Heraklit Kapitola 9 i Kvantový počítač, alebo počítanie v zázračnom svete mikročástic 9.1 Prehistória a vytýčenie cieľa /—v Fyzika je zázračná veda. Keby som mal na gymnáziu dobrého učiteľa fyziky, pravdepodobne by som sa stal fyzikom. Ale nebanujem, že som sa stal infor-matikom. Keď preniknete dostatočne hlboko do základov vlastnej vednej disciplíny, nevyhnutne sa dotknete aj iných oblastí základného výskumu. Otvorí vám to prístup k spoločnému základu všetkých vedeckých disciplín a uvidíte všetko jasnejšie a vzrušujúcejšie ako keby ste sa na veci pozerali len úzkym pohľadom jednej vednej disciplíny1. Fyzika poskytuje širší a zároveň aj hlbší pohľad na svet. Nijaká iná vedecká disciplína, najmä v devätnástom a prvej polovici dvadsiateho storočia, neformovala náš pohľad na svet tak významne ako fyzika. Vzrušujúce objavy, neočakávané zvraty a pozoruhodné výsledky 1 Priveľká špecializácia a s tým spojený zúžený pohľad sú najväčším problémom dnešnej vedy, ktorá na jednej strane „chráni" pred hlbokým pochopením a pred naozajstnými vedeckými úspechmi a na druhej strane vyvoláva vysokú netolerantnosť, ba až pohŕdanie medzi vedcami z rôznych vedeckých oblastí. 252 KAPITOLA 9 boli na dennom poriadku fyzikálneho výskumu. Som presvedčený, že kvantová mechanika patrí k najväčším vedeckým objavom. Pochopiť a akceptovať ju bolo pre ľudí rovnako ťažké, ako v stredoveku sa vzdať predstavy, že zem je stredobodom vesmíru2. Prečo narážalo uznanie kvantovej mechaniky na podobné problémy so svojim uznaním, ako práce Galilea Galileiho? Pretože zákony kvantovej mechaniky sú pravidlá správania sa elementárnych častíc a tieto sa nedajú zosúladiť s našimi skúsenosťami z makrosveta. Pozrime sa na najdôležitejšie princípy kvantovej mechaniky, ktorá rozbila svet klasickej fyziky: • V makrosvete sa objekt v každom momente3 nachádza len na jednom mieste. Neplatí to pre častice. Napríklad elektrón sa môže nachádzať na viacerých miestach v tom istom čase. • Princíp kauzality hovorí, že každá akcia má svoju jednoznačne určenú reakciu, jednoznačne určené dôsledky. To neplatí vo svete elementárnych častíc. V istých situáciách (podľa teórie kvantovej mechaniky) tu vládne náhoda. Dôsledky niektorých akcií sa nedajú jednoznačne predpovedať. Existujú viaceré možnosti ako sa situácia bude vyvíjať a uskutoční sa náhodne jedna z týchto možností.Nemáme žiadnu možnosť vypočítať a na základe toho predpovedať, ktorá z možností nastane. Vieme vypočítať len pravdepodobnosti, s ktorými nastanú jednotlivé možnosti. Z tohto dôvodu fyzici v týchto prípadoch hovoria o skutočne náhodných udalostiach. • Princíp lokálnosti hovorí, že účinok akcie je vždy lokálny. V kvantovom svete môžu mať dve častice takú silnú vzájomnú väzbu, že nezávisle od ich vzájomnej vzdialenosti (hoci aj miliardu svetelných rokov), zmena stavu jednej z nich súčasne spôsobí zmenu stavu druhej z nich. • Klasická fyzika hovorí, že keď je nejaká udalosť možná (teda keď udalosť má kladnú pravdepodobnosť výskytu), tak sa s príslušnou frekvenciou bude vyskytovať. Vo svete častíc je to inak. Dve možné udalosti, ktoré sa môžu vyskytnúť s kladnou pravdepodobnosťou, sa môžu vzájomne celkom zrušiť, podobne ako dve vlny, takže ani jedna z nich nenastane. Ako mohli fyzici objaviť vôbec takéto „podivuhodné" zákony, ba čo viac presvedčiť sa o ich vierohodnosti? V princípe rovnako, ako to robili aj vždy pred tým. Vymysleli ich výskumníci s geniálnou intuíciou na základe experimentov, pozorovaní a úvah. Svoje myšlienky vyjadrili v jazyku matematiky. Na základe matematického modelu boli fyzici schopní vytvoriť hypotézy. Keď 2A tým stratiť vo vlastných očiach svoju dôležitosť. 3Podľa teórie relativity je aj čas subjektívny (relatívny) pojem. 9.2 ČAROVNÝ SVET KVANTOVEJ MECHANIKY 253 sa všetky hypotézy potvrdili aj experimentálne, bol dobrý dôvod pokladať model za vierohodný. Experimentálne potvrdenie teórie kvantovej mechaniky trvalo mnoho rokov, pretože na potvrdenie niektorých hypotéz tejto teórie bol potrebný podstatný rozvoj v oblasti experimentálnej fyziky. Navyše tento rozvoj bol často finančne veľmi náročný. Co chceme povedať? Na priblíženie kvantovej mechaniky by nestačilo ani niekoľko kníh ako je táto. Potrebná matematika nie je ľahká a náročnosť sa ešte zvýši, keď sa usilujeme navrhnúť kvantové algoritmy na riešenie algoritmických úloh. Z týchto dôvodov sa uspokojíme s azda nie celkom ostrým obrazom hlavných konceptov správania sa častíc a toho, ako ich správanie využiť pri algoritmickom spracovaní informácií. V nasledujúcej časti navštívime čarovný svet kvantovej mechaniky, všimneme si správanie sa častíc v experimentoch a pokúsime sa ho objasniť. V časti 9.3 vysvetlíme ako sa dajú uložiť bity v kvantovom systéme a ako sa s nimi dá počítať. Budeme sa venovať aj problémom konštrukcie kvantového počítača. V odseku 9.4 uzavrieme kapitolu diskusiou o perspektívach kvantového počítania pri riešení ťažkých problémov a pri vývoji bezpečných kryptosystémov. < v> 9.2 Krátka prechádzka čarovným svetom kvantovej mechaniky Alica bola v krajine zázrakov len vo sne. Fyzici to majú oveľa ťažšie. Pri svojej práci sú denne konfrontovaní so zázračnou krajinou častíc. Nemôžu z nej utiecť tým, že sa prebudia. Musia sa zo všetkých síl snažiť vysvetliť aspoň sčasti prečudesné správanie sa častíc, a čo je najhoršie, musia pri tom zabudnúť všetky svoje doterajšie predstavy o tom, ako funguje tento svet. Opustiť vlastné predstavy nie je ľahké a vyžaduje si to určitý čas a ešte ťažšie je presvedčiť iných, že staré predstavy nie sú celkom správne, že ich treba nahradiť neuveriteľnými a doterajším skúsenostiam odporujúcimi konceptmi. A fyzici ešte môžu byť šťastí, že uveriteľnosť fyzikálnych teorií sa nepotvrdzuje ľudovým hlasovaním. Ako postupovať, aby sme pre ľudí žijúcich v makrosvete predstavu sveta častíc, ktorá sa prieči zdravému rozumu, spravili aspoň trocha presvedčivú a akceptovateľnú? Začneme4 s experimentálni, ktoré sa budeme usilovať vysvetliť. Skúsme najprv takzvaný experiment s dvoma štrbinami (obrázky 9.1, 9.2 a 9.3). Majme zdroj fotónov, z ktorého ich môžeme vysielať všetkými smermi. 4 ako to spravili kedysi fyzici 254 KAPITOLA 9 Oproti zdroju svetla bude stena s dvomi štrbinami, ktoré sa dajú zatvárať ako okno. V určitej vzdialenosti za stenou je fólia (hrubá čiara na obr°. 9.1), na ktorej vieme registrovať na ňu dopadajúce častice. Na obr. 9.1 je zobrazená situácia, keď je otvorená ľavá a zatvorená pravá štrbina. Krivka na obr. 9.1 znázorňuje ako často sme na fólii zaregistrovali dopad častíc. Všetko je podľa našich predstáv. Podľa očakávania najčastejšie častice narážali na fóliu priamo oproti otvorenej štrbine. Krivka tam dosahuje najväčšiu hodnotu. Čím viac sa doprava alebo doľava vzdalujeme od štrbiny, tým menej častíc dopadá na fóliu, krivka sa na obe strany klesá. Podobne očakávaný výsledok experimentu dostaneme, keď je zatvorená ľavá štrbina a otvorená pravá (obr. 9.2). Výskyt častíc sa zvyšuje, čím sme bližšie k miestu, ktoré je presne oproti otvorenej štrbine. Podobne ako na obr. 9.1, krivka dosahuje najvyššiu hodnotu oproti otvoru a klesá na obe strany. Očakávali by sme ale, že keď obe štrbiny otvoríme bude výsledná početnosť výskytu častíc súčtom početností z obr. 9.1 a obr. 9.2 keď bola otvorená vždy len jedna štrbina. Tomu zodpovedajúca krivka početností je znázornená na obr. 9.3. Prekvapení zisťujeme, že to tak nie je. Na obr. 9.4 je znázornený pozorovaný výsledok experimentu, keď sú obe štrbiny otvorené. Krivka početnosti výskytu z obr. 9.4 sa podstatne odlišuje od očakávanej krivky na obr. 9.3. A predsa, krivka z obr. 9.4 nie je fyzikovi neznáma alebo dokonca chaotická. Fyzik ihneď rozpozná, že zodpovedá interferencii vín. Keby sme z každej štrbiny súčasne vypustili vlnu, na niektorých miestach sa vlny navzájom zrušia a na iných zasa zosilnia. Vravíme, že interferujú. H h 9.2 ČAROVNÝ SVET KVANTOVEJ MECHANIKY 255 Výsledok zosilnenia a zoslabenia zodpovedá presne krivke početnosti výskytu z obr. 9.4. Ako to vysvetliť? Fotóny (alebo iné častice) vypúšťame zo zdroja postupne, takže dva rôzne fotóny nemôžu vzájomne interferovať. Jediné vysvetlenie je, že každý fotón prejde súčasne oboma štrbinami a interferuje sám zo sebou. Podstata tohto experimentu zodpovedá presne základom kvantového počítania. Častica je sčasti v ľavej a sčasti v pravej štrbine. Keď výskyt častice v ľavej štrbine reprezentuje hodnotu bitu 0 a výskyt v pravej štrbine reprezentuje hodnotu bitu 1, je hodnota bitu čiastočne 0 a čiastočne 1, čo v našom makrosvete nie je možné. Podstata matematického modelu kvantovej mechaniky je založená presne na tom, že častica sa do istej miery môže súčasne vyskytovať na viacerých miestach a interferovať sama zo sebou. Výsledky predpovedané na základe tohto modelu sa presne zhodujú s pozorovaniami v experimentoch (obr. 9.4). 256 KAPITOLA 9 A to ešte nie je koniec. Experimentátor sa môže rozhodnúť, že podrobne preskúma správanie sa častíc. Ďalším zdrojom svetla si zboku posvieti na štrbiny, aby zistil, cez ktorú z nich častica prejde. A znovu zázrak! S prekvapením zistí, že každý fotón sa ukáže práve v jednej štrbine, nikdy nie v oboch súčasne. Krivka početnosti dopadu častíc sa tiež zmenila a bude zodpovedať pôvodne očakávanej krivke z obr. 9.3. To sú ale prefíkané častice! Správajú sa ako svätuškári.Keď ich pozoruješ, robia presne to čo sa od nich očakáva. Keď ale na ne nehľadíš robia všetko možné, len nie to, čo sa od nich očakáva. Môžete ľubovoľne často zamieňať pozorovanie a nepozorovanie štrbiny a zodpovedajúce krivky početností výskytu sa budú príslušne podľa toho meniť, ako je to znázornené na obr. 9.3 a obr. 9.4. Keď stlmíme bočný zdroj svetla slúžiaci na pozorovanie štrbiny do tej miery, že osvetlí len zlomok častíc, bude krivka početností výskytu častíc zmiešaním kriviek z obr. 9.3 a obr. 9.4. Čím viac svetla, tým bude viac podobná krivke z obr. 9.3. Čím bude svetla menej, tým viac bude podobná krivke z obr. 9.4. Ako vysvetlíme takéto správanie? Pomocou kvantovej mechaniky. Nasledujúca všeobecne platná skutočnosť je veľmi dôležitá. 9.2 ČAROVNÝ SVET KVANTOVEJ MECHANIKY 257 Nevieme vykonať pozorovanie alebo meranie bez toho, aby sme pri tom neovplyvnili stav pozorovaného objektu a tým aj hodnoty, ktoré meriame5. Práve to, sa stalo v našom experimente. Bočný zdroj svetla ovplyvnil meranie tak, že každú pozorovanú časticu prechádzajúcu súčasne oboma štrbinami náhodne zafixoval do jednej z nich. Každé pozorovanie kvantovomechanick-ého systému spôsobí, že vytvoríme takzvaný fixovaný klasický stav. Klasický stav zodpovedá tradičnému klasickému svetu. Častica je buď tu, buď tam, ale nikdy nie je na dvoch miestach zároveň. Kde sa pri našom pozorovaní z boku častica zafixuje je náhodná udalosť, ktorú vieme modelovať pomocou zákonov kvantovej mechaniky. Nemôžeme ovplyvniť a ani jednoznačne predpovedať, ktorou štrbinou bude častica prechádzať. Vieme vypočítať len pravdepodobnosť, s ktorou sa objaví v jednej alebo druhej štrbine. Aká podstatná je táto skutočnosť pri tvorbe kvantovomechanických algoritmov, uvidíme v nasledujúcej kapitole. Ak vás zneistil predstavený experiment s dvomi štrbinami, nič si z toho nerobte. Sami fyzici potrebovali mnoho rokov na to, kým sa zžili s týmito predstavami o správaní sa častíc. Presnejšie povedané až nástup novej generácie vo fyzikálnom výskume znamenal akceptovanie a strávenie kvantovej mechaniky. Pretože dúfam, že doterajšie čítanie knihy vás už dostatočne zocelilo, dovolím si predstaviť ešte jeden fyzikálny experiment. Nasledujúci experiment zvýrazní významnú úlohu interferencie. Predstavme si prázdninovú idylku. Slnko svieti, na oblohe ani mráčka, bezvetrie a pred nami modré more, v ktorom 1 meter pod hladinou odpočíva neškodná ryba. Ruší ju iba do oka dopadajúci slnečný lúč. Aká je jeho dráha? Podľa známych fyzikálnych zákonov pôjde slnečný lúč zo slnka do oka po časovo najkratšej dráhe. Časovo najkratšia dráha neznamená priamku spájajúcu slnko a oko ryby (prerušovaná čiara na obr. 9.5). Pretože sa svetlo šíri vo vzduchu rýchlejšie ako vo vode, pôjde lúč radšej dlhšie vzduchom, aby si skrátil cestu vodou (plná čiara na obr. 9.5). Očividne lúč pri vstupe do vody mení smer. Tento uhol vieme vypočítať. Zisťujeme, že slnečný lúč sa láme na hladine pod určitým. Uvažujeme rovnaký experiment s rybou odpočívajúcou 100 m pod hladinou. V tomto prípade by sa mala dráha vo vode ešte viac skrátiť. Preto sa posunie časovo najkratšia dráha lúča ešte viac doprava a bude sa pri vstupe do vody lámať pod väčším uhlom (obr. 9.6). Aj keď, že sme veľkosť uhla na obr. 9.6 trocha zveličili, z nášho experimentu 5Ak predpokladáme, že namerané hodnoty zodpovedajú presne realite ide o veľmi idealizovaný model experimentu. 258 KAPITOLA 9 je nad slnko jasnejšie, že uhly pod ktorými lúče vchádzajú do vody sú rôzne. To predsa nie je s kostolným poriadkom! Ako môže vedieť lúč na hladine, či padne do oka rybe nachádzajúcej sa 1 m alebo 100 m pod hladinou a podľa toho zmeniť svoj smer? Alebo ešte lepšia otázka. Ako sa už pri štarte zo slnka môže rozhodnúť, komu padne do oka a na základe toho sa vydať časovo najkratšou trasou? S takýmito múdrymi časticami nik nepočítal. V klasickej fyzike síce môžeme pozorovať, že sa svetlo vždy šíri po časovo najkratšej trase, ale nevieme vysvetliť ako to svetlo robí. Naproti tomu kvantová mechanika to vysvetliť vie. Slnečné lúče si prirodzene nemôžu vypočítať a naplánovať svoju trasu. Jednoducho sa pohybujú (vyžarujú) všetkými smermi a usilujú sa dosiahnuť oko ryby všetkými možnými trasami. Ibaže tie, ktoré neletia najkratšou trasou, vzájomne interferujú ako vlny a tým sa navzájom zrušia tak, že ostane len jeden fotón na najkratšej ceste. Tento jediný fotón nakoniec dopadne rybe do oka. Aké je z toho poučenie? Predsa prebieha výpočet. Ale nepočíta slnečný lúč. Je to globálny výpočet podľa prírodných zákonov kvantovej mechaniky, ktoré sú neustále prítomné v prírode a o ktorých pôsobení sa môžeme presvedčiť z pozorovania. Témou nasledujúcej časti je, ako využiť kvantovomechanické počítanie na strojové algoritmickému počítaniu. 9.3 AKO POČÍTAME VO SVETE ČASTÍC? 259 9.3 Ako počítame vo svete častíc? V kapitole 2 sme do určitej miery predstavili štruktúru počítača. Veľmi zhruba potrebujeme pamäť na ukladanie údajov a možnosť spracovávať (meniť) ich určitými operáciami. V klasickom počítači sme si pamätali postupnosti bitov. Prostredníctvom logických obvodov sme s postupnosťami bitov vedeli vykonávať aritmetické a textové operácie. Pri varení boli pamäťou nádoby všetkého druhu a hardvér na vykonávanie operácií boli rôzne kuchynské prístroje, ako šporák, trúba, mikrovlnka, mixér, atď. V biopočítači sme si pamätali údaje ako DNA sekvencie v reagenčných miskách a operácie s nimi sme vykonávali chemickými reakciami. Ako vytvoríme kvantový počítač? Už 260 KAPITOLA 9 je jasné, že musíme určiť, akým spôsobom si budeme pamätať údaje a ako budeme s nimi vykonávať operácie. Rovnako ako v klasickom počítači použijeme na reprezentáciu údajov bity. Aj tu budeme pracovať s registrami, ktoré nazveme kvantové registre. V kvantovom registri sú zapamätané kvantové bity. Aby sme ich odlíšili od klasických bitov 0 a 1 budeme ich označovať |0)a|l). Je viacero možností ako fyzikálne realizovať kvantové bity. Nasledujúce tri krátke odseky sú venované len čitateľom so záľubou vo fyzike. Neusilujeme sa v nich o všeobecnú6 zrozumiteľnosť a ostatným čitateľom ich odporúčame preskočiť. Prvá možnosť vytvorenia kvantového bitu je založená na využití jadrovej magnetickej rezonancie. Na obr. 9.7 je znázornený príklad použitia štyroch zo šiestich atómov v molekule ako kvantového registra. Keď sa molekula nachádza v magnetickom poli, smeruje spin atómov paralelne s magnetickým poľom. Smer paralelne s magnetickým poľom interpretujeme ako |0). Smer kolmo na magnetické pole interpretujeme ako |1). Použitím oscilujúcich magnetických polí vieme na týchto kvantových bitoch vykonávať operácie. |0> obr. 9.7 Ďalšia možnosť je iónová pasca. Ióny sú elektricky nabité molekuly alebo atómy (na obr. 9.8 sú nabité kladne, každému chýbajú práve dva elektróny). Pri teplote 6bez vedomostí z fyziky 9.3 AKO POČÍTAME VO SVETE ČASTÍC? 261 blízkej absolútnej nule sa ióny držia vo vákuu prostredníctvom elektromagnetického poľa v iónových pasciach. laser í elektródy D ,Ca 2+1 ,0a 2+1 Ca 2+1 vákuum nízka teplota S elektródy D obr. 9.8 Hodnotu |0) priradíme základnému stavu iónu a excitovanému stavu iónu priradíme hodnotu |1). Na takto vytvorených kvantových bitoch robíme operácie prostredníctvom lasera. Ako počíta kvantový počítač a aké sú jeho výhody? V klasickom počítači sme mali bitový register, ktorý mohol mať hodnotu buď 0 alebo 1. V kvantovom registri je to inak. Súčasne môže mať obe hodnoty, alebo len určitú časť z každej. Presne ako častica v experimente s dvomi štrbinami, ktorá čiastočne prechádzala aj cez pravú a čiastočne aj cez ľavú štrbinu. Ako to zapíšeme? Hovoríme, že kvantový bit (obsah kvantového registra) je superpozíciou (alebo kombináciou) dvoch klasických bitov |0) a |1). Superpozíciu zapisujeme "•|0> + P-\l), \\\ kde a a j3 sú komplexné čísla,pre ktoré platí a < 1. < 1 a la 1. \a\ označuje absolútnu hodnotu a. Ak neviete, čo sú to komplexné čísla, nevzdávajte sa a bez problémov môžete pokračovať v čítaní, pretože v ďalšom používame len reálne \a\ a \f3\. Pre každé reálne číslo a, \a\2 = a2, takže 262 KAPITOLA 9 naše podmienky pre a a (3 sa zjednodušia na c? < l,/32 < 1 a a2 + /32 = 1. Hodnoty a a (3 sa nazývajú amplitúdy a vyjadrujú, do akej miery je hodnota kvantového bitu |0) alebo Presnejšia interpretácia je takáto: a2 je pravdepodobnosť, že pri meraní bude obsahom kvantového registra |0). P2 je pravdepodobnosť, že pri meraní bude obsahom kvantového registra Požiadavka a2 + f32 = 1 je dôsledkom tejto interpretácie, pretože pre klasické stavy nie je iná možnosť ako |0) a Hoci s istotou vieme, že kvantový register sa nachádza v stave (superpozícii) nemáme možnosť zistiť o tejto superpozícii úplne všetko. Inak povedané, hodnoty a a j3 sa nedajú zmerať. Keď vykonáme meranie kvantového bitu, dostaneme len klasické hodnoty |0) alebo |1). Meranie definitívne zničí pôvodnú superpozíciu. Je to presne rovnaké ako pri elektróne, ktorý letí súčasne cez dve rôzne štrbiny, ale keď ho pozorujeme, letí vždy len cez jednu. V našej interpretácii je a2 pravdepodobnosť, s ktorou pri meraní dostaneme 0) a f32 je pravdepodobnosť, že výsledkom merania bude vyjadruje skutočnosť, že kvantový bit je s rovnakou pravdepodobnosťou v klasickom stave |0) či |1), lebo Pri viacnásobnom opakovaní merania superpozície preto nameriame hodnoty a-\0)+/3- |1) Príklad 9.1 Superpozícia 0) a |1) rovnako často. □ 9.3 AKO POČÍTAME VO SVETE ČASTÍC? 263 Príklad 9.2 Superpozícia vyjadruje, že pri meraní dostaneme výsledok |0) s pravdepodobnosťou a výsledok 11) s pravdepodobnosťou □ Úloha 9.1 Navrhnite superpozíciu kvantového bitu, meraním ktorej dostaneme hodnotu |1) s pravdepodobnosťou \ a hodnotu |0) s pravdepodobnosťou f. Ako je to vo všeobecnom prípade? Keď máme n kvantových registrov, máme 2n možných klasických obsahov. Superpozícia n kvantových bitov znamená, že register je súčasne vo všetkých 2n klasických stavoch, pričom v každom z nich je s určitou pravdepodobnosťou. Jediná podmienka je, že súčet týchto 2n pravdepodobností musí byť 1. Príklad 9.3 Uvažujme dva kvantové registre. Všetky ich možné obsahy sú tieto: 00, 01, 10 a 11. V prípade dvoch kvantových registrov je obsah pamäte kvantového počítača superpozícia a-|00) + 3- |01) +7- |10) + 5- |11), kde a2 < 1, i52 < 1, 72 < 1, ô2 < 1 a a2 + /32 + 72 + ô2 = 1. Konkrétna superpozícia ^•|00) + i-|01) + ^|10) + i-|ll) s« = /3 = 7 = (s) = | opisuje situáciu, v ktorej každý z možných obsahov nameriame s rovnakou pravdepodobnosťou 264 KAPITOLA 9 Uvažujme superpozíciu 0-|00) + 0-|01) + 0-|10) + l-|ll). Pretože a = /3 = ^ = 0aô2 = l2 = 1, každé meranie dá jednoznačne výsledok 111 >. Pri superpozícii i—5 _L .|oo) + o-|oi) + o-|io) + ^=-|ii) V2 V2 nameriame len dva výsledky 100) a |11), oba s rovnakou pravdepodobnosťou \. □ Úloha 9.2 Ako vyzerá vo všeobecnosti superpozícia troch kvantových bitov? a) Napíšte superpozíciu troch kvantových bitov, v ktorej meraním s rovnakou pravdepodobnosťou dostaneme ľubovoľný klasický obsah troch bitových registrov. b) Nájdite superpozíciu troch kvantových bitov, pre ktorú meraním určíme klasický obsah 1111) s pravdepodobnosťou \, hodnotu |000) s pravdepodobnosťou \ a každú zo zvyšných hodnôt s rovnakou pravdepodobnosťou. y Aké operácie sú možné v kvantovom svete? Ako sa v jednom kroku kvantového výpočtu dá zmeniť superpozícia na inú superpozíciu? Možné sú také výpočtové kroky, ktoré dostaneme ako vynásobenie superpozície (reprezentovanej vektorom) určitými maticami. Tieto matice majú špeciálnu vlastnosť, že zo superpozície vytvoria novú superpozíciu. Zvyšok tejto časti je určený len čitateľom so záujmom o matematiku. Ostatní môžu preskočiť na časť 9.4. Superpozíciu ai • |00> + ol2 ■ |01) + a3 ■ 110) + a4 ■ 111) si môžeme predstaviť ako stĺpcový vektor /«! \ a3 V "4 J 9.3 AKO POČÍTAME VO SVETE ČASTÍC? 265 o o CN Keď chceme zapísať stĺpcový vektor v riadku, urobíme to takto: (ai, a2, 0:3, a4)T, kde t označuje transpozíciu. Riadkový vektor sa dá vynásobiť stĺpcovým nasledujúco / «1 \ a2 V "4 J Výsledkom je komplexné číslo (nie vektor). Maticu n x n si môžeme predstaviť ako n riadkových vektorov. Napríklad matica 4x4 aifii + a2(32 + "3/33 + a^At- M í all a12 a13 a14 N\ a2i a22 a2% a24 «31 a32 ŕ*33 a34 y 041 042 043 044 ) sa skladá zo štyroch riadkových vektorov (au, ai2, 013, 014) (021,022, «23, a24) (,^31) a32, ^33, a34j (041,042,043,044). Takže vynásobením matice M stĺpcovým vektorom a = (a±, a2,a%, oí4)t dostaneme zasa stĺpcový vektor fi = (fii, fi2, /J3, fi4)T, v ktorom je i-ta pozícia súčinom i-teho riadkového vektora v M s a. Presnejšie M • í ai \ a2 V a4 "k kde í ^ \ AÍ2 Aí3 V /i4 y a2 uí — (aí,l) ai,2, aí,3) aí,4) VO? «3 V «4 y «1,1 ' al + aí,2 ■ ®2 + Oj 3 • «3 + <2j 4 • OJ4. Aplikovanie M na superpozíciu chápeme ako jeden výpočtový krok. Ak je pre každú superpozíciu a (reprezentovanú stĺpcovým vektorom) výsledok M • a tiež superpozíciou (v našom príklade to znamená, že y\ + /x2, + ^3 + y\ = 1), potom je M povolená operácia. 266 KAPITOLA 9 V nasledujúcom príklade ukážeme ako sa dajú na kvantovom počítači generovať náhodné bity. Príklad 9.4 Máme k dispozícii jeden kvantový register. Začneme s „klasickou" superpozíciou |0) = l-|0) + 0-|l). Vykonáme jeden výpočtový krok: vynásobíme túto superpozíciu Hadamardovou maticou H2 = Výsledkom násobenia bude: 1 1 V2 1 1 V2 V2 1 1 V2 1 1 V2 V2 1 \ \ ~ \ 1 1-^ + °-r7 Dostali sme superpozíciu Ak meriame túto superpozíciu, s rovnakou pravdepodobnosťou \ dostaneme klasický bit |0) alebo |1). V prípade, že začneme s „klasickou" superpozíciou |1)=0-|0) + 1-|1)! ktorú vynásobíme opäť maticou H2, dostaneme l) [o A + 1 (-*) j {-TJ' Výsledkom je superpozícia Pretože platí a2 = =^a/^2 = (—"Tl) = h výsledky merania |0) aj |1) dostaneme s rovnakou pravdepodobnosťou \. Co to znamená? V oboch prípadoch sme dostali pri meraní náhodný bit, ale nie sme schopní rozlíšiť, ktorú z dvoch superpozícií • |0) + • |1) a • |0) — • |1) sme merali. □ Úloha 9.3 Nájdite ešte aspoň dve ďalšie superpozície kvantového bitu, v ktorých s rovnakou pravdepodobnosťou nameriate hodnoty |0) a |1). 1 1 V2 1 1 V2 V2 9.3 AKO POČÍTAME VO SVETE ČASTÍC? 267 Úloha 9.4 (tvrdý oriešok) Dokážte, že matica H2 má tú vlastnosť, že pre každú superpozíciu a • |0) + (3 ■ |1) je tiež superpozícia, že teda platí 72 + ô2 = 1. Úloha 9.5 (tvrdý oriešok) Výpočet kvantového počítača je reverzibilný7. Ked nevykonávame merania, ktoré by zničili dosiahnuté superpozície, je možné použitím vhodných výpočtových krokov nechať výpočet prebiehať naspäť do počiatočného stavu. V príklade 9.4 to znamená, že existuje matica M rozmeru 2x2 taká, že Nájdite maticu M. Teraz aspoň do určitej miery chápeme, ako sa dá počítať vo svete častíc. Rôznym stavom častíc (napríklad spinu) musíme vhodným spôsobom priradiť hodnoty 0 a 1. Kvantové operácie vykonávame so superpozíciami kvantových bitov. Matematicky vykonávame operácie ako vynásobenie vektora, reprezentujúceho superpozíciu, maticou. Povolené sú len matice, ktoré transformujú superpozíciu zase na superpozíciu. V kvantovom svete sa dajú uskutočniť všetky operácie, založené na takýchto maticiach. Pritom je zrejmá jedna z najdôležitejších výhod kvantového počítača. Keď počítame s n kvantovými bitmi, máme superpozíciu všetkých 2" možných klasických obsahov n kvantových bitov: V jednom výpočtovom kroku sa zmení celá superpozícia. Simulovať krok výpočtu kvantového počítača na klasickom počítači nevieme lepšie než vynásobením 2n-rozmerného vektora (ao, ai, • • •, a2n-i)T maticou rozmeru 2n x 2n. Pri takejto simulácii kroku kvantového výpočtu s n bitmi potrebujeme vzhľadom na n exponenciálne veľa aritmetických operácií. Ďalšia výhoda kvantového počítania je už spomínaná interferencia, ktorá použitím vhodných kvantových operácií umožňuje vzájomné zrušenie niektorých možností a súčasné zvýšenie pravdepodobnosti výskytu iných. Dnes poznáme viaceré problémy, pri ktorých sú kvantové algoritmy podstatne efektívnejšie, než najlepšie známe klasické algoritmy. Žiaľ potrebné matematické a algoritmické vedomosti potrebné na ich vysvetlenie sú príliš zložité na prezentovanie v zrozumiteľnej forme bez použitia matematického formalizmu. Preto len a0 • |00 ... 0) + ai • |00 ... 01) + ... + a2»-i • |11... 1). 7 dá sa obrátiť 268 KAPITOLA 9 napríklad spomenieme, že existuje efektívny kvantový algoritmus na faktorizáciu8 prirodzených čísiel. Ako už vieme, faktorizovat' nie sme efektívne schopní pomocou klasických algoritmov. To predstavuje nebezpečenstvo pre kryptografiu s verejnými kľúčmi, ktorá je založená na výpočtovej obťažnosti faktorizácie. Ale netreba sa plašiť, môžeme ďalej pokojne spávať. Najväčšie vytvorené kvantové počítače majú najviac sedem kvantových bitov, teda dokážu pracovať len s číslami, ktoré vieme reprezentovať siedmimi bitmi. A ako vieme, v kryptografii s verejným kľúčom sa pracuje s číslami, ktoré majú niekoľko tisíc bitov. Budúcnosť ukáže, či je kvantové počítanie užitočné pre reálne spracovanie údajov. To je téma nasledujúcej časti. 9.4 Co prinesie budúcnosť? Odpoveď nepozná nik. Aby sme si lepšie ozrejmili perspektívy kvantového počítania, objasníme, v čom spočívajú problémy pri vývoji tejto technológie. Matematický model kvantového sveta nám poskytol nástroj na vytvorenie kvantových algoritmov. Tieto algoritmy sú pri riešení niektorých problémov neočakávane efektívne. Pre výpočty s nimi potrebujeme kvantový počítač s takým počtom kvantových bitov, aká je veľkosť spracovávaných údajov. Máme už aj predstavu, ako stavom častíc realizovať kvantové bity. V čom teda väzí problém? Kvantový počítač je extrémne citlivý, vlastne je citlivejší ako hocičo, čo poznáme z klasického sveta. Povedať niekomu: „Si citlivejší ako kvantový počítač", je hrubá urážka. Keď do počítajúceho kvantového počítača prenikne jediná častica (napríklad elektrón), nenávratne sa zmení doteraz prebiehajúci výpočet. Superpozíciu nevieme znovu zrekonštruovať a celý výpočet musíme spustiť odznova. Rovnako ako meranie ovplyvní meraný objekt, aj každá častica, ktorá prenikne do kvantového počítača, ovplyvní jeho výpočet. Kvantový počítač preto musíme celkom izolovať od okolitého prostredia. Ale to je ťažšia úloha ako vybudovať nepreniknuteľný trezor. Častice sú všade, aj v materiáli, ktorý by sme použili na izoláciu v reálnom svete. To je dôvod používania vákua, teplôt blízkych absolútnej nule a ďalších opatrení. Vieme, že žiaden systém nedokážeme izolovať od vplyvov prostredia ľubovoľne dlho. Úloha je izolovať ho aspoň na zlomok sekundy, pretože kvantový výpočet môže prebehnúť veľmi rýchlo. Základná predstava nie je skonštruovať všeobecný kvantový osobný počítač (kvantové-PC) použiteľné na rôzne aplikácie. Cieľom je postaviť jednoúčelový špecializovaný kvantový počítač, ktorý rieši len jednu špecifickú výpočtovú úlohu. To znamená, aby sme mohli vykonať jeden konkrétny kvantový algoritmus, musíme preň vytvoriť kvantový počítač, ktorý nebude okrem tejto konkrétnej úlohy riešiť rozklad na prvočinitele 9.4 ČO PRINESIE BUDÚCNOSŤ? 269 nič iné. Fyzici sú schopní skonštruovať kvantové počítače s malým počtom bitov (3 až 7) a vykonať na nich niektoré kvantové algoritmy. Situácia je do určitej miery podobná DNA-počítaniu. V súčasnosti táto technológia v žiadnom prípade nekonkuruje klasickým počítačom. V momente, keď objavíme lepšiu technológiu na vytvorenie kvantových počítačov sa situácia dramaticky zmení. Budeme musieť revidovať definíciu prakticky riešiteľného a neriešiteľného. Teoretici už majú takúto novú teóriu zložitosti pripravenú vo svojich šuplíkoch. Možnosť efektívne faktorizovat' by zmenila do veľkej miery kryptografiu. Doterajšia kryptografia s verejnými kľúčmi by už nebola bezpečná voči protivníkovi, ktorý by na faktorizáciu použil kvantový počítač. Alebo by predsa bola? Možno sa podarí skonštruovať kvantový počítač len s niekoľkými stovkami bitov, takže pri použití čísiel s niekoľko tisíc desiatkovými ciframi budeme kryptografiu s verejným kľúčom ďalej úspešne používať. Je jedno, ako to dopadne, takýto pokrok nemôžeme chápať negatívne, aj keby sme kvôli nemu museli doterajšiu kryptografiu hodiť do koša. Každý pokrok zo sebou prináša aj nové možnosti. Kvantové efekty umožňujú realizovať kryp-tosystémy s veľmi vysokou mierou bezpečnosti. Ich princíp je založený na možnosti vytvoriť tzv. previazanú superpozíciu, ktorá má špeciálnu vlastnosť, že bez ohľadu na aktuálnu vzdialenosť oboch častíc, keď zmeriame stav jednej častice, neskorším meraním stavu druhej častice, dostaneme rovnaký stav druhej častice ako sme namerali pri prvej častici. Takýmto spôsobom sa dve strany môžu dohodnúť na náhodnom bite, ktorý použijú ako kľúč. V praxi si to môžeme predstaviť takto: príjemca a odosielateľ majú každý jednu zo vzájomne previazaných častíc. Obaja vykonajú merania na svojej častici. Je jedno, ktorý z nich bude merať ako prvý. Dôležité je, že obaja namerajú ten istý klasický stav (klasický bit 0 alebo 1). Je tak, pretože prvé z meraní spôsobí, že obe častice zmenia svoj stav na rovnaký klasický stav. Pri druhom z meraní odmeriame už len tento klasický stav. Ak prijímate! a odosielateľ uvedeným spôsobom vygenerujú náhodnú postupnosť bitov, môžu ju použiť ako kľúč v symetrickom kryptosystéme. Tento kvantový efekt predpovedali fyzici už pred mnohými rokmi. Albert Einstein neveril, že sa túto predpoveď podarí experimentálne overiť. Argumentoval, že tento jav, nazývaný teleportácia, protirečí princípu lokálnosti fyzikálnych účinkov. Cieľom experimentu je ukázať, že po zmeraní prvej častice, stav druhej častice skolabuje do zodpovedajúceho klasického stavu rýchlejšie, než prejde svetlo z miesta prvej častice na miesto druhej častice. Takýmto spôsobom sa chceme presvedčiť o nemožnosti ovplyvnenia stavu jednej častice tým, že by sa jej „poslala" informácia o zmene stavu druhej častice, pretože rýchlosť svetla sa považuje za hornú hranicu rýchlosti. Experimentálne ov- 270 KAPITOLA 9 erenie bolo veľmi ťažké kvôli vysokej rýchlosti svetla. Napriek tomu vedci ho boli schopní úspešne uskutočniť na vzdialenosť 600m ponad rieku Dunaj neďaleko Viedne. Časy prvých objaviteľov sa neskončili a nikdy sa neskončia. Veda je vzrušujúca a môžeme sa tešiť ešte na mnoho dobrodružstiev a pravých zázrakov. Návody na riešenie vybraných úloh Úloha 9.1 Uvažujme superpozíciu: ^■|0)-i-|l). 1 3 / 1\2 1 - • 3 = - a Je zrejme, že (2""; 4 ~ A~ \ 2) 4 Takže klasickú hodnotu |1) nameriame s pravdepodobnosťou \. Vidíme, že super-pozícia tiež spĺňa naše požiadavky. Môžeme sa zamyslieť, ktoré ďalšie superpozície a ■ |0) + (3 • |1) spĺňajú podmienky a2 = 3/4 a d2 = 1/4. Je očividné, že meraním nikdy nezistíme superpozíciu, v ktorej sa nachádza kvantový systém. Úloha 9.2 Vo všeobecnosti máme pre tri bity 23 = 8 možných rôznych obsahov 000, 001, 010, 011,100,101,110 a 111. Teda každý stav kvantového registra s tromi bitmi je superpozícia a0 ■ |000> + olx ■ |001> + oi2 ■ |010> + a3 ■ |011) +a4 ■ |100> + a5 ■ |101) + a6 • |110) + a7 ■ 1111) ôsmych klasických stavov, kde 2 \ - 9 ari < 1 pre i = 0,1,... , 7 a y, a- i=0 a) Keď je rovnaká pravdepodobnosť, že nameriame hociktorý z ôsmich klasických stavov, potom musí platiť ag = a2 = a2, = ... = a2 = |. Pretože 9.4 ČO PRINESIE BUDÚCNOSŤ? 271 dostaneme aQ = ol\ = 0l2 = ... = aj = , ako jednu z možností. Viete navrhnúť ďalšie možnosti? b) Okrem obsahov 1111) a |000) existuje ešte šesť ďalších možných obsahov. Keď 1000) pozorujeme s pravdepodobnosťou \ a |m) pozorujeme s pravdepodobnosťou \, je pravdepodobnosť pozorovania všetkých ostatných možností \ (súčet všetkých pravdepodobností musí byť 1). Pravdepodobnosť \ musí byť rovnomerne rozdelená medzi zvyšných šesť obsahov. Takže pravdepodobnosť pozorovania niektorého zo zvyšných obsahov je 1/4 _ 1 6 ~6~ ~ 24 ~ 144' Nasledujúca superpozícia spĺňa naše požiadavky na pravdepodobnosti pozorovania daných klasických stavov: \ ■ |000> + ■ |001> + ■ |010) + -j-y/E ■ |011) + Z/ 1Z 1Z ]^ jĹj ^Vě- |ioo) + ^-Vě- |ioi) + ^-Vě- |no) + |in). Úloha 9.4 Vynásobíme Našou úlohou je ukázať, že 7-|0)+ Cena(RiešenieA(I)) KonkAl-í) = -• Konk^J) vyjadruje koľkokrát horšie je riešenie Riešenie^/) algoritmu a vzhľadom na nejaké optimálne riešenie. Napríklad keď Opt;y(/) = 100 (optimálne riešenia pre / majú cenu 100) a Cena(Riešeniej4(/)) = 130 (riešenie vypočítané pomocou algoritmu a má cenu 130), znamená to, že Konk4(/) = — = 1.3 a teda, že vypočítané riešenie je 1,3-krát horšie ako najlepšie možné. Inými slovami Riešenie^/) má o 30% vyššiu cenu ako optimálne riešenia pre /. Teraz vieme určiť, aký dobrý je online algoritmus a na jednom prípade úlohy /. Celkovú kvalitu algoritmu a meriame z hľadiska záruky, ktorú je a schopný poskytnúť pre každý5 prípad úlohy. Preto definícia kvality algoritmu a vyzerá nasledujúco: 3V informatike hovoríme často „v najhoršom prípade". 10.2 MERANIE KVALITY ONLINE ALGORITMOV 277 Povieme, že A je ^-konkurencieschopný online algoritmus pre U, ak pre všetky prípady / úlohy U platí: Konk^J) < Ö. Ak platí Konkj4(J) = 1.3 pre všetky prípady / úlohy U (ak je teda A 1.3 -konkurencieschopný), znamená to, že A pre žiadny prípad úlohy nevypočíta riešenie, ktoré by bolo o viac ako 30% horšie od optimálneho. Pre veľa prípadov úlohy sa môže stať, že A vypočíta aj oveľa lepšie riešenie. Pre mnohé ťažké online úlohy môže byť už takáto záruka potešiteľná. Úloha 10.1 Nech pre prípad úlohy I je Opt;y(/) = 90. Predpokladajme, že náš online algoritmus A vypočíta Riešenie^/) s cenou. Cena(Riešeniej4(/)) = 135. a) Určite konkurenčnú schopnosť algoritmu A pre /. b) o koľko percent je Riešenie^ (/) horšie ako optimálne riešenie pre I? Úloha 10.2 Pre každý prípad problému / sme definovali čísla Opt;y(/) a Cena(Riešeniej4(/)). Čo vyjadruje nasledujúce číslo Cena(RiešenieJ4(/)) — Optu(I) o*,(/> Predpokladajme, že pre nejakú optimalizačnú úlohu U sme navrhli nejaký online algoritmus A a chceme analyzovať konkurencieschopnosť algoritmu A. To je zvyčajne veľmi ťažká matematická úloha. Poznáme množstvo online algoritmov pre rôzne úlohy, pre ktoré sa napriek dlhoročným pokusom nepodarilo zistiť ich konkurencieschopnosť. Obťažnosť tejto analýzy spočíva v tom, že hľadáme maximálnu hodnotu Konk^J) vzhľadom na nekonečne veľa prípadov problému /. Informatici používajú na analýzu konkurencieschopnosti online algoritmov symbolickú hru medzi dvoma hráčmi - navrhovateľom algoritmu a jeho protivníkom. Navrhovateľ algoritmov sa pokúša navrhovať online algoritmus a jeho protivník sa pokúša dokázať pre navrhnutý algoritmus prostredníctvom návrhu konkrétnych ťažkých prípadov problému, že navrhnutý algoritmus nie je z hľadiska konkurencieschopnosti dobrý (obr. 10.1). V tejto hre môžeme navrhovateľa algoritmu považovať za na nadšeného optimistu, ktorý sa raduje z výsledkov svojej práce. Jeho protivníka môžeme pokladať za skeptika, ktorý má pochybnosti o všetkých produktoch navrhovateľa algoritmov a pokúša sa odôvodniť svoju skepsu. Dobré výskumné tímy potrebujú oba typy - pesimistov i optimistov. Takto prichádzajú na svet 278 KAPITOLA 10 Pozri na môj výborný algoritmus A Tak skús použiť A na prípad /. Budeš sa diviť. obr. 10.1 s nadšením nápady, ktoré budú dôsledne overené, opravené a v konečnom dôsledku vylepšené. Pri analýze konkurencieschopnosti online algoritmov prisudzujeme protivníkovi veľkú dávku prefíkanosti alebo dokonca „zlomyseľnosti". To je vec jeho výhodnej hráčskej situácie. Protivník pozná online algoritmus A a je schopný naplánovať budúcnosť tak, aby A nebol úspešný. Pretože mu je A známy, vie protivník aké čiastkové riešenie A vypočíta pre každú časť (prefix) vstupu. Preto hru môžeme vidieť takto. Protivník ukáže kúsok budúcnosti a počká, čo s tým A urobí. Potom protivník určí ďalšiu časť vstupu. Po tom, ako si pozrel (alebo sám vypočítal), ako na to A reaguje, zostaví ďalšie vstupné požiadavky. Vďaka tomuto postupu môže protihráč úspešne vodiť algoritmus A za nos. Ak sa to protihráčovi podarí, tak tým dokázal, že konkurencieschopnosť algoritmu A nie je vysoká (dobrá). Nasledujúcim príkladom zabijeme jedným úderom tri muchy. Najprv ilustrujeme definíciu konkurencieschopnosti pomocou konkrétneho príkladu. Po druhé názorne predvedieme, ako môže prefíkaný protivník znemožniť každý online algoritmus pre danú úlohu. A po tretie pochopíme, že naozaj existujú úlohy, pre ktoré neexistuje úspešný online algoritmus. Príklad 10.1 Stránkovanie6 Stránkovanie je aktuálna úloha, ktorá sa musí nepretržite riešiť v každom počítači. V počítači máme minimálne dva druhy pamäti, jednu malú a jednu veľkú. Malá časť sa volá Cache7 a v tejto pamäti máme k údajom super rýchly prístup. Veľká pamäť sa volá hlavná pamäť a je podstatne väčšia ako Cache (obr. 10.2) Prístup k údajom v hlavnej pamäti je pomalý. V podstate je to dokonca tak, že počítač môže priamo spracovávať len údaje, ktoré sú uložené v pamäti Cache. Ak chce počítač nahliadnuť do údajov, alebo spracovávať údaje, 6V angličtine „paging" 7 v slovenčine vyrovnávacia pamäť, zvážiť, či nedať všetko buď slovensky, alebo anglicky :-) 10.2 MERANIE KVALITY ONLINE ALGORITMOV 279 hlavná pamäť CPU-- 1 2 1 k \ I I Cache obr. 10.2 ktoré nie sú v Cache, musí najprv tieto údaje do cache preniesť, a potom ich môže odtiaľ čítať. Preto sa počítač „snaží" mať uložené v Cache všetky aktuálne údaje, ktoré sa budú v najbližšom čase spracovávať. To sa ale nedá zaručiť, pretože počítač nepozná budúcnosť, a teda nevie, ku ktorým údajom bude chcieť používateľ mať v najbližšom čase prístup. Počítač dostáva len z času na čas isté požiadavky, poskytnúť k nahliadnutiu alebo spracovať isté údaje. Ak tie údaje nie sú v Cache, musí ich tam pretransportovať. Pretože Cache je zvyčajne plná, musí počítač najprv nejakú časť údajov v Cache vymazať alebo z Cache preniesť do hlavnej pamäti. A teraz prichádza priestor pre online stratégie. Ktoré údaje máme vybrať (odstrániť) z Cache? Samozrejme tie, ktoré nebudeme pri najbližších požiadavkách potrebovať! Modelujme vzniknutú situáciu presnejšie. Obidve pamäti sú rozdelené do dátových blokov, ktoré nazývame stránky. Cache môže obsahovať nanajvýš k stránok, pre nejaké pevné číslo k, a typicky obsahuje práve k stránok, teda je plná. Hlavná pamäť obsahuje všetky potrebné údaje, takže tam môže byť uložené obrovské množstvo údajov. Medzi cache a hlavnou pamäťou sa dajú „prenášať" len celé stránky. Celé to pripomína hru s hrubou knihou, v ktorej môžeme mať otvorených naraz najviac k strán. Ak chceme vidieť nejakú novú stranu, musíme najprv jednu z k otvorených strán zavrieť. Z toho dôvodu voláme túto úlohu stránkovanie (listovanie). Príklad prípadu stránkovanie je napr. postupnosť 7 = 3,107,30,1201,73,107,30 Tento prípad stránkovania zodpovedá požiadavke čítať stránky s číslami 3, 107, 30, 1201, 73, 107 a 30, v tomto poradí, jednu po druhej, stránky 107 a 280 KAPITOLA 10 30 si pozrieme dokonca dvakrát. Stránku 107 najprv v druhom a potom v šiestom časovom odseku. To znamená, že by bolo chybou vyhodiť po prvom pozretí z Cache stránku 107, pretože by sme ju v takom prípade museli pred šiestym časovým okamihom zase preniesť nazad do Cache. Vzhľadom na to, že stránkovanie prezentujeme ako úlohu minimalizácie, potrebujeme merať cenu jednotlivých riešení. Časy potrebné na prenos údajov medzi hlavnou pamäťou a Cache a na prístup k údajom v Cache sú natoľko rozdielne, že stanovíme • cenu 0 za prístup na stránku v Cache a • cenu 1 za prenos údajov z hlavnej pamäte do Cache. Uvažujme nasledujúcu konkrétnu situáciu. Máme cache veľkosti 3 (k = 3), ktorá obsahuje práve 3 stránky 5, 30 a 107. Teraz dostaneme už spomínaný prípad úlohy 1 = 3, 107, 30, 1201, 73, 107, 30. Nasledujúce optimálne riešenie má cenu 3. Počítač najprv prenesie stránku 3 z hlavnej pamäti do Cache a súčasne s tým stránku 5 z Cache do hlavnej pamäte. Túto výmenu stránok 3 a 5 medzi Cache a hlavnou pamäťou budeme zapisovať v nasledujúcom texte symbolicky ako 5-3 Ďalšie požadované strany 107 a 30 sú už v Cache k dispozícii, a preto nedochádza k žiadnemu prenosu údajov medzi Cache a hlavnou pamäťou. Potom prenesieme stranu 1201 z hlavnej pamäti na miesto stránky 3 v Cache. Strany 30 a 107 z Cache neodstránime, lebo vieme, že ich v budúcnosti ešte budeme potrebovať. V piatom kroku vymeníme stránku 1201 za stránku 73. Posledné dve požiadavky 107 a 30 môžeme realizovať bez komunikácie s hlavnou pamäťou. Hore opísané riešenie môžeme v krátkosti symbolicky zapísať ako 5 — 3, •, •, 3 — 1201,1201 — 73, •, • kde • symbolizuje časový interval, v ktorom neprebieha žiadna komunikácia medzi Cache a hlavnou pamäťou. Označenie a — b symbolizuje výmenu stránky a z Cache za stránku b z hlavnej pamäti. Tabuľka 10.1 znázorňuje obsah Cache v uvažovaných ôsmich časových intervaloch. To, že naše riešenie je optimálne, môžeme tvrdiť vďaka tomu, že na začiatku nie sú stránky 3,1201, a 73 v Cache. Takže je jasné, že pri požiadavkách 7 = 3,107, 30,1201, 73,107, 30 tam niekedy musia byť prenesené, a teda sú nevyhnutné minimálne tri akcie prenosu údajov z hlavnej pamäti. Úloha 10.3 Nájdite optimálne riešenia pre nasledujúce prípady úlohy stránkovania: 10.2 MERANIE KVALITY ONLINE ALGORITMOV 281 čas 0 1 2 3 4 5 6 7 operácia 5^3 • • 3 1201 1201 73 • • 5 3 3 3 1201 73 73 73 Cache 30 30 30 30 30 30 30 30 107 107 107 107 107 107 107 107 načítané 3 107 30 1201 73 107 30 Tabuľka 10.1 a) k = 3, Cache obsahuje 1,2,3 a I = 7,9,3,2,14,8, 7 b) k = 5, Cache obsahuje 1,101,1001,1002, 9 a I = 1002, 7,5,1001,101,3,8, 1,1002 Na riešenie daného prípadu môže existovať veľa riešení. Ak požadujeme stránku, ktorá nie je v Cache, tak máme k možností, ktorú stránku z Cache vymeníme za požadovanú novú stránku. S dĺžkou postupnosti požiadaviek na čítanie stránok exponenciálne rastie počet možných riešení a situácia sa môže stať neprehľadnou. Napriek tomu vždy existuje možnosť nájsť (aj keď s nemalým úsilím) optimálne riešenie. Ak ale stojíme pred stránkovaním ako online úlohou, mení to podstatne situáciu. Požiadavky prichádzajú osobitne jedna po druhej. Až po splnení prijatej požiadavky, vďaka čomu sme potenciálne odstránili z Cache nejakú stránku, dostaneme ďalšiu požiadavku. Protivník má v tejto hre príliš veľa priestoru a môže sa správať značne zlomyseľné. V ďalšej požiadavke si zvolí vždy tú stránku, ktorú sme práve z pamäti odstránili. Takto dosiahne stav, keď každá jeho požiadavka zapríčiní výmenu stránok medzi Cache a hlavnou pamäťou. Tým sa maximalizuje cena riešenia, lebo väčšia ako počet požiadaviek ani nemôže byť. Predveďme si to na konkrétnom príklade. Položme k = 3 a predpokladajme, že Cache obsahuje stránky 1, 2 a 3. Protivník požaduje stránku 4. Jednu stránku z Cache musíme teda odstrániť. Predpokladajme, že uvažovaná online stratégia odstráni stránku 2, t.j. vykoná akciu 2 4. V takom prípade žiada protivník stránku 2. Tá ale už nie je v Cache, a teda ju tam musíme preniesť. Predpokladajme, že online algoritmus realizuje 4^2. Následne požaduje protivník stránku 4. Ak sa online stratégia rozhodne pre 1^4. tak v ďalšom protivník požaduje stránku 1, čo možno splniť akciou 4^1. Takto vytvoril protivník prípad úlohy 4,2,4,1 a online algoritmus vyprodukoval riešenie 2 4,4 > a) k = 4, Cache obsahuje 1, 2, 3,4, prípad / má pozostávať z postupnosti štyroch požiadaviek a Optstránkovanie{I) = 1. b) k = 5, Cache obsahuje 1,7,103,5,9 a pre navrhnutý ťažký prípad stránkovania o 10 požiadavkách má platiť Opt stránkovanie(I) = 2. Zovšeobecnime naše doterajšie skúsenosti a dokážme, že pre každý online algoritmus A pre stránkovanie Cache s k stránkami existuje prípad stránkovania / taký, že a teda neexistuje žiadna online stratégia, ktorá by poskytovala uspokojivé riešenia pre všetky prípady stránkovania. Predpokladajme, že v Cache, ktorá má veľkosť k stránok, máme stránky 1, 2, 3,4,..., k. Nech A je ľubovoľný online algoritmus pre úlohu stránkovania. Protivník začne konštruovať prípad úlohy požiadavkou k + 1. Pretože stránka k+1 v Cache nieje, A ju musí vymeniť za jednu zo stránok 1,2,... ,k. Nech A urobí rozhodnutie Si k + 1 pre nejaké si z {1,2,..., k} . Teraz Cache obsahuje stránky 3 4, •, •, • 1, 2,..., si - 1, si + 1,..., k, k + 1 10.2 MERANIE KVALITY ONLINE ALGORITMOV 283 V tomto prípade pokračuje protivník s požiadavkou Si. Stránka si nie je v Cache, a tak musí A zase nariadiť výmenu stránok medzi Cache a hlavnou pamäťou. Nech A spraví rozhodnutie S2 Si pre nejaké s2 z {1, 2,..., k, k + 1} — {si}. Teraz obsahuje Cache stránky 1,2,..., s2 — 1, s2 + l,.. •, k+1 (presnejšie všetky stránky i E {1,2,... k + 1} — {s2}). Prirodzene protivník teraz požaduje práve tú chýbajúcu stránku s2. Týmto spôsobom môžeme pokračovať tak dlho, kým protivník nevytvorí prípad úlohy IA = k + l, si, s2,..., Sfc-i dĺžky fcas obťažnosťou Cena(Riešeniej4(/J4)) = k. <\ Všimnite si, že pre rôzne online stratégie vznikajú rôzne prípady problému. Tvrdíme, že platí Opt stránkovanie^^0 ^' Pokúsme sa to zdôvodniť. Ak od začiatku poznáme celý prípad IA, môžeme postupovať takto. Hodnoty s1,s2,..., sk_i sú všetky z {1,2,...,k + 1} a je ich presne k — 1. To znamená, že existuje číslo j z {1,2,... ,k}, ktoré sa nenachádza medzi hodnotami s1,s2 ..., s^-i, čo znamená, že stránka j v IA nebude nikdy požadovaná na nahliadnutie. Preto pri prvej požiadavke na stránku k + 1 zvolíme akciu j k + 1. Po tejto akcii nie je potrebný žiadny prenos údajov medzi Cache a hlavnou pamäťou, pretože všetky stránky s1,s2 ... s^-i, ktoré zodpovedajú nasledujúcim k — 1 požiadavkám prípadu úlohy IA, sú už v Cache. Zo stránok {1, 2,... k + 1} chýba v Cache len stránka j, ktorá ale nie je v IA nikdy požadovaná. (Ak napr. k = 4 a IA = 5, 3,1,4, tak j = 2, a tak je riešenie 2 5, •, •, • optimálne). Pretože Optstránkovanie(IA) = 1, dostávame V j r , i j \ Cena(Riešeniej4(/J4)) k KonkA(IA) = ——-—- = — = k, ť m + °-25 ' m m + \ m Pre veľké m to znamená, že online vypočítané riešenia môžu byť o takmer 25% horšie ako optimálne. Aby sme ukázali, že každý prípad úlohy možno riešiť v m + ym časových jednotkách, uvedieme pre väčšinu čitateľov úplne nový druh argumentácie. Pre každý prípad problému budeme uvažovať viacero algoritmov a ukážeme, že riešenie vyprodukované týmito algoritmami vyžadujú v priemere m + \fm časových jednotiek. Ak riešenia potrebujú v priemere m + \pm časových jednotiek, tak medzi nimi musí byť jedno, ktoré potrebuje nanajvýš m + \fm časových jednotiek. Odôvodnenie tejto úvahy je jednoduché. Ak by všetky riešenia potrebovali viac než m + \pm časových jednotiek, tak priemer počtu časových jednotiek týchto riešení nemôže byť m + \fm. Pre zjednodušenie uvažujme, že m = k2 pre nejaké prirodzené často k, a teda y/m = k je celé číslo. Budeme uvažovať 2k + 1 diagonálnych stratégii. Hlavnú diagonálu celej tabuľky zo štartu do cieľa označíme D0. Diagonálu v tabuľke, ktorá leží i políčok nad D0 označíme D i. Analogicky označíme D_j diagonálu, ktorá leží j políčok pod D0. Na obr. 10.13 vidíme tri hrubé čiary, predstavujúce diagonály D0,D2 a £L3. Každej diagonále D\ môžeme priradiť jednu stratégiu SDi, ktorá sa usiluje prejsť všetkými vrcholmi diagonály D\. Pre každé i > 0 urobí SDi najprv i horizontálnych krokov a dosiahne tak najvyšší vrchol diagonály A- Ak narazí na prekážku, tak SDi obchádza túto prekážku najprv horizontálnou a potom vertikálnou hranou (obr. 10.14) s cieľom vrátiť sa po obchádzke na 10.3 RANDOMIZOVANÝ ONLINE ALGORITMUS 295 DC o o CN obr. 10.13 Di. Ak S-Dj dosiahne najspodnejší vrchol diagonály D,h tak na dosiahnutie cieľa S D,i použije vertikálne hrany na okraji. <\ Analogicky začína stratégia £>_j najprv s i vertikálnymi hranami a dosiahne tak najvyšší vrchol diagonály £Lj. Potom pokračuje, podobne ako SDi po diagonálnych hranách diagonály D-i a obchádza prekážky v dvoch krokoch s nárastom na D-i (obr. 10.14). Ak S D-i dosiahne najnižší vrchol diagonály D_i na dosiahnutie cieľa použije SD_i horizontálne hrany. 296 KAPITOLA 10 Na obrázku 10.14 vidíme riešenie stratégií SD0 a SD_3 pre prípad úlohy A1 = (1, 2, 3,4, 5, 6, 7, 8, 9) a A2 = (3, 2,1, 7, 5, 9,4, 8, 6). Úloha 10.13 Vypočítajte riešenia, ktoré dostaneme použitím stratégií SDi,SD2 a SD-2 pre prípad úlohy z obr. 10.14. Úloha 10.14 Uvažujme prípad úlohy A1 = (9,8,7,6,5,4,3,2,1) a A2 = (9, 7, 8, 4, 5, 6, 2, 3, 1). Načrtnite riešenia, ktoré dostaneme použitím stratégií SD3, SDq, SD-i a SD_2. Predpokladajme, že pre každý prípad plánovania s m pracoviskami použijeme všetkých 2k + 1 = 2 y/m + 1 diagonálnych stratégií a získame takto 2k + 1 rôznych riešení. Vypočítame priemernú kvalitu týchto riešení tak, že spočítame najprv súčet ich časov spracovania a potom ho vydělíme 2k + 1. Čas výpočtu riešenia SD,-, a SXLj je presne m + i + počet prekážok na Di(D_i), pretože: (i) S-Dj (SD-i) používa presne i vertikálnych a i horizontálnych hrán, aby dosiahla zo štartu diagonálu D i (D-i) a z konca diagonály prišla do cieľa. Preto majú obe objednávky zdržanie presne i časových jednotiek. (ii) Každú prekážku obídeme v riešení jednou horizontálnou a jednou verikál-nou hranou. Preto znamená každá prekážka oneskorenie o jednu časovú jednotku. /—V Označme pomocou SUM súčet všetkých oneskorení všetkých 2k + 1 riešení. Čitateľ, ktorý nemá vzťah k matematike môže nasledujúci výpočet preskočiť. k SUM = ^2 (Kl + počet prekážok na D i) i=-k k k = S N + S Pocet prekážok na D i i= — k i= — k k <2-YJi + m í=i {Toto bol najdôležitejší krok v našej úvahe. Keďže všetkých prekážok je m, nemôže byť súčet všetkých prekážok na 2k + 1 vybraných diagonálach väčší než m. Preto je hodnota druhej sumy zhora ohraničená číslom m.} 10.3 RANDOMIZOVANÝ ONLINE ALGORITMUS 297 fc-(fc+i) 2 {Už malý Gauss ukázal, že súčet prvých k kladných celých čísiel je presne k ■ (k + l)/2.} = k ■ (k + 1) + m = k2 + k + m = (\/m)2 + -^/m + m = 2m + Vydeľme súčet všetkých oneskorení počtom riešení. Dostávame priemerné oneskorenie: 2m + A/m ^- < wm = k. 2-^/m + l Z tohto dôvodu existuje aspoň jedno riešenie, ktoré sa oneskoruje nanajvýš o k časových jednotiek8. Teda existuje riešenie, ktoré vybaví všetky objednávky prípadu úlohy za čas nanajvýš m + \[m "v časových jednotiek. Úloha 10.15 (tvrdý oriešok) Pre naše úvahy sme použili lypm+X diagonálnych stratégií. Aký by bol výsledok nášho úsilia, keby sme počítali s Ay/m + 1 alebo m + 1 diagonálnymi stratégiami? Úloha 10.16 Vypočítajte priemerné zdržanie pre 7 stratégií od SD% až po SD-3 pre plánovanie na obr. 10.14. /—v Dokázali sme, že pre každý prípad plánovania dvoch objednávok pre m pracovísk je možné objednávky spracovať s oneskorením najviac \pm. Žiaľ, online algoritmy nie sú schopné zabrániť oneskoreniu m/4 = 0.25m. Pre veľké hodnoty m je m/4 podstatne viac než ^fm. Náš výsledok získame vďaka jednoduchej kombinatorickej úvahe, ktorá je napriek svojej jednoduchosti mocným a často používaným nástrojom matematických zdôvodnení. Toto kombinatorické tvrdenie môžeme sformulovať takto: Keď máme m objektov a každému priradíme nejakú číselnú hodnotu a priemerná hodnota objektov je d, potom medzi týmito objektmi existuje jeden s číselnou hodnotou najviac d a jeden s hodnotou aspoň d. i Ak by všetky riešenia mali oneskorenie aspoň k+í časových jednotiek, potom by priemerné oneskorenie muselo byť viac než k. 298 KAPITOLA 10 Nadišiel čas prekabátiť prešibaného protivníka. Zoberieme si na pomoc náhodu a pre úlohu plánovania navrhneme randomizovaný online algoritmus. Všimnite si, že všetky stratégie SDi sú online algoritmy. Každá diagonálna stratégia sa drží vrcholov svojej diagonály a obchádza prekážky rovnako bez ohľadu na to, ako sú rozmiestnené. Na svoje rozhodnutia nepotrebuje informácie o prípade úlohy okrem aktuálnych požiadaviek objednávok A\ a A2. Ako nám to pomôže? Vytvoríme randomizovaný online algoritmus D, ktorý: Pre každý prípad úlohy plánovania s m pracoviskami zvolí náhodne jednu z 2^/m + 1 stratégií SDi a použije ju na určenie riešenia. Keďže priemerné oneskorenie všetkých 2^/m + 1 stratégií je \/m + |, očakávame od algoritmu D relatívne dobré riešenia. Samozrejme nemôžeme vylúčiť, že pre daný neznámy prípad úlohy si D náhodne zvolí nevhodnú stratégiu. Napríklad, keď si randomizovaný online algoritmus D zvolí pre preňho neznámy prípad úlohy A1 = (l,2,3,...,m) = A2(l,2,3,...,m) diagonálnu stratégiu S Do, leží všetkých m prekážok práve na diagonále D0 a oneskorenie je najhoršie možné, t.j. m. To sa ale stane len s pravdepodobnosťou 1 2^/ňi + ľ Vzhľadom na to, že na ostatných diagonálach neležia žiadne prekážky, sú všetky ostatné prípady priaznivé. V týchto prípadoch má SDi oneskorenie presne i, pre všetky i. \ Úloha 10.17 Nech m = 9. Nájdite taký prípad úlohy, že všetky políčka diagonály D3 obsahujú prekážky. Určite jednotlivé oneskorenia všetkých diagonálnych stratégií. Ako sa môžeme pomocou matematických argumentov presvedčiť, že randomizovaný online algoritmus D je dobrý pre prax? Nemôže sa stať, že príliš často (s vysokou pravdepodobnosťou) dostaneme nie príliš dobré riešenia? Aby sme ukázali kvalitu algoritmu D, použijeme elegantnú kombinatorickú úvahu. Majme n objektov, ktoré sú označené kladnými celými číslami. V našom prípade sú objekty jednotlivé riešenia vytvorené diagonálnymi stratégiami a číselné označenia sú ich oneskorenia. Tvrdíme, že Aspoň polovica objektov má hodnotu menšiu alebo rovnú dvojnásobku priemernej hodnoty. 10.3 RANDOMIZOVANÝ ONLINE ALGORITMUS 299 Ako to zdôvodníme? Nech je d priemerná hodnota. Ak viac než polovica objektov má hodnotu väčšiu než 2d, tak priemer nemôže byť rovný d, musí byť väčší než d aj keby všetky ostatné objekty mali priradenú hodnotu nula (obr. 10.15). hodnota 2 x priemerná hodnota priemerná hodnota obr. 10.15 Dá sa to ukázať aj výpočtom. Nech g je počet objektov s hodnotou väčšou ako 2d a h je počet objektov s hodnotou najviac 2d. Je zrejmé, že g + h je počet všetkých objektov. Potom je súčet hodnôt všetkých objektov dohromady viac než g-2d + h-0 = 2dg. Priemerná hodnota d je potom aspoň 2dg g h Teda platí d > 2dg/(g h) a dostávame, že d ■ (g + h) g + h > 2dg > 2g > g- h Výsledok hovorí, že počet objektov g s hodnotami väčšími než 2d (dvojnásobok priemeru) nie je väčší než počet objektov h s hodnotami najviac ako dvojnásobok priemeru. Dôsledkom nerovnosti h > g je, že pre algoritmus D máme zaručené, že s pravdepodobnosťou najmenej 1/2 zvolí stratégiu, ktorej riešenie má oneskorenie najviac 2 • d m. Ak to niekomu ešte nestačí, môže použitú kombinatorickú úvahu zovšeobecniť: 300 KAPITOLA 10 Počet objektov s hodnotami väčšími než c-násobok priemeru je najviac c-tina (t.j. n/c) všetkých objektov. Ak zvolíme c = 2, dostaneme pôvodné tvrdenie. Úloha 10.18 (tvrdý oriešok) Zdôvodnite platnosť zovšobecneného kombinatorického tvrdenia. Na základe tohto kombinatorického tvrdenia môžeme povedať, že s pravdepodobnosťou aspoň 3/4 nájdeme riešenie, ktoré v najhoršom prípade spôsobí oneskorenie Ad. Tento výsledok dosiahneme voľbou c = 4 v zovšeobecnenom kombinatorickom tvrdení. Úloha 10.19 Akú záruku môžeme dať pre D na najväčšie možné oneskorenie s pravdepodobnosťou aspoň 9/10? Aká je horná hranica na veľkosť oneskorenia 7/8 všetkých diagonálnych stratégií s minimálnymi oneskoreniami? 10.4 Zhrnutie alebo ako sme prekabátili protivníka \ Pre množstvo procesov prebiehajúcich v praxi sú online problémy každodenným chlebom. Obzvlášť v oblasti služieb všetkého druhu nie je možné spoľahlivo predpovedať rozsah a štruktúru požiadaviek zákazníkov. Servisné strediská sa musia rozhodovať a realizovať svoje rozhodnutia bez toho, aby vedeli aké požiadavky ich v blízkej budúcnosti očakávajú. V mnohých situáciách majú riadiace centrá služieb chabé vyhliadky aplikovať nejakú rozhodovaciu stratégiu, ktorá by za žiadnych okolností neviedla k neuspokojivému vývoju. Úlohou algoritmikov je skúmať, pre ktorý druh online úloh máme možnosť navrhnúť online algoritmy garantujúce také dobré riešenia, ako keby sme poznali budúcnosť (všetky budúce požiadavky), a pre ktoré úlohy to nie je možné. Aby sme vedeli analyzovať rôzne situácie, hráme hru s dvomi hráčmi, navrhovateľom algoritmu a jeho protivníkom, navrhovateľom ťažkých prípadov úloh. Navrhovateľ vyvinie online algoritmus a jeho protivník sa snaží nájsť prípady úlohy, na ktorých tento algoritmus zlyhá. V hre má protivník značnú výhodu, pretože pozná navrhovaný algoritmus a môže zostaviť budúcnosť tak, aby bola pre algoritmus nepriaznivá. Preto je aj obťažné nájsť skutočne dobré online algoritmy. 10.4 ZHRNUTIE 301 No riadenie algoritmu pomocou náhodných procesov môže byť aj v prípade online algoritmov riešením zdanlivo bezvýchodiskových situácií. Z pohľadu hry stráca protivník v hre proti randomizovanému algoritmu svoju hlavnú výhodu. Protivník pozná síce do najmenších detailov randomizovaný algoritmus, ale nemôže predpovedať jeho rozhodnutia v konkrétnych situáciách, pretože tieto rozhodnutia sú náhodné a uskutočnia sa až v priebehu aplikovania randomizovaného algoritmu. V našom prípade s 2\Jm + 1 stratégiami musí protivník naraz hrať proti všetkým 2\/m + l stratégiám, pretože netuší, ktorá z nich bude náhodne zvolená. A protivník nemá žiadnu šancu nájsť prípad úlohy, ktorý by bol ťažký čo len pre zlomok týchto stratégií, pretože prípady, ktoré by boli obťažné pre viacej stratégií jednoducho neexistujú. To trocha pripomína futbalový zápas medzi dvoma mužstvami A a B. Ak hrá družstvo A podľa nejakej pevnej stratégie nezávisle od vývoja zápasu a tréner mužstva B ju odhalí, môže svojich hráčov doviesť vhodnou taktikou k úspechu. Ak ale mužstvo A hrá veľmi flexibilne a s veľkou mierou nevypočítateľnej hernej improvizácie (správa sa takmer „náhodne"), tak je veľmi ťažké aby tréner mužstva B proti nemu našiel nejakú vhodnú stratégiu. Z pohľadu návrhu randomizovaného algoritmu možno mať často úspech, ak máme k dispozícii skupinu deterministických algoritmov, ktoré pre väčšinu prípadov úlohy nájdu dobré riešenia a každý z nich zlyhá len pre malý počet prípadov úlohy. V takomto prípade stačí jednoducho zvoliť jeden z týchto algoritmov a použiť ho na riešenie daného prípadu úlohy. Keď každý deterministický algoritmus z tejto skupiny algoritmov zlyhá na rôznych prípadoch úlohy, takto navrhnutý randomizovaný algoritmus nájde s vysokou pravdepodobnosťou veľmi dobré riešenie. Návody na riešenie vybraných úloh Úloha 10.2 Pre každý prípad úlohy I je Cena(RiešenieJ4(/)) — Optu(I) absolútny rozdiel medzi optimálnou cenou a cenou riešenia vypočítaného algoritmom A. Hodnota Cena(RiešenieA(/)) - Opti/(7) oP%(/) hovorí o koľko percent je vypočítané riešenie horšie ako optimálne. Úloha 10.4 V Cache máme stránky 1, 3, 5 a 7. V prípade potreby odstránime vždy stránku s najmenším číslom. Pre túto stratégiu protivník skonštruuje nasledujúci prípad úlohy: 2,1,2,1,2,1,2,1,2,1. 302 KAPITOLA 10 o o CN Online stratégia odstránenia stránky s najmenším číslom skončí pre tento prípad s riešením: 1 — 2 , 2—1 , 1—2 , 2—1 , 1—2 1 1 1 1 1 Zrejme je 5 < 1 optimálne riešenie, ktoré je desaťkrát lepšie ako riešenie uvažovanej stratégie. Úloha 10.6 Pre prípad úlohy A\ = (1,2,3,4) a A2 = (3,2,1,4) poskytuje nasledujúce rozdelenie práce: časové jednotky 1 2 3 4 5 A! Si s2 A2 s2 Si 1S4 optimálne riešenie. Úloha 10.16 Všetkých 9 prekážok leží na siedmich uvažovaných diagonálach (obr. 10.14). Na Do ležia tri prekážky, takže s S Do dosiahneme oneskorenie do = 3. Na Di a D-i neležia nijaké prekážky, a teda celkové oneskorenie stratégií SDi a SD-i je 1 (di = d-i = 1). Oneskorenie je spôsobené dosiahnutím a opustením diagonály. Na D2 a na D-2 leží po jednej prekážke, teda oneskorenie oboch prípadov je d2 = d-2 = 3. Na D3 a D_3 leží po dvoch prekážkach, takže d% = d_3 = 3 + 2 = 5. Priemerné oneskorenie týchto sedem stratégií je d0 + di + d-i + d2 + d-2 + d3 + d-7 3+1+1+3+3+5+5 7 Úloha 10.17 Prípad problému A1 = (1, 2, 3,4, 5, 6, 7, 8, 9)ai2 = (4, 5, 6, 7, 8, 9,1, 2, 3) sa vyznačuje tým, že všetkých 6 políčok diagonály D% obsahuje prekážky. Čo bolo pre nás typické? Nemali sme strach povedať mladým ľuďom, že my sme sami hlúpi... Niels Bohr Kapitola 11 Algoritmická optimalizácia vo fyzike, alebo ako by mohla liečiť homeopatia? Táto posledná kapitola sa podstatne odlišuje od predchádzajúcich. Všetko, čo sme doteraz z vedy ukázali, považujeme za fakty. Na jednej strane sme sa nučili, že základné stavebné kamene vedy sú do istej miery vecou viery a dôvery. Na druhej strane sme si tiež uvedomili, že vedci vybudovali budovu vedy veľmi starostlivo a že všetky tehličky, ktoré boli položené na základné kamene, boli veľmi pozorne teoreticky ako i experimentálne preskúmané. Matematika, informatika a prírodné vedy dosahujú stále vyššiu zrelosť a tým aj vyššiu stabilitu. Vďaka tomu sú teórie a z nich odvodené predpovede čoraz spoľahlivejšie. No bolo by mylné sa nazdávať, že celá veda je takáto a že takou aj vždy bola. Na relatívne pevnej pôde stojíme len tam, kde máme možnosť robiť spoľahlivé experimenty a merania a kde môžeme opísať skutočnosť jazykom matematiky. Ale ako je to s pedagogikou, didaktikou, sociológiou, ekonómiou a inými vedeckými disciplínami, v ktorých sa vedci nevedia dohodnúť na obraze reality a vytvárajú navzájom si odporujúce teórie? Zažili sme už veľakrát, že tieto disciplíny od základov menili svoje predstavy. Robia to aj naďalej a môžeme očakávať, že mnohé dnešné 11.1 O dôveryhodnosti vedeckých teórií 304 KAPITOLA 11 „pravdy" už zajtra platiť nebudú. Neslobodno to chápať ako kritiku týchto vied. Chceme len povedať, že materiál týchto vedeckých disciplín je taký zložitý a základné pojmy nie sú dostatočne precízne a v tomto štádiu ich vývoja to pravdepodobne ani ináč nemôže byť. Pred storočiami nevyzerala fyzika a čiastočne ani matematika oveľa lepšie. Musíme sa zmieriť s tým, že rôzne vedecké disciplíny sa nachádzajú v rôznych štádiách vývoja. Tam, kde chýbajú pevne definované pojmy a kde nevieme z pozorovaného merať a posudzovať to, čo by sme chceli, ostáva príliš veľa miesta na úvahy, ktoré sa javia z pohľadu matematiky a fyziky ako špekulácie. Ale tieto špekulácie sú potrebné, pretože hľadanie pravdy vo vede vyžaduje tisíce omylov a neúspešných pokusov. Exaktné vedy ruší skôr skutočnosť, že humanitné disciplíny nevyužívajú v dostatočnej miere existujúce možnosti a nástroje, ktoré by mohli pomôcť spoľahlivejšie overovať vyslovené hypotézy a tvrdenia1. Skúsme byť konkrétni a pozrime sa na didaktiku informatiky. Predstavme si, že sa chceme presvedčiť, že výuka nejakej témy prostredníctvom istej didaktickej metódy (napr. objektovo orientované programovanie priamo za obrazovkou) je vhodnejšia ako výuka inej príbuznej témy inou metódou (napr. štruktúrované programovanie na papieri s ceruzkou a gumou). Ako sa ale dá posúdiť, čo je vhodnejšie? A čo vôbec znamená vhodnejšie? Už len meranie získaných vedomostí a dosiahnutej kompetencie je obťažné, ak má výsledok nášho merania vyústiť do spoľahlivej výpovede. A už vôbec nie sme schopní merať prínos k vývoju spôsobu uvažovania žiakov. Predpokladajme ale, že sme schopní formulovať úlohy a systém hodnotenia riešení, ktoré nám umožnia aspoň do istej miery posudzovať niektoré dôležité aspekty vyučovacieho procesu. V tejto situácii sa od nás požaduje príprava experimentu. V ideálnom prípade potrebujeme rôzne triedy, ktorých žiaci majú približne rovnaké schopnosti a vedomosti. Naviac potrebujeme učiteľov, ktorí vedia približne rovnako dobre porovnávané témy vyučovať. Už splnenie týchto predpokladov nevieme spoľahlivo overiť. Napriek tomu začneme s pokusom, pričom sa musíme zmieriť s tým, že nemáme možnosť zohľadniť dôležité vplyvy, akými sú atmosféra v triede a pomoc rodičov pri učení sa doma. Nepochybné musíme za daných okolností výsledok nášho úsilia interpretovať veľmi opatrne. A zásadne sme povinní upozorniť používateľov našich výsledkov na ich relativitu. Napriek tomu že všetko je také relatívne a neisté, neostáva nám nič iné, pretože za súčasných znalostí v súčasnom stave vývoja didaktiky žiadne spoľahlivejšie výskumné metódy neexistujú. Vďaka rozpoznaným omylom a chybným záverom sa učíme „merať" stále presnejšie, dávať si realistickejšie ciele, experimentovať korektnejšie obmedzovať pritom neželaný vplyv a naše pozorovania relativizovat'. Takto pracuje aspoň časť Napríklad matematickými metódami a modelmi. 11.1 DÔVERYHODNOSŤ VEDECKÝCH TEORII 305 etablovaných didaktikov v matematike alebo fyzike. Bolo by nesprávne, keby sme sa kvôli neistotám v meraní vôbec nepokúsili experimentovať a keby sme tvorili teórie len na základe takzvaných „rozumných" úvah. Takto by sme dochádzali k skutočným špekuláciám a sporným záverom, ktoré sú, žiaľ, v dnešnej didaktike informatiky skôr typickým ako mimoriadnym zjavom2. Niekoho prekvapí, že používanie formálneho jazyka matematiky môže byť príjemnejšie a spoľahlivejšie napriek tomu, že zvládnuť tento jazyk je veľmi náročné. Pevná pôda exaktných vied, akými sú matematika, fyzika, chémia alebo informatika, dáva pocit istoty, ktorý sa nedá dosiahnuť na pôde vedných disciplín, v ktorých človek musí mať obrovské skúsenosti, aby dokázal rozlíšiť špekulatívne od zmysluplného. Táto skutočnosť ovplyvnila vo väčšine krajín výber vyučovacích predmetov na stredných školách. Napriek tomu hodláme v tejto kapitole opustiť pevnú pôdu exaktných vied a riskovať výlet do sveta nejasnej terminológie a matematicky zatiaľ nepostihnuteľnej skutočnosti. Počas tohto výletu sa ale budeme stále usilovať o to, aby čitateľ vedel rozlišovať medzi predpokladmi, hypotézami a ich dôsledkami a bol si stále vedomý relatívnosti formulovaných výpovedí. < v> Naše úvahy začneme na pevnej pôde fyziky. Budeme sa zaoberať optimalizáciou kryštálovej štruktúry kovov a naším cieľom bude matematicky modelovať proces optimalizácie pomocou jedného algoritmu. Pritom objavíme, že tento algoritmus sa dá úspešne využiť na riešenie algoritmických optimalizačných úloh. Prekvapí nás však, že nie sme schopní nájsť priamu súvislosť medzi použitým fyzikálnym princípom a štruktúrou optimalizačných úloh. Tu opustíme teóriu a vydáme sa cestou experimentov a skúseností, ktoré môžeme len čiastočne vysvetliť prostredníctvom exaktných prostriedkov. Nato definitívne opustíme pevnú pôdu a konfrontujeme sa s otázkou, či študovaný fyzikálno-algoritmický princíp optimalizácie nie je využiteľný aj na modelovanie procesu liečenia živých bytostí. Tieto úvahy nás povedú k pokusu definovať zdravie a chorobu v terminológii fyziky a algoritmiky. Takéto definície nám potom umožnia nahliadnuť na liečenie ako na proces algoritmického spracovania informácie. V konečnom dôsledku naše úsilie vyústi vo formulácii predstáv o možnom pôsobení alternatívnych liečebných metód ako je napríklad homeopatia. 2 Nie je to len dôsledkom toho, že didaktika informatiky je veľmi mladá a ešte si nevytvorila rozumné výskumné štandardy. Kvôli nedostatku informatikov sú aj v didaktike informatiky činní ľudia, ktorí prišli z iných oblastí, alebo sú to čistí používatelia informačných technológií. Títo sa nikdy nestretli s výskumom informatických základov, a preto si vôbec neuvedomujú všeobecnovzdelávacie hodnoty informatiky. 306 KAPITOLA 11 11.2 Algoritmický model optimalizácie kryštalickej štruktúry kovov Na začiatok prinášame prvú prekvapujúcu správu: Kov „vie", čím je a po celý čas svojej existencie sa usiluje byť tým, Ako správne pochopiť túto vetu o takzvanej mŕtvej hmote? Kovy sa „usilujú" po celý čas svojej existencie dosiahnuť a udržať svoju optimálnu kryštalickú štruktúru, ktorou sa vyznačujú a odlišuje ich od ostatných prvkov. V tomto zmysle sa každý kov nepretržite „usiluje" sám seba optimalizovat'. Optimalizovat' znamená, že sa energia rovnomerne rozdelí na väzby medzi jednotlivými časticami, a takto sa minimalizuje takzvaná voľná energia. Napriek neustálemu úsiliu môže dôjsť v dôsledku vonkajších vplyvov a záťaže k takzvanej „únave" kovu. Pre túto únavu sa môžu väzby v istých častiach postupne oslabiť, čo môže v najhoršom prípade vyústiť do poškodenia materiálu, napr. do zlomu. Ako môžeme kovu pomôcť zlepšiť jeho stav? Na základe zákonov termodynamiky potrebuje kovový materiál „horúci kúpeľ". Optimalizačný proces stavu kovu prostredníctvom horúceho kúpeľa pozostáva z dvoch fáz: • Prvá fáza Pomocou horúceho kúpeľa dodáme kovu zvonka energiu. Toto veľké množstvo voľnej energie oslabí väzby a privedie kov do stavu, ktorý je do značnej miery chaotický. Z pohľadu množstva voľnej energie je tento stav jednoznačne zhoršením predchádzajúceho stavu. Kov necháme pomaly vychladnúť. V priebehu ochladzovania preváži úsilie kovu o dosiahnutie svojho optimálneho stavu. Pri dostatočne pomalom ochladzovaní dosiahne kov vďaka „vlastnému úsiliu" stav, ktorý je blízky optimálnemu. Fyzici [MRR+53] objavili nasledujúci algoritmus, ktorý dnes nazývame Metropolisov algoritmus. Tento algoritmus umožňuje verne simulovať hore opísaný optimalizačný proces. Na opísanie Metropolisovho algoritmu používame označenie E(s) pre voľnú energiu stavu s optimalizovaného kovu. Symbolom Cb označujeme Boltzmannovu konštantu. čím je. • Druhá fáza Metropolisov algoritmus 11.2 OPTIMALIZÁCIA KRYŠTALICKEJ ŠTRUKTÚRY 307 • Vstup Stav s kovu3 s energiou E (s). • Prvá etapa Urči počiatočnú teplotu T (v Kelvinoch) horúceho kúpeľa • Druhá etapa Pomocou náhodnej malej zmeny (napr. zmeny polohy jednej častice) vygeneruj z aktuálneho stavu s nejaký stav q. Keď E (q) < E (s), tak q považuj za nový aktuálny stav. {To znamená, že ak je stav q lepší ako stav s, tak optimalizovaný kov prejde jednoznačne do nového stavu q.} Ak E (q) > E (s), akceptuj q ako nový aktuálny stav kovu s pravdepodobnosťou E(q)-E(s) prob(s —► q) = e cb-t (to znamená, ostaň v pôvodnom stave s pravdepodobnosťou 1—prob(s — • Tretia etapa Vhodne redukuj T (zníž teplotu horúceho kúpeľa). Ak T (v Kelvinoch) nie je blízko k 0, pokračuj druhou etapou. Ak je T (v Kelvinoch) blízko k 0, ukonči prácu algoritmu a daj na výstup stav s. Úspešná simulácia optimalizácie pomocou Metropolisovho algoritmu je založená na zákonoch termodynamiky, ktorým sa nechceme bližšie venovať. Pre jeho pochopenie je podstatné nasledujúce pozorovanie. Ak náhodne vygenerujeme lepší stav, prejde kov vždy do tohto lepšieho stavu. Ak je nový stav q horší ako pôvodný stav s, tak napriek zhoršeniu celkového stavu kovu nie je vylúčené, že kov do tohto horšieho stavu prejde. Pravdepodobnosť prechodu do horšieho stavu je daná formulou založenou na fyzikálnych zákonoch. Pravdepodobnosť zhoršenia rastie s teplotou T horúceho kúpeľa a zmenšuje sa s veľkosťou zhoršenia (E (q) — E (s)). To znamená, že priebehom času (chladnutím) pravdepodobnosť zhoršenia klesá, zatiaľ čo na začiatku procesu optimalizácie je vysoká. 3 Opísaný stavmi a pozíciami všetkých častíc. 308 KAPITOLA 11 Na základe fyzikálnych zákonov môžeme matematicky odvodiť nasledovné skutočnosti: (i) Počas procesu ochladzovania sa voľná energia minimalizuje a pri dostatočne dlhom čase dosahuje4 kov stavy blízke optimu s takmer perfektnou kryštalickou štruktúrou. (ii) Pozitívna pravdepodobnosť zhoršenia súčasného stavu (obzvlášť na začiatku procesu optimalizácie) je nevyhnutnou súčasťou optimalizácie. Bez nej nemožno úspešne optimalizovat'. Prvé poučenie z Metropolisovho algoritmu je, že zlepšenie nie je možné vždy dosahovať priamočiaro. Aby sme dosiahli podstatné zlepšenia, musíme byť ochotní akceptovať počiatočné zhoršenia. Takáto je príroda vo svojej podstate, a preto nás táto skutočnosť nesmie prekvapiť. Keď renovujeme dom, musíme tiež najprv dosť vecí a častí poškodiť alebo zničiť. Až potom môžeme začať vylepšovať. A ak chceme zmeniť zakorenený politický systém, môže jeho transformácia vyzerať oveľa dramatickejšie. Revolúcie v dejinách ľudstva zaznamenali na začiatku skoro vždy katastrofálne zhoršenia, a to platí dokonca aj v prípadoch, keď uskutočňované zmeny boli nevyhnutnosťou na ceste k novej, lepšej spoločnosti. Väčšina ľudí nie je schopná akceptovať, že začiatok pozitívneho vývoja môže byť spojený s nemalými zhoršeniami. Nevhodné daňové systémy, nefunkčné alebo nespoľahlivé zdravotníctvo, či neuspokojivé školstvo sa nedajú v mnohých krajinách vylepšiť bez podstatných zásahov spojených aj s istými stratami. 11.3 Optimalizácia v informatike podľa fyzikálnych zákonov X Optimalizácia pomocou Metropolisovho algoritmu prebieha podľa zákonov termodynamiky. Môj pokus preniesť tento princíp do každodenného života a do vývoja spoločnosti môžete smelo nazvať špekuláciou. Nejde o nič iné, ako môj subjektívny pohľad na veci, ktorý je postavený na istých analógiách. Veľkým prekvapením je ale skutočnosť, že existujú neuveriteľne pozitívne skúsenosti s aplikovateľnosťou Metropolisovho algoritmu v oblastiach, ktoré nemajú na prvý pohľad s termodynamikou nič spoločné. V nasledujúcom chceme dokumentovať širšiu uplatniteľnosť princípu, na ktorom je Metropolisov algoritmus založený. 4Kov nemôže trvalo zotrvávať v jednom stave, ani v prípade, že dosiahnutý stav je optimálny. Neustála zmena je nevyhnutnou charakteristikou existencie kovu. 11.3 OPTIMALIZÁCIA V INFORMATIKE 309 Už sme sa naučili, čo sú to optimalizačné úlohy. Pre každý prípad problému existuje veľa prípustných riešení. Každé prípustné riešenie má svoju cenu. Našou úlohou je nájsť nejaké optimálne riešenie, čo znamená riešenie s minimálnou alebo maximálnou cenou. Mnohé z týchto úloh sú ťažko riešiteľné, pretože nepoznáme žiadnu lepšiu stratégiu ako sa pozrieť na všetky riešenia a porovnať ich ceny. Môžbyť efektívnejšia stratégia ani neexistuje. K takýmto ťažkým problémom patria veľké systémy lineárnych rovníc a nerovnic, ako ich poznáme z piatej kapitoly. Dôležité je, že nepripúšťame ľubovoľné reálne riešenia, ale len hodnoty 0 a 1, čo práve robí hľadanie optimálnych riešení systémov rovníc a nerovnic ťažkým. Rozdiel oproti kapitole 5 je ale v tom, že nemusíme nevyhnutne splniť všetky rovnice a nerovnice, ale sa usilujeme splniť ich toľko, ako sa len dá. Inými slovami, snažíme sa minimalizovať počet nesplnených rovníc a nerovnic. Pozrime sa napríklad na nasledovný systém pozostávajúci zo 7 nerovností a rovníc. x\ + x2 ~\~ x3 + Ax4 > 4 (11.1) xx - 2x2 + 3x3 - x4 < 2 (11.2) x2 + x3 > 1 (11.3) xi +^r?% 1 (11A) Xl-x4 = 0 (11.5) 2x! - x2 + 2x3 - x4 < 2 (11.6) x3 — x4 = 0 (11-7) Možné riešenia sú všetky dosadenia hodnôt 0 a 1 premenným x1,x2,x3,x4. Napríklad vektor (1,0,1,0) označuje riešenie x\ = 1, x2 = 0, x3 = 1 a x4 = 0. Toto riešenie spĺňa (11.3), (11.4) a nespĺňa (11.1), (11.2), (11.5), (11.6) a (11.7). Takže cena riešenia je 5, pretože máme 5 nesplnených podmienok. Našou úlohou je cenu riešenia minimalizovať. Úloha 11.1 Aká je cena riešení (0,0,0,0), (1,1,0,0), (0,1,1,1) a (1,1,1,1)? Nájdite spomedzi 16 prípustných riešení jedno optimálne. Iný známy príklad ťažkej optimalizačnej úlohy je problém obchodného cestujúceho, známy aj pod skratkou TSP (Traveling Salesman Problém). V ňom uvažujeme n miest, ktoré sú pospájané leteckými linkami. Z každého mesta možno priamo letieť do hociktorého iného. Každá linka medzi dvoma mestami A a, B má pevnú cenu, nezáleží na tom, či letíme z A do B alebo z B do A. Riešenia sú takzvané Hamiltonovské kružnice. Hamiltonovská kružnica sa začína a končí v tom istom meste a každé mesto navštívi práve 310 KAPITOLA 11 raz. Cena takejto cesty (Hamiltonovskej kružnice) sú celkové náklady na letenky. Našou úlohou je minimalizovať cenu za takúto prepravu. Tento problém musíme často riešiť v priemyselných aplikáciách. Jedna zo štandardných metód, ktorá sa aplikovala na hľadanie dobrého riešenia je takzvané lokálne vyhľadávanie. Táto metóda sa dá jednoducho opísať nasledujúcou schémou: 1. Pre daný prípad problému vygeneruj ľubovoľné riešenie a. 2. Prostredníctvom malých lokálnych zmien aktuálneho riešenia a hľadaj podobné riešenie, ktoré je lepšie (má menšiu cenu). Ak nájdeš nejaké lepšie riešenie j3, vezmi ho ako nové aktuálne riešenie namiesto a. Keď pomocou lokálnych zmien nenájdeš žiadne lepšie riešenie ako a, ukonči prácu a na výstup daj riešenie a. Aby sme túto metódu naozaj pochopili, musíme si najprv ujasniť čo rozumieme pod lokálnymi zmenami riešenia. V prípade systému nerovnic môžeme považovať za lokálnu zmenu, zmenu hodnoty jednej premennej. V tomto prípade môžeme od riešenia (0101) prejsť k riešeniu (0111) zmenou hodnoty tretej premennej z 0 na 1. Keď je nejaké riešenie dosiahnuteľné z iného riešenia vďaka lokálnej zmene, nazývame tieto riešenia susednými, alebo priamo susedmi. Teda vzhľadom na zvolenú lokálnu transformáciu sú (0110) a (0010) susedia a riešenia (0000) a (1100) nie sú susedia. Metódu lokálneho vyhľadávania môžeme v terminológii susedností opísať takto: Pre dané riešenie hľadaj medzi jeho susedmi lepšie riešenie. Ak neexistuje lepší sused, je výstupom aktuálne riešenie. Pre TSP môžeme definovať lokálne zmeny a tým aj susednosť nasledujúco. Z danej Hamiltonovskej kružnice odstránime dve spojenia (linky) Lin(A, B) a Lin (C, D) (Obr. 11.1) a nahradíme ich novými linkami Lin{ A, C) a Lin(B, D), ako je to znázornené na obrázku 11.1. Pôvodná Hamiltonovská kružnica začínala z mesta S a navštívila medzi inými aj mestá A, B, C a D, presne v tomto poradí. Nová susedná Hamiltonovská kružnica tieto mestá navštívi v poradí A, C, B a D. Pre mnohé prípady problému TSP poskytuje lokálne vyhľadávanie celkom dobré riešenia, ktorých cena sa veľmi nelíši od optimálnej ceny. No existujú aj prípady TSP problému, pre ktoré lokálne vyhľadávanie dáva veľmi zlé riešenie. V týchto prípadoch nemožno dosiahnuť skutočne dobré riešenie len postupnosťou neustálych zlepšení. Na dosiahnutie dobrého riešenia v takejto situácii musíme v priebehu optimalizácie a najmä na jej začiatku pripustiť aj kroky, ktoré vedú k zhoršeniu riešenia. Začiatkom 80-tych rokov prišli 11.3 OPTIMALIZÁCIA V INFORMATIKE 311 D C obr. 11.1 Černý, Kirkpatrick, Gellat a Vecchi [Čer85, KGV83] s myšlienkou zlepšiť lokálne vyhľadávanie v zmysle Metropolisovho algoritmu. Výsledný algoritmus dostal názov „Simulated Annealing" a bol úspešne použitý v tisíckach aplikácií. Transformácia Metropolisovho algoritmu na algoritmus na riešenie diskrétnych optimalizačných úloh je veľmi jednoduchá. V podstate stačí zmeniť terminológiu termodynamiky použitú v Metropolisovom algoritme na nasledujúce „synonymá" diskrétnej algoritmickej optimalizácie: Množina stavov systému = množina prípustných riešení energia stavu = cena riešenia optimálny stav = optimálne riešenie teplota kúpeľa = parameter programu Touto zmenou terminológie dostávame metódu simulovaného žíhania. Simulované žíhanie Vstup Prípad / nejakej optimalizačnej úlohy. 1. Nájdi pre / nejaké riešenie a a nastav hodnotu parametra T. 2. Vygeneruj náhodne suseda j3 riešenia a. 3. Ak je j3 lepší ako a, převezmi j3 ako nové aktuálne riešenie (a <— j3). V prípade, že j3 nie je lepšie ako a, převezmi j3 s pravdepodobnosťou danou vzorcom z Metropolisovho algoritmu. 4. Zmenši vhodne T. Ak je T ešte dostatočne veľké, pokračuj krokom 3 s aktuálnym riešením a. 312 KAPITOLA 11 V prípade, že je T blízko 0, ukonči prácu a na výstup daj aktuálne riešenie a. Napriek tomu, že algoritmické optimalizačné úlohy nemajú nič spoločné s termodynamikou, sme schopní matematicky dokázať, že pri vhodnej voľbe susednosti a vhodnom nastavení počiatočnej hodnoty parametra T, ako i jeho vhodnej redukcii v priebehu optimalizácie, garantuje metóda optimalizovaného žíhania pri dostatočne dlhom behu dosiahnutie optimálnych riešení. Negatívnou správou je, že čas potrebný na zaručené dosiahnutie optima je príliš dlhý na to, aby sme tak dlho mohli optimalizovat'. Pravda, v praxi poskytuje táto metóda vo väčšine prípadov dobré riešenia v rozumnom čase. Prečo sú typické prípady úloh v praxi v tomto zmysle ľahké, nevieme zatiaľ teoreticky zdôvodniť. No vyplýva z toho dôležité poučenie: Optimalizácia ako postupnosť krokov, z ktorých každý vedie k zlepšeniu je vo väčšine prípadov nefunkčná. Keď chceme dosiahnuť podstatné zlepšenie, musíme v priebehu optimalizácie pripustiť aj kroky vedúce k dočasnému zhoršeniu. 11.4 Liečenie ako algoritmická optimalizácia zdravotného stavu V tomto okamihu opúšťame pevnú pôdu matematických pojmov a konceptov a putujeme smerom k medicíne. Ako sme už spomínali, neexistuje fyzikálno-chemický koncept (definícia pojmu život), ktorý by nám umožňoval rozlišovať medzi živou a neživou hmotou. Nevieme dostatočne presne, čo vlastne znamená život, čo sme, o tom aký je zmysel našej existencie, môžeme nanajvýš diskutovať. Keď ale nevieme, čo je živá hmota a živý organizmus, nevieme ani, čo je zdravie, choroba a liečenie. Môžete opäť diskutovať o tom, že isté definície týchto pojmov sme zaviedli a na tejto báze sme schopní relatívne úspešne liečiť chorých ľudí. Rovnako ako fyzici, ktorí bez toho aby vedeli, čo je vlastne energia, urobili obrovský pokrok v skúmaní zákonitostí nášho sveta, dosiahla aj medicína so svojimi nepresnými pojmami nemalé úspechy. Na druhej strane sme si v prvej kapitole uvedomili, že zlepšenie chápania základných pojmov, a tým aj zodpovedajúcich objektov výskumu je kľúčové pre kvalitatívne skoky napredovania vedy. V tejto súvislosti sa pozrime na definíciu zdravia, ako ju sformulovala svetová zdravotnícka organizácia v roku 1948: 11.4 LIEČENIE AKO ALGORITMICKÁ OPTIMALIZÁCIA 313 Zdravie je stav dokonalého fyzického, psychického a sociálneho pocitu pohody, nielen neprítomnosť choroby. Je to nádherná a v pravom zmysle slova humánna definícia zdravia. Ako základný predpoklad zdravia nám dáva právo a nárok sa dobre cítiť a byť spokojný. Podáva súčasne aj našu skúsenosť so vznikom chorôb. Nadmerné fyzické, psychické alebo sociálne zaťaženie, strach, agresivita a nespokojnosť patria k najdôležitejším príčinám vzniku ochorení. Napriek svojím prednostiam nám táto definícia veľmi nepomôže ak chceme študovať liečenie ako prírodný proces. Nahrádza totiž pojem zdravia synonymom „stav úplnej spokojnosti" . Pomáha takto pochopiť, čo rozumieme pod zdravím, ale nedefinuje pojem zdravia. Zjednodušená definícia pojmu zdravie ako neprítomnosť choroby vyzerá na prvý pohľad azda trochu vecnejšie, ale iba za predpokladu, že by sme mali dobrú definíciu choroby, ktorá by sa obišla bez pojmu zdravia. Stojíme pred náročnou úlohou. Bez toho, aby sme vedeli, čím sme a čo znamená zdravie, chceme študovať proces liečenia. Aby sme v našom úsilí pokročili, neostáva nám nič iné, iba uchýliť sa k niekoľkým axiómam a s ich pomocou definovať chýbajúce pojmy. Na začiatku kapitoly sme vyslovili pozorovanie, že železo „vie", čím je. Toto „vie" sme interpretovali ako neustálu snahu byť železom (samým sebou), čo znamená počas celej svoje existencie sa usilovať o dosiahnutie svojho optimálneho stavu (perfektnej kryštalickej mriežky). A keď je neživá hmota schopná neustále sa snažiť dosiahnuť svoj optimálny stav (a teda byť, čím je), niet dôvodu nepriznať túto schopnosť aj živým bytostiam. Touto úvahou sa dostávame k nasledujúcemu základnému konceptu axiomatickej povahy. Človek vo svojej podstate vie, čím je a pokúša sa celý život dosiahnuť svoj optimálny stav, teda byť tým, čím je. Zdravie človeka je jeho optimálny stav. Choroba je odchýlkou od tohto stavu, ktorá môže byť rôzne veľká. Liečenie je postupnosť stavov človeka, ktorá sa začína v stave vzdialenom od optima a končí sa v stave blízkom optimálnemu. Čo táto definícia poskytuje a čo nám v nej chýba? Vytratilo sa z nej humánne posolstvo, že pre naše zdravie je dôležitý stav psychickej pohody a sociálnej spokojnosti. V našej definícii sa vôbec nepokúšame povedať, čo je zdravie nejakej bytosti. Predpokladáme len existenciu optimálneho stavu každého organizmu a veríme v existenciu neznámej fyzikálnej definície optimality. Definícia navrhuje nazerať na proces liečenia ako na proces optimalizácie. Čo nám to dáva? Predovšetkým analógiu k optimalizačným procesom vo fyzike a informatike a na ideálnej úrovni zdôraznenie úlohy vnútorných síl organizmu, ktoré sa neustále snažia optimalizovat' jeho (zdravotný) stav. Takáto pred- 314 KAPITOLA 11 stáva nepretržitého úsilia nejakej bytosti o dosiahnutie svojho optimálneho stavu nie je založená len na analógii s „neživou" hmotou kovov. Reálnosť tejto predstavy potvrdzujú tisícročiami nadobudnuté skúsenosti s liečením a nespochybniteľná aktivita nášho imunitného systému. Ako nám pomáha táto predstava? Po prvé už pri hľadaní liečebných metód. Mnohé odvetvia medicíny sa do značnej miery vyvinuli a dosiahli nemalé úspechy na princípe lokálneho ošetrenia. Zdravotné problémy môžeme riešiť napríklad cielenými chirurgickými zákrokmi, alebo pomocou chemických preparátov. I keď týmto metódam vďačíme za obrovské úspechy v liečení, nepochybujeme o tom, že každý lekársky zákrok má globálne vedľajšie účinky, ktorých dôsledky nemožno v plnej miere odhadnúť. Večné hľadanie vratkej rovnováhy medzi prevahou prospešnosti a prevahou škodlivosti zásahu dáva lekárom pri rozhodnutiach o vhodnosti konkrétnych liečebných postupov poriadne zabrať. Každá, i keď malá operácia má svoje riziká a napríklad aj antibiotiká by sa mali užívať opatrne len vo veľmi vážnych prípadoch. Naša otázka je: Môže liečenie prebiehať aj inak? Môžete sa pýtať: Ako inak? Odpovedáme takto: Keď presne nevieme, čo v organizme spôsobíme a vyvedieme z rovnováhy aplikáciou medicínskych postupov a liekov, vynára sa otázka, či by sme nemohli riadenie liečebného postupu ponechať samotnému organizmu, lepšie povedané jeho vnútornej sile? Táto vnútorná sila vie najlepšie, čo sme a môže viesť organizmus k jeho optimálnemu stavu. Znie to síce pekne, ale zrejme to tak jednoducho nefunguje. Keby to fungovalo, boli by sme stále zdraví a nepotrebovali by sme vôbec lekársku pomoc. Naša vizionářská myšlienka je trochu iná. Hľadajme možnosti ako povzbudiť náš organizmus k intenzívnejšej snahe optimalizovat' jeho súčasný stav. Železo sa môže pre silnú vonkajšiu záťaž zlomiť i napriek neustále prebiehajúcej optimalizácii. Preto používame na dosiahnutie stavu, v ktorom sa ľahšie presadí vnútorná podstata železa horúci kúpeľ. Ako môžeme oznámiť telu, že v istom stave by sa malo viac usilovať? Ak pripustíme ďalší predpoklad, že riadiaci mechanizmus organizmu je vo svojej podstate informačným procesom, pomocou prenosu informácie sa môžeme pokúsiť zúčastniť sa na jeho riadení. Samozrejme vidíme aj podstatný rozdiel medzi kovmi a živými bytosťami. Pre nás neznámy opis optimálneho stavu zložitého organizmu je určite neporovnateľne zložitejší, ak je vôbec možná jeho reprezentácia. Namiesto jedného parametra (voľnej energie) pri kove u živého organizmu môžeme optimalizovat' množstvo rozličných parametrov, ktoré možno ani nedokážeme naraz osloviť. Pokúsme sa zrekapitulovať našu myšlienku. Nevieme ako vyzerá optimálny stav človeka, a teda nevieme ani, čo je zdravie. Tušíme ale, že živé bytosti v sebe nesú túto informáciu a že existujú mechanizmy, ktoré sa snažia korigovať 11.4 LIEČENIE AKO ALGORITMICKÁ OPTIMALIZÁCIA 315 stav organizmu k optimalite. Má teda zmysel povzbudiť (inicializovat') tieto mechanizmy k aktívnejšiemu úsiliu. Ako? Skúšaním a zbieraním skúseností, čo je tak či onak hlavná metóda medicínskeho výskumu. Mne osobne táto myšlienka neprišla na um vďaka vedomostiam o Metropolisovom algoritme a jeho úspešných aplikáciách. Pred viac ako 12 rokmi som sa po prvý raz stretol s homeopatiou. Sprvu som reagoval odmietavo, pretože jej opodstatnenia boli naivné. Až neskôr som urobil to, čo sa očakáva od každého solídneho vedca. Namiesto nezmyselných špekulácií pre a proti som začal skúšať, experimentovať. A to, čo som videl a zažil v nasledujúcich rokoch, ma presvedčilo. Mal som možnosť zhovárať sa aj s viacerými úspešnými známymi osobnosťami5 tejto alternatívnej medicíny. Ich skúsenosti so státisíca-mi pacientov potvrdili, že najčastejšou reakciou na použitie homeopatických prostriedkov je prechodné zhoršenie stavu a že práve toto prechodné zhoršenie stavu je potvrdením správnej voľby homeopatického prostriedku. Práve táto skutočnosť veľmi pripomína proces optimalizácie simulovaným žíháním. Je ale na čase zasvätiť čitateľa, ktorý s homeopatiou nemá nijaké skúsenosti, do tejto alternatívnej liečebnej metódy. Objavil ju pred vyše 200 rokmi nemecký lekár Hahnemann, ktorého trápilo množstvo rôznych negatívnych vedľajších účinkov liekov. Položil si otázku, či sú takto spôsobené škody na ľudskom organizme naozaj nevyhnutným sprievodným javom liečebného procesu. Jeho prvý pokus o zmiernenie vedľajších účinkov liečebných preparátov viedol k ich riedeniu. Zial so stupňom riedenia klesali nielen vedľajšie účinky, ale i účinnosť liekov. Pri týchto pokusoch objavil jednu zvláštnu metódu riedenia a nikto netuší, ako na ňu prišiel. Zriedil liek v pomere 1 : 100 s vodou, potom zmes desaťkrát intenzívne pretrepal. Po 30 opakovaniach tejto procedúry dostaneme takzvanú potenciu C30 pôvodného prostriedku. Z kombinatoriky už vieme vypočítať, že vzniknutý homeopatický prostriedok potencie C30 obsahuje len zlomok veľkosti pôvodného lieku. Keď začneme riedenie s 1021 molekulami lieku, neobsahuje C30 potencia prakticky žiadnu molekulu pôvodnej látky. Táto kombinatorická úvaha je najčastejší ale aj najnaivnejší argument odporcov homeopatie, ktorí ju obviňujú s nevedeckosti. V tejto knihe sme sa ale naučili, že slovo „nemožné" by sme nemali len tak ľahko vysloviť. Samozrejme, že homeopatické prostriedky nemôžu pracovať na tej istej chemickej báze ako bežné lieky. Ale to je to, o čo sa Hahnemann vlastne usiloval. Zostáva teda nasledujúca otázka: Ako účinkujú homeopatické lieky? Na túto otázku nepoznáme uspokojivú odpoveď. Ja pokladám za možné, že ide o čistý prenos informácie. Existujú výskumy v štruktúrach, ktoré môžu vytvárať molekuly vody. Rôznorodosť kombiná- 5Napríklad s držiteľom alternatívnej Nobelovej ceny pánom Vithoulkasom. 316 KAPITOLA 11 cií je taká veľká, že v pohári vody možno zapamätať viac informácií ako v pamätiach všetkých počítačov na zemeguli. Existuje hypotéza o schopnosti vody zapamätať si prostredníctvom štruktúr medzi jej molekulami informácie o látkach s ktorými sa dostala do kontaktu. Pretriasanie by malo proces zapamätávania obzvlášť zintenzívniť a viesť k tomu, že vytvorené štruktúry vykazujú vysokú stabilitu. V súčasnom štádiu vývoja vedy nie sme schopní poskytnúť na fyzikálno-chemickej úrovni dôkazy v prospech alebo neprospech homeopatie. Toto zvládneme aj pre klasické lieky len zriedkavo a čiastočne. Zostava nám len možnosť experimentovať. Typickými experimentami v medicíne je porovnávanie účinkov lieku s takzvaným placebom. Pacienti sú náhodným spôsobom rozdelení do dvoch rovnako veľkých skupín. Jedna skupina dostane skúmaný liek, druhá čistý cukor, nazývaný placebo. Pacienti o tom ale nie sú informovaní. Po uskutočnení pokusu porovnáme účinok lieku so stupňom účinku placeba. Napríklad pri skúmaní jedného konkrétneho antidepresíva dosiahol tento liek účinnosť 43% (pomohlo 43 pacientom zo 100), pričom placebo pomohlo 30% pacientov. Prekvapila vás vysoká účinnosť placeba? Zrejme už len informácia, že sa niekto zaoberá liečením pacienta, môže spôsobiť zázraky. Poznáme množstvo lekárskych správ, ktoré dokumentujú spontánne vyliečenie ťažkých chorôb ako rakovina len vďaka placebo efektu. Zial nepoznám žiadne uspokojivé rozsiahle porovnávacie štúdie medzi homeopat-ickými prostriedkami a placebom. Poznáme aspoň dva dôvody, prečo je to tak. Homeopatia je síce široko praktizovaná, ale chýbajú vedecké inštitúcie, ktoré by sa bez predsudkov tejto problematike profesionálne venovali. Po druhé porovnávacie experimenty s placebom nie sú v prípade homeopatie až také jednoduché, pretože samotná choroba neurčuje vhodný homeopat-ický prostriedok. Na určenie vhodnej homeopatie musíme najprv určiť aj typ pacienta a v hre sú v tejto stovky rôznych typov v tejto klasifikácii. Voľba vhodného homeopatického prostriedku je založená na skúsenostiach a intuícii a homeopatický lekár často potrebuje niekoľko pokusov na nájdenie toho vhodného. Vzhľadom na ťažkosti, ktoré sme uviedli, sa už vôbec nebudeme zaoberať otázkami nakoľko sme schopní merať pri rôznych chorobách zlepšenie zdravotného stavu. Navyše podľa niektorých predstáv optimalizuje homeopatický prostriedok len isté parametre zdravotného stavu. Pri ťažkých chronických chorobách je preto nevyhnutné podávať v určitom poradí viacero homeopatických prostriedkov počas dlhšieho obdobia. Čo ostáva povedať na konci kapitoly, aby sa to hodilo aj na záver knihy? Vedci v základnom výskume zažili vždy veľa dobrodružstiev a tí dnešní nie 11.4 LIEČENIE AKO ALGORITMICKÁ OPTIMALIZÁCIA 317 sú a nebudú výnimkami. Pionierske časy nie sú len za nami, ale aj pred nami. Či v kryptológii, v počítaní s využitím náhody, DNA , kvantových výpočtoch alebo liečení pomocou „predpísania" informačných správ organizmu. Určite ešte môžeme zažiť zázraky, ktoré uvedú vedcov do úžasu a ako sprievodný vedľajší účinok prispejú nemerateľným spôsobom k zvýšeniu kvality nášho života. Ir J 6 J Nóvum je najprv vysmievané, potom popierané, až nakoniec sa berie ako samozrejmosť. Emil Filla 1. Doslov Informatika a všeobecné vzdelanie Dnes sú počítače rozšírené v domácnostiach podobne ako telefón, či televízor. Výrazy ako PC, internet, e-mail, alebo www patria medzi najhojne-jšie používané slovíčka v súčasnej informačnej spoločnosti. Ale schopnosť úspešne používať počítač alebo surfovať po internete ešte z nikoho nespravilo informatika, rovnako ako riadenia motorového vozidla z nikoho neurobilo strojára, alebo používanie prístrojov v domácnosti z nikoho neurobilo fyzika. Napriek tomu sa vyučovanie informatiky na školách príliš zaoberá sprostredkovaním vedomostí s krátkou životnosťou, napríklad o rôznych softvérových produktoch a ich používaní. Ako by vyzeralo vyučovanie fyziky, keby sme sa namiesto učenia fyzikálnych zákonov zaoberali ovládaním prístrojov a zariadení, ktorých funkčnosť je založená na princípoch fyziky? V mnohých krajinách sa vďaka tendenciám učiť „lacnú" informatiku považuje na školách informatika za povrchný a nudný predmet, vhodný nanajvýš pre pár hackerov alebo ako náhrada písacieho stroja pri vytváraní dokumentov. V niektorých krajinách ju vďaka tomu vylúčili z osnov stredoškolskej výučby aj preto, že jej náročnosť v porovnaní s inými predmetmi bola taká nízka, že pre školy bola maturitná skúška z informatiky pod úrovňou, pod ktorú by učitelia boli ochotní ísť. Preto bolo cieľom tejto knižky, a je aj cieľom tohto doslovu, upozorniť na skutočnosť, že informatika ako vedná disciplína má netriviálnu hĺbku a prináša poznanie, ktoré mení náš pohľad na svet a stáva sa súčasťou nášho kultúrneho a duchovného bohatstva. Ak chceme učiť informatiku ako predmet na stredných školách, musíme najprv pochopiť jej prínos na úrovni hlbokých myšlienok, pojmotvorby, odhalených zákonitostí spracovania informácií, a nie na úrovni každodenných aplikácií, akým je telefonovanie mobilnými telefónmi. Len a len z tejto úrovne môžeme odvíjať stredoškolské plány výučby, ktoré by z informatiky spravili predmet s vážnosťou porovnateľnou s matematikov a prírodnými vedami. 320 Doslov 1 Tak ako napríklad fyzika alebo biológia odvíja svoje poslanie v školách od podstaty svojej disciplíny a ich cieľov, potrebujeme sa najprv zamyslieť nad otázkou: Co je informatika? Najčastejšie nachádzame nasledujúcu definíciu: „Informatika je veda o algoritmickom spracovaní, reprezentácii, zapamätávaní a prenose informácií." Aj keď táto zvyčajne akceptovaná definícia informatiky predstavuje algoritmy a informáciu ako hlavné objekty výskumu v informatike, nehovorí veľa o podstate informatiky a jej metódach. Pre pochopenie podstaty informatiky je oveľa dôležitejšia nasledujúca otázka: „Ku ktorým vedám možno přiřadit informatiku? Je metavedou ako filozofia alebo matematika, humanitná veda, prírodná veda alebo technická veda?" Odpoveď na túto otázku objasňuje nielen objekt skúmania, ale pomáha opísať aj jej metódy a prínos. Odpoveďou je, že informatika sa nedá jednoznačne priradiť do žiadneho z uvedených druhov vedeckých disciplín. Informatika v sebe integruje aspekty metavedy, prírodnej vedy a aj technickej vedy. Skúsime to podrobnejšie opodstatniť. podobne ako filozofia a matematika, študuje informatika všeobecné kategórie ako sú determinovanosť, nedeterminovanosť, náhoda, výpočet, informácia, pravda, jazyk, zložitosť, dôkaz, poznanie, komunikácia, aproximácia, algoritmus, simulácia, atď. a prispieva k hlbšiemu chápaniu ich významu. Viacerým z týchto kategórií dala informatika nový obsah a význam. Ako prírodná veda študuje informatika, na rozdiel od filozofie a matematiky, konkrétne existujúce objekty a procesy, určuje hranicu medzi možným a nemožným a skúma kvantitatívne zákony procesov spracovania informácií. Prírodné vedy modelujú realitu, svoje modely analyzujú a overujú ich spoľahlivosť pomocou experimentov. Všetky tieto aspekty prírodných vied nachádzame aj v informatike. Jej predmetom sú informácie vo forme dát a algoritmy (programy, počítače) a študované procesy sú fyzikálne existujúcimi procesmi spracovania informácií. Skúsme to dokumentovať na vývoji informatiky. Historicky prvá otázka informatiky bola nasledujúca otázka filozofického významu: Existujú dobre definované úlohy, ktoré sa nedajú automaticky (po- 321 mocou počítača, nezávisle od výkonosti dnešných, či budúcich počítačov) riešiť? Úsilie zodpovedať túto otázku viedlo ku vzniku informatiky ako samostatnej vednej disciplíny. Odpoveď na túto otázku je kladná a dnes poznáme množstvo praktických úloh, ktoré by sme radi vedeli riešiť automaticky pomocou algoritmov, no ktoré nie sú ale algoritmicky riešiteľné6. Už vieme, že to nie je len preto, že nik doteraz nenašiel algoritmus na ich riešenie. Podstatné je, že vieme matematicky dokázať neexistenciu takýchto algoritmov. Po klasifikácii úloh na algoritmicky riešiteľné a algoritmicky neriešiteľné sa dôležitou otázkou informatiky stáva nasledujúca prírodovedná otázka^^Aké ťažké sú konkrétne algoritmické úlohy?" Obťažnosť úlohy nemeriame tým, aké ťažké je nájsť algoritmus na jej riešenie. Obťažnosť úlohy sa meria množstvom nevyhnutnej a postačujúcej počítačovej práce potrebnej na jej algoritmické riešenie. Informatici objavili, že existujú neobmedzene ťažké úlohy, aj také ťažké, že na ich riešenie by nestačila ani celá energia vesmíru. Takže vieme, že existencia algoritmu pre danú úlohu ešte nezaručuje jej automatizovateľnosť v praxi. Úsilie rozdeliť úlohy na prakticky riešiteľné a prakticky neriešiteľné viedlo a ešte stále vedie k najfascinujúcejším objavom informatiky. Z knižky môžeme spomenúť efekty, keď malá zmena v požiadavkách na riešenie úlohy spôsobila skok z prakticky nerealizovateľného množstva práce na niekoľkosekundovú záležitosť na bežnom PC. Najlepšie sme to videli na ran-domizovaných algoritmoch, kde sme sa vzdali hypoteticky 100% záruky korektnosti deterministických algoritmov a navrhli sme randomizované algoritmy, ktoré exponenciálne redukovali zložitosť. Pritom pravdepodobnosť chyby týchto algoritmov je menšia ako 1 k veku vesmíru v sekundách, a teda z praktického hľadiska nielen akceptovateľná, ale aj menšia ako pravdepodobnosť hardvérovej chyby v priebehu výpočtu 100% spoľahlivého deterministického algoritmu. Vďaka takýmto kvantitatívnym skokom je informatika schopná zázrakov, pomocou ktorých môžeme nečakane riešiť zdanlivo bezvýchodiskové situácie. Dopad týchto divov na prax je neuveriteľný. Napríklad výsledky o kvalitatívnych zákonitostiach výpočtov (výpočtovej zložitosti) viedli k novej definícii bezpečnosti v kryptografii a cez ňu k moderným kryptosystémom s verejným kľúčom (public-key), bez ktorých si nevieme dnes vôbec predstaviť e-komerciu alebo online banking. Je vôbec ospravedlniteľné vyučo- 6 pozri 4. kapitolu O} o o CN 322 Doslov 1 vať kompetencie narábania so špecifickými softvérovými systémami namiesto kreatívnych, hlbokých myšlienok, ktoré boli naozaj tým, čo zmenilo dnešný svet? Napriek uvedeným prírodovedným aspektom informatiky je informatika pre väčšinu absolventov štúdia inžinierskou disciplínou., ktorá obsahuje aspekty technických vied ako sú organizácia procesu vývoja, modelovanie, opis, formulovanie cieľov, testovanie, kontrola kvality, kompatabilita s existujúcimi systémami, atď. K tomu patria ajm manažérske aspekty ako sú organizácia tímov a riadenia projektu, odhad ceny, plánovanie, produktivita, odhad časových rámcov a termínov, čas potrebný na uvedenie na trh, marketing, uzatváranie zmlúv, atď. Aké komplexné sú tieto úlohy, si môžeme uvedomiť, keď uvážime, že mnohé softvérové produkty sú zostavené z miliónov počítačových príkazov a boli vyvíjané a vylepšované množstvom špecialistov počas mnohých rokov. Ak tieto programy neboli systematicky vyvíjané a dokumentované, nieje prakticky možné overiť ich správne fungovanie, hľadať v nich chyby, alebo ich dopĺňať o nové funkcie. Pri takejto praktickej zložitosti reálnych systémov nemožno s matematickou presnosťou všetko modelovať a predpovedať. Dôsledkom čoho sa veľa pragmatických rozhodnutí uskutoční len na základe intuície a skúseností tvorcov. Nezdá sa vám teraz štúdium informatiky dostatočne ťažké? Zvládnuť netriviálnu matematiku pri riešení úloh a umenie budovať pragmaticky komplexné systémy spája dva veľmi odlišné spôsoby myslenia. Na jednej strane je to analytický matematicko-prírodovedný spôsob myslenia a na druhej strane presne nesformalizované postupy technických vied s množstvom improvizácie založenej na skúsenostiach. Ale práve spojenie týchto dvoch jazykov a spôsobov myslenia v jednom študijnom odbore je tým, čo dáva tomuto štúdiu najväčšiu perspektívu. Vráťme sa k otázke, čo a ako vyučovať v predmete informatika na stredných školách. Vzdajme sa prístupu od „farebných aplikácii k nejakým vedomostiam" o tom, ako príslušné softvérové produkty pracujú a ako ich používať. Objav parnej lokomotívy bol tiež fascinujúci, a vyučovanie fyziky nezačíname tým, že sa učíme viesť lokomotívu. Dnes sú najrozličnejšie aplikácie na obrazovke také bežné, že nevedia zaujať. Zato naša dlhoročná prax vyučovania na stredných školách stále potvrdzuje, že mladých ľudí možno nadchnúť práve sprostredkovaním vedomostí, znovuobjavovaním a objasňovaním zákonitostí a učením sa ich inteligentne využívať na riešenie neľahkých úloh. 323 Ako začať? Tak ako matematika nemôže začať oslňujúcimi ideami ale naopak jednoduchým počítaním, musí si aj informatika zvoliť zodpovedajúci začiatok. Základnou schopnosťou informatika v tomto zmysle je vedieť programovať. Nie v zmysle syntaktického ovládania nejakého programovacieho jazyka, ale v zmysle schopnosti riešiť malé úlohy pomocou programov na počítači. Učiť sa programovať zahŕňa v sebe oveľa viac ako si mnohí uvedomujú. Programovaním sa učíme komunikovať s technikou. A to s technikou bez inteligencie, a tým aj bez schopnosti improvizovať. To nás núti komuniko-vať tak, aby sme boli bez pochýb správne pochopení. Musíme byť schopní opísať činnosti tak jednoznačne, že neostane priestor na neželanú chybnú interpretáciu. Už táto skutočnosť cibrí schopnosť vyjadrovať sa čo najpresnejšie a rozvíja zodpovedajúci spôsob myslenia. Ďalším, nie pre každého očividným prínosom je budovanie mostov medzi matematickým myslením a inžinierskym prístupom. Opis a analýza úlohy, hľadanie algoritmu na jej riešenie je pevne spojené so schopnosťou matematicky analyticky myslieť a tiež s používaním precízneho jazyka matematiky na opis úlohy a cesty na jej riešenie. Samotné programovanie a testovanie navrhnutého algoritmu je do značnej miery inžinierska práca. Hľadanie chýb a možných vylepšení programu vzhľadom na rôzne parametre zaberie zvyčajne niekoľkonásobne viac času, ako vyhotovenie prvého prototypu. Programovanie prináša radosť zo samostatného absolvovania cesty od zadania, až k požadovanému cieľu. Učiteľa stavia skôr do úlohy pomocníka ako kritika, pretože žiaci si môžu overovať správnosť svojich programov samostatne, testovaním na skutočných údajoch a programy korigovať až do vytvorenia požadovaného produktu. Vyučovaním programovania sprostredkujeme aj modulárnu metódu návrhu zložitých technických systémov. Pri komplexnejších úlohách vytvoríme najprv programy pre malé čiastočné úlohy a overíme ich korektnosť. Tieto programy použijeme ako moduly, z ktorých skladáme postupne zložitejšie a zložitejšie moduly. Už pri výučbe programovania začíname s pojmotvorbou. Učíme sa, čo je program, údaje. Učíme sa, ako pracuje počítač, ako sú reprezentované a uložené údaje v počítači. Na tomto základe ďalej môžeme budovať specifikováním ďalších kľúčových pojmov a specifikováním základných konceptov. Ako sa to dá realizovať sme načrtli v tejto knihe. Pritom nie je až také dôležité, ktoré oblasti informatiky si zvolíme - môžu to byť databázy, kryptografia, vizualizácia, návrh obvodov alebo automatov, algoritmika, komunikačné siete, numerické algoritmy vo vedeckých výpočtoch alebo iné. Dôležité je, aby sme boli schopní sprostredkovať základné koncepty ako algoritmus, výpočtová zložitosť, logika a korektná argumentácia, verifikácia a testovanie, mod-ulárny návrh systémov, simulácie, rekurzia, atď. 324 Doslov 1 Zavedenie informatiky do vyučovania na stredných školách nie je problematická úloha, ale šanca. Je to šanca vniesť do všeobecného vzdelania paradigmy sveta procesov spracovania informácií. Je to šanca zatraktívniť matematiku, jej inštrumentalizovanie pri riešení praktických úloh. Je to šanca postaviť mosty k technickým vedám a priblížiť inžiniersky spôsob práce žiakom na stredných školách. A je to šanca vykročiť smerom k dlho proklamovanej in-terdisciplinárnosti, ktorá sa v informatike realizuje prirodzeným spôsobom. Veda, ktorá by bola vybudovaná len za praktickým účelom, nie je možná. Pravdy sú užitočné len vtedy, keď sú navzájom poprepájané. Ak hľadáš len tie pravdy, z ktorých sa dajú očakávať priame dôsledky pre prax, strácajú sa väzby medzi ohnivkami reťazce a reťaz sa roztrhne. Jules Henri Poincaré 2. Doslov Je základný výskum luxusom alebo existenčnou nevyhnutnosťou? Môže si, resp. má si nejaká krajina dovoliť investovať do základného výskumu? Sú držitelia Nobelových a iných vedeckých cien zbytočným luxusom? Nestačí nám aplikovaný výskum na zabezpečenie dlhodobého blahobytu a pokroku? Čo sa stane, ak sa vzdáme základného výskumu? Má byť mierou investovania do výskumu odhad prínosu predaja vyvinutých produktov na medzinárodnom trhu? Počas svojho pôsobenia na rôznych univerzitách som sa stretával s týmito otázkami veľmi často. Žiaľ práve z politických a manažerských kruhov pochádzali krátkozraké odpovede a hlúpe rozhodnutia. Volanie po takzvanom ekonomickom plánovaní vedy, ktorá spočíva vo vyčíslení a vyžadovaní ekonomického prínosu vložených investícií do vedy v priebehu pár rokov, patrí do kategórií veľmi obmedzeného chápania úlohy vedy v spoločnosti a jej prínosu pre jej blahobyt. Populistické otázky, či základný výskum vôbec prispieva k rastu alebo udržaniu životnej úrovne a či to vôbec je zmysluplné využitie peňazí daňových poplatníkov a volanie po meraní užitočnosti vedy ekonomickým ziskom, nedokážem lepšie komentovať ako slovami Louisa Pasteura: „Nešťastníci sú tí, ktorým je všetko jasné". Najprv si musíme uvedomiť, že neexistuje jasná hranica medzi aplikovaným a základným výskumom. Aby sme ale vôbec túto problematiku dokázali pochopiť, musíme sa najprv zaoberať úlohou vedy v dnešnej tzv. znalostnej spoločnosti a v dejinách ľudstva. Položme si najprv otázku: Čo je aplikovaný výskum a čo je teoretický základný výskum a nachádzajú sa tieto oblasti vôbec vo vzájomnej konkurencii? Súčasný vývoj ukazuje, že máme čoraz väčší počet výskumných projektov, ktoré sa nedajú jednoznačne zaradiť 326 DOSLOV 2 len do jednej z týchto kategórií. Výskum génov, či konštrukcia kvantového počítača patria do základného výskumu, a jednako majú prakticky okamžité komerčné uplatnenia. Existuje veľa príkladov z kryptológie, spoľahlivej komunikácie, automatického rozpoznávania reči, logistiky a optimalizácie riadenia pracovných procesov, návrhu sietí atd'., v ktorých objavy teoretického výskumu zakrátko celkom zmenili prax. Tu niet jasnej hranice medzi základným a aplikovaným výskumom. No zdá sa, že autori návrhov šetrenia na luxuse základného výskumu vedia, v čom väzí rozdiel medzi základným a aplikovaným výskumom. Aplikovaný výskum je ten, v ktorom môžeme už počas plánovania vyčísliť ekonomický prínos. Ak sa to dá, musíme si položiť otázku, či v takomto prípade vôbec ide o výskum. Posudzoval som množstvo takto naplánovaných projektov a všetky mali jedno spoločné. V skutočnosti ich nebolo treba. Firmy mohli hravo dosiahnuť vytýčené ciele zamestnaním absolventov univerzít s patričným know-how. A to je jadro nášho problému. To, čo sa v procese riadenia často deklaruje ako aplikovaný výskum, je iba rutinné uplatnenie znalostí, pri ktorom nevzniká nič pôvodné, nijaké nové poznatky. Rast vedomostí je najdôležitejším predpokladom dlhodobého pokroku. Kto predvídal pred 25 rokmi éru internetovej komunikácie a internetu, e-komercie a online bankingu, ktoré tak výrazne zmenili celú spoločnosť, zefektívnili množstvo jej procesov a prispeli k ťažko vyčíslitelnému rastu životnej úrovne? Kto pred 25 rokmi tušil, že komunikačná technika sa stane dôležitým odvetvím priemyslu? Mohol vtedy vôbec niekto odhadovať finančnú a ekonomickú prosperitu vtedajšieho výskumu? Veda, ktorá toto umožnila, spočívala v prvom rade na základnom výskume fyzikálnej povahy pri objavovaní nových materiálov pre komunikačné technológie a v matematike a informatike pri vývine efektívnych a spoľahlivých algoritmov. Len veľmi málo ľudí má predstavu, aké hlboké poznatky a objavy týchto vedných disciplín boli nevyhnutné na vývin súčasného komunikačného luxusu. Nijaké zmeny vedúce k zvýšeniu blahobytu spoločnosti nie sú možné bez predchádzajúcej akumulácie poznatkov. Iba konzumovať súčasné poznatky môže prinášať zisky len veľmi krátkodobo. Bez nepredpovedateľného generovania nových poznatkov niet životného napredovania ani blahobytu. Slovíčko blahobyt nie je v tejto súvislosti zvolené práve šťastne. Niektorí politici a ekonómovia sa nám usilujú nahovoriť, že blahobyt je najdôležitejší cieľ spoločnosti. Tento populistický názor je prirodzene obľúbený, pretože sa týka každého a každý sa chce mať lepšie. Ale argumentovať len z pozície súčasného blahobytu je rovnako nebezpečné, ako keď niekto v dobe kamennej doporučoval, každý deň sa čo najlepšie najesť a neodkladať zásoby na zimu. 327 Tento spôsob uvažovania nepamätá na to, že v zime možno zomrieť od hladu. Ak sa nazdávame, že tieto problémy patria minulosti, odpovedám vám, že sa na svet pozeráte cez ružové okuliare. Z môjho pohľadu bežíme stále s časom o preteky a rozhoduje sa o existencii ľudstva. Naša zemeguľa nám dožičila 10 000 rokov mimoriadne priaznivých klimatických podmienok, ktorým v značnej miere vďačíme za dynamický vývin našej civilizácie. Nemáme ale ani potuchy, čo všetko nás ešte čaká. Keď prídu časy plné problémamov neznámych rozmerov, nebude rozhodujúce, či žijeme v blahobyte alebo nie, ale či sme dospeli do štádia vývoja, v ktorom by sme boli schopní tieto problémy zvládnuť. To môže byť naozaj, existenčná otázka. Spomeňte si na obrovskú vlnu tsunami pred pár rokmi, ktorá stála život desaťtisíce ľudí. Stav našich poznatkov nebude rozhodovať len o tom, či sme schopní s dostatočným predstihom ďalšiu takúto tsunami predpovedať, ale či sme schopní v dostatočnej miere zabrániť škodám, ktoré by mohla spôsobiť. Preto je neospravedlniteľné riskantné, sústrediť sa v časoch hojnosti a nadbytku na udržovanie a budovanie blahobytu namiesto investícii do ďalšieho vývinu. Transformácia vedomosti do prakticky užitočných technológií je jedna z dôležitých mier pokroku. Potrebné vedomosti vznikajú príznačne vo výskume, ktorého ekonomickú užitočnosť v nasledujúcich 10 až 20 rokoch nevieme odhadnúť. Deň držiteľov Nobelových cien počas osláv 150. výročia ETH Zúrich poukázal na skutočnosť, že cesta od základných objavov vedy k priemyselným aplikáciám trvá v priemere 20 rokov. A kto sa odváži dnes predpovedať, ako bude o 20 rokov vyzerať náš svet? Azda len tí šťastní nevedomí, ktorí sa nazdávajú, že rozumejú všetkému. Požadovanie „čisto" aplikovaného a „užitočného" výskumu bez snahy o generovanie nových poznatkov je rovnako nebezpečné, ako považovanie umenia za nadmerný luxus. Vraj Načo sú umelci ako Picasso, Dali, Hundertwass-er, Mozart alebo Beethoven? Nestačia väčšina k spokojnosti reprodukcie a populárna hudba? Nie sú veľkí spisovatelia niečím bez čoho môže ľudstvo pokojne existovať? Veď koľko sa predá aj málohodnotných románov. Pred skutočnosťou, že veľké umelecké diela ovplyvnili vývoj celých generácií, zavrime radšej oči. A rovnako zabudnime na to, že vede a umeniu bez ohraničeného horizontu vďačíme nielen za vysnený blahobyt, ale aj za celé napredovanie našej civilizácie. Cieľom tohto doslovu nebolo navrhnúť proporcie medzi investíciami do aplikovaného a základného výskumu. Chceli sme len poukázať na to, aké nebezpečné je redukovať financovanie vedy na podporu projektov s vyčíslitelným úžitkom. Takéto správanie sa je extrémne krátkozraké a vedie 328 DOSLOV 2 k strate postavenia produkcie znalostí a celého vzdelávania v spoločnosti. Spoľahnúť sa na samoriadenie vedeckého výskumu prostredníctvom priemyselného dopytu prináša so sebou riziko stagnácie vývoja. Ak nejaký podnik investoval veľa peňazí do nejakej technológie, nemá záujem o podstatné technologické zmeny, pokiaľ sa mu ešte pôvodné investície nezhodnotili. Len konkurencia tlačí firmy k podstatným inováciám. Jediný mne známy funkčný prístup prerozdeľovania prostriedkov na vedu je prostredníctvom posudkov nezávislých osobností vedy. Hľadať akékoľvek kvantitatívne meradlá na posudzovanie kvality kreatívnej výskumnej práce je nezmyselné. Je škoda, že Slovensko ešte nevedelo spraviť podstatný krok od celoplošného socialistického rozdeľovania financií v školstve a vede na prerozdeľovania prostriedkov na základe takýchto posudkov zahraničných expertov. Priveľa slovenských inštitúcií má strach z nastavenia zrkadla. Prosperitu vo vede môže priniesť len prerozdelenie prostriedkov tak, aby kreatívne vedecké pracoviská mali zabezpečené dostatočné prostriedky na sledovanie náročných cieľov. Súčasná rovnostárska polonasýtenosť finančnými prostriedkami na vedeckých inštitúciách bez ohľadu na ich skutočné kvality je tragédiou riadenia slovenskej vedy v celom období od vzniku Slovenskej republiky. Aké je naše posolstvo neohraničené slovenskými pomermi? Čím viac dobrej vedeckej práce, tým istejšia budúcnosť, tým viac kreatívnej práce a tým viac vnútornej spokojnosti. Ja osobne verím, že kreativita je zmyslom nášho života a preto ukončím doslov nasledujúcimi citátmi: Pôvodná verzia tohto doslovu vyšla v nemčine ako článok „io new manage- Korene všetkého zla sú v nevedomosti. Buddha menť, Nr. 10/2006. Literatúra [BB03] D. Bongartz and H.-J. Bäckenhauer. Algorithmische Konzepte der Bioinformatik. Teubner, 2003. [Beu02a] A. Beutelspacher. Geheimsprachen. Geschichte und Techniken. Verlag P. H. Beck, München, 2002. [Beu02b] Albrecht Beutelspacher. Kryptologie. Friedr. Vieweg & Sohn, Braunschweig, sixth edition, 2002. Eine Einführung in die Wissenschaft vom Verschlüsseln, Verbergen und Verheimlichen. [Úvod do vedy šifrovania, ukrývania a utajovania]. [Čer85] V. Černý. A Thermodynamical Approach to the Traveling Salesman Problem: An Efficient Simulation Algorithm. Journal of Optimization Theory and Applications, 45, 1, 41-51, 1985. [DH76] Whitfield Diffie and Martin E. Hellman. New directions in cryptography. IEEE Trans. Information Theory, IT-22(6):644-654, 1976. x [Die04] Martin Dietzfelbinger. Primality testing in polynomial time, volume 3000 of Lecture Notes in Computer Science. Springer-Verlag, Berlin, 2004. From randomized algorithms to "PRIMES is in P". [DK02] Hans Delfs and Helmut Knebl. Introduction to cryptography. Information Security and Cryptography. Springer-Verlag, Berlin, 2002. Principles and applications. [Drl92] K. Drlica. Understanding DNA and Gene Cloning. A Guide for CURIOUS. John Wiley and Sons, New York, 1992. [Fey61] R. P. Feyman. Miniaturisation. D.H. Gilber (ed), pages 282-296, 1961. 330 LITERATÚRA [Hro97] J. Hromkovic. Communication complexity and parallel computing. Texts in Theoretical Computer Science. An EATCS Series. Springer-Verlag, Berlin, 1997. [Hro04a] J. Hromkovic. Algorithmics for Hard Problems. Springer Verlag, 2004. [Hro04b] J. Hromkovic. Randomisierte Algorithmen. Methoden zum Entwurf von zufallsgesteuerten Systemen für Einsteiger. Teubner, 2004. [Hro04c] J. Hromkovic. Theoretische Informatik. Teubner, 2004. [Hro05] J. Hromkovic. Design and analysis of randomized algorithms. Texts in Theoretical Computer Science. An EATCS Series. Springer-Verlag, Berlin, 2005. Introduction to design paradigms. [KGV83] S. Kirkpatrick, C. D. Gelatt Jr., M. P. Vecchi. Optimization by Simulated Annealing, Science, 220, 4598, 671-680, 1983. [KN97] Eyal Kushilevitz and Noam Nisan. Communication complexity. Cambridge University Press, Cambridge, 1997. [MR95] Rajeev Motwani and Prabhakar Raghavan. Randomized algorithms. Cambridge University Press, Cambridge, 1995. [MRR+53] N. Metropolis, A. W. Rosenbluth, M. N. Rosenbluth, Teller A. H., and E. Teller. Equation of state calculation by fast computing machines. Journal of Chemical Physics, 21:1087-1091, 1953. [PRS05] Ch. Päun, G. Rozenberg, and A. Salomaa. DNA Computing. New Computing Paradigms. Springer Verlag, 2005. [RSA78] R. L. Rivest, A. Shamir, and L. Adleman. A method for obtaining digital signatures and public-key cryptosystems. Comm. ACM, 21(2):120-126, 1978. [Sal96] Arto Salomaa. Public-key cryptography. Texts in Theoretical Computer Science. An EATCS Series. Springer-Verlag, Berlin, second edition, 1996. V