Vyčíslitelnost a složitost výpočtů

Turingův stroj - model mechanického výpočtu

Shrnutí kapitoly

Pojem mechanický výpočet označuje proces, který probíhá samočinně podle předem stanovené posloupnosti kroků. Nemusí být nutně prováděn mechanickým strojem, i když první počítače mechanické byly. Vývoj výpočetních strojů ve 20. století vyprovokoval řadu otázek týkajících se limitů jejich schopností.

Původní představy, že počítače mohou vyřešit jakýkoli matematický nebo fyzikální problém, byly vyvráceny už v prvních dekádách 20. století. Pro zodpovězení této otázky vznikla ve 20. století celá řada matematických modelů výpočtu, ovšem ukázalo se, že všechny řeší tutéž třídu úloh, přičemž řada úloh zůstává neřešitelných. Turingova-Churchova teze tvrdí, že třída řešitelných úloh je stejná pro všechny počítače, které můžeme zkonstruovat.

Postupně se pro svou jednoduchost a praktičnost etabloval jako matematický model výpočtu tzv. Turingův stroj. V poslední době sílí snahy o jeho modernizaci nebo nahrazení jiným modelem. Původní představy totiž nepočítaly s propojenými sítěmi typu Internet, které dovolují počítačům nepředvídatelně komunikovat a neustále se vyvíjet. Tyto vlastnosti zvětšují výpočetní potenciál počítačové sítě jako celku.

Turingův stroj se v literatuře vyskytuje v několika variantách, jež se však neliší svou výpočetní silou. Jinými slovy, každá z variant může simulovat kteroukoli jinou, byť někdy za cenu zpomalení nebo větší spotřeby paměti (pásky). Existence více variant je užitečná: když chceme činnost stroje popsat matematicky, je výhodné použít co nejjednodušší variantu. Naopak když ukazujeme, že stroj zvládne jistý algoritmus, je pohodlné použít variantu s mocnějšími operacemi, jako např. vícepáskový stroj.

Univerzální Turingův stroj může simulovat činnost kteréhokoli jiného Turingova stroje. Jeho existence spolu s Turingovou-Churchovou tezí dává důležitý důsledek: je-li počítač schopen simulovat Turingův stroj, pak může simulovat i kterýkoli jiný počítač.

Studijní materiál

Skripta P. Sosík, Teorie vyčíslitelnosti, od začátku skript až po kapitolu 2.1.2 včetně.

Příklady a problémy
  1. Navrhněte TS, který vypočte celou část dekadického logaritmu z čísla zapsaného v desítkové soustavě. TS bude mít na vstupu číslo v desítkové soustavě a jeho výstupem bude celá část dekadického logaritmu zapsaná v unární soustavě. 
    • Řešení tohoto příkladu je překvapivě jednoduché, proto podáme návod k řešení v podobě jednoduché otázky: čím se dekadický logaritmus čísla v desítkové soustavě podobá tvaru tohoto čísla?

  2. Navrhněte TS, který vypočte celou část podílu binárního čísla děleného dvěma. TS bude mít na vstupu číslo v binární soustavě a jeho výstupem bude celá část podílu zapsaná v binární soustavě. 
    • I tento příklad je velmi jednoduchý. Návod: zkuste totéž s číslem v dekadické soustavě, které vydělíte desíti.

  3. Navrhněte TS, který sečte dvě čísla v unární soustavě.
    • Bez nápovědy

  4. Navrhněte TS, který vynásobí dvě čísla v unární soustavě.
    • Nápověda: Použijte více pásek.

  5. Navrhněte TS, který rozpoznává mocniny dvou zapsané (a) v unární soustavě, (b) v binární soustavě.

    • Nápověda: Jaké číslo získáme, budeme-li mocninu dvou neustále dělit dvěma? Zamyslete se, jak je zapsáno sudé číslo v unární soustavě a jak pomocí TS číslo vydělit dvěma. Použijte více pásek.

  6. Navrhněte TS, který rozpoznává faktoriály nezáporných celých čísel v unární soustavě.
      • Nápověda: Použijeme více pásek. Násobit dvě čísla již umíme, takže umíme na jedné pásce postupně generovat faktoriály a porovnávat je se vstupem. Je-li číslo na vstupu větší, než vygenerovaný faktoriál, pokračujeme v generování, pokud je vstup shodný s vygenerovaným faktoriálem, pak číslo přijmeme, pokud je vstup menší, pak se nejedná o faktoriál žádného čísla.

    1. Navrhněte TS, který přijímá jazyk L1 = {ai bi ci | i ≥ 0}.
      • Bez nápovědy.

    2. Navrhněte TS, který přijímá jazyk L2 = {ww | w ∈ {a, b, c}* }.
      • Použijeme více pásek. Nejprve je třeba zjistit, zdali je slovo na vstupní pásce sudé délky a při té příležitosti si na jednu pásku zapíšeme jeden pomocný symbol za každý druhý znak na vstupní pásce. Tímto nalezneme předěl jednotlivých slov. Jedno slovo si zapíšeme na jinou pásku a slova porovnáme.