P-II-1 Šifrovací mřížka
Jednou z metod šifrování zpráv je použití šifrovací mřížky.
Šifrovací mřížka je čtverec rozdělený na 2N x 2N
čtvercových políček, přičemž smluvených N^2 políček je
z tabulky vyříznutých. Při šifrování mřížku položíme na
čtvercovou tabulku stejných rozměrů (2N x 2N políček) a do
každého výřezu zapíšeme jeden znak zprávy. Postupujeme přitom po
řádcích shora dolů a v každém řádku zleva doprava. Tento postup
ještě třikrát zopakujeme s mřížkou otočenou o 90o,
180o a 270o ve směru pohybu hodinových ručiček.
Zašifrovaná zpráva se získá přečtením tabulky po řádcích. Aby
byla daná mřížka použitelná pro šifrování, každá pozice v tabulce
musí být odkryta popsaným způsobem právě jednou.
Tuto základní metodu šifrování můžeme použít i vícenásobně tak, že zašifrovaný text opakovaně zašifrujeme pomocí téže mřížky. V tomto případě si tedy uživatelé šifry musí zvolit nejen mřížku, ale také číslo k, které určuje počet opakování šifrovacího procesu. Pro některá čísla k se nám však může stát, že když zašifrujeme danou mřížkou libovolný text k-krát, dostaneme vždy původní text. Vaším úkolem je nalézt algoritmus, který pro zadanou šifrovací mřížku najde nejmenší k > 0 této vlastnosti.
Vstupem vašeho algoritmu bude číslo N a matice 2N x 2N obsahující nuly a jedničky, přičemž jedničky označují vyříznuté čtverečky a nuly nevyříznuté. Můžete předpokládat, že mřížka zadaná na vstupu je správná (tj. je použitelná pro šifrování). Pro tuto mřížku váš algoritmus nalezne nejmenší kladné číslo k takové, že z každého textu po k-násobném zašifrování dostaneme původní text.
| 0 | 1 |
| 0 | 0 |
abcd, po prvním zašifrování dostaneme dacb, po
druhém bdca a po třetím zašifrování opět původní
abcd (abychom dokázali, že k=3, bylo by třeba ukázat, že
pro každý vstupní řetězec dostaneme po třech opakováních původní
řetězec).
P-II-2 Tajemný kryptogram
Popisovaný šifrovací systém vychází z reálného systému
používaného během 1. světové války. Je dána tabulka č. 1, která má
6 řádků a 6 sloupců. V jednotlivých políčkách tabulky jsou
zapsána písmena a číslice:
| Tabulka č. 1 | ||||||
| A | D | F | V | M | X | |
| A | Z | 3 | E | N | V | A |
| D | Y | C | X | J | P | Q |
| F | D | H | 2 | O | 0 | 7 |
| V | W | R | K | F | T | 1 |
| M | I | S | U | M | 4 | G |
| X | 6 | 8 | 9 | 5 | B | L |
B
nahradíme dvojicí XM). Mezitext potom zapíšeme po řádcích
do druhé (tzv. permutační) tabulky. V záhlaví sloupců
permutační tabulky se nacházejí navzájem různá písmena. Abecední
pořadí těchto písmen potom určuje pořadí, v němž vypíšeme sloupce
tabulky do zašifrovaného textu.
Jestliže například v záhlaví permutační tabulky máme postupně
písmena V, Y, H, R, A
a J a chceme zašifrovat text KRYPTOGRAFIE,
dostaneme:
| V | Y | H | R | A | J |
| V | F | V | D | D | A |
| D | M | V | M | F | V |
| M | X | V | D | A | X |
| V | V | M | A | A | F |
DFAAVVVMAVXFDMDAVDMVFMXV.Byl nalezen dlouhý zašifrovaný text, přičemž je známa použitá šifrovací tabulka č. 1, není však známo záhlaví permutační tabulky. Dále byl nalezen dlouhý seznam obvykle používaných záhlaví permutační tabulky. Jednou z možností, jak zašifrovaný text rozšifrovat, je vyzkoušet postupně všechna obvykle používaná záhlaví a zjistit, pro která z nich dostaneme smysluplný text. Problém však spočívá v tom, že záhlaví je příliš mnoho, a proto je třeba některá z nich vyloučit pomocí počítače.
Záhlaví označujeme jako potenciálně smysluplné, jestliže
v textu, který dostaneme rozšifrováním pomocí tohoto záhlaví,
počet dvojic po sobě následujících písmen typu
souhláska-samohláska a samohláska-souhláska je aspoň
trojnásobkem počtu dvojic typu samohláska-samohláska nebo
souhláska-souhláska. Číslice se nepovažují za písmena.
Například slovo LEPIDLO5 obsahuje pět dvojic první skupiny
a jen jednu dvojici z druhé skupiny.
Pokuste se, aby váš algoritmus fungoval co nejrychleji za předpokladu, že počet záhlaví k je velmi velký (může být až 3 milióny) a délka zašifrovaného textu m je velká v porovnání s délkou jednotlivých záhlaví n (n je řádově 10, m řádově několik tisíc). Proveďte diskusi časové a paměťové složitosti vzhledem k parametrům m, n, k.
P-II-3 Hra se zápalkami
Dva hráči hrají následující hru: Na začátku hry jsou dány dvě hromádky
zápalek. Na první hromádce je a zápalek, na druhé je b zápalek
(a,b > 0).
V jednom tahu může hráč odebrat z některé z těchto hromádek právě 2k nebo 3k zápalek, kde k je libovolné nezáporné celé číslo (na této hromádce zůstává nezáporný počet zápalek). Hráči se střídají v tazích. Prohrává hráč, který je na tahu, ale nemůže tah učinit.
Popište všechny dvojice čísel a,b, pro které existuje vítězná strategie pro hráče, který táhne jako první. Své tvrzení dokažte.
P-II-4 Markovovy algoritmy
Konečnou množinu symbolů T={a0,a1,...,
an} nazveme abecedou.
Prvky množiny T budeme nazývat znaky
abecedy. Slovem P v abecedě T nazveme každou konečnou
posloupnost znaků abecedy T. Prázdné slovo budeme
označovat symbolem _. Algoritmem v abecedě T
budeme rozumět funkci, jejíž definičním oborem je podmnožina
slov v abecedě T a oborem hodnot je opět podmnožina slov
v T. Nechť P je slovo v abecedě T. Řekneme, že algoritmus
A je přípustný pro slovo P, právě když P je
prvkem jeho definičního oboru. Většinu algoritmů je možno
rozdělit na nějaké jednodušší kroky. Jeden ze způsobů navrhl
v roce 1954 A. A. Markov. Základní operací je substituce jednoho
slova za jiné. Výrazy P-> Q a P->. Q,
kde P a Q jsou slova v abecedě T, nazýváme formulemi
substituce v abecedě T. Přitom předpokládáme, že šipka
(->) a tečka (.) nejsou prvky T. Některé
ze slov P a Q může být i prázdné. Formuli P->
Q nazýváme obyčejnou a formuli P->. Q
nazýváme koncovou. Zápisem P->(.)Q
rozumíme buď formuli P-> Q, nebo P->.
Q. Konečný seznam formulí substituce v abecedě T
P1 -> (.)Q1
P2 -> (.)Q2
...
Pr -> (.)Qr
nazýváme schéma algoritmu A.
Řekneme, že slovo W je obsaženo ve slově Q, právě
když existují taková slova U, V (mohou být i prázdná), že
Q=UWV. Algoritmus A pracuje následujícím způsobem. Nechť
je dáno slovo P v abecedě T. Ve schématu algoritmu
A najdeme první formuli Pm ->(.)Qm
(1 <= m <= r) takovou,
že Pm je obsaženo v P. Provedeme
substituci nejlevějšího výskytu slova Pm
na Qm. Označme
R1 slovo, které je výsledkem této substituce. Můžeme napsat
A: P|-R1.
Je-li Pm ->. Qm koncová
formule substituce, činnost algoritmu A končí, jeho
hodnotou je slovo R1 a
píšeme A(P)=R1.
Je-li Pm -> Qm obyčejná formule substituce,
aplikujeme na R1 stejný postup, který jsme použili na slovo
P. Tímto způsobem pokračujeme dále. Dostaneme posloupnost slov
P,R1,...,Ri (i >= 1). Můžeme psát
A: P |- R1,...,|- Ri
nebo též zkráceně
A: P |-> Ri
Jestliže v určitém okamžiku nastane situace, že ani jedno ze slov
P1,...,Pr není obsaženo v Ri,
potom činnost
algoritmu rovněž končí a Ri je hodnotou algoritmu
A. Může se ovšem stát, že popsaný postup nikdy nekončí.
V takovém případě řekneme, že algoritmus není přípustný
pro slovo P.
Výsledek činnosti algoritmu A je pro P následující:
Uvažujme schéma
_ ->. 1
Pro libovolné slovo P v T platí zřejmě A(P)=1P, což
můžeme zapsat ve tvaru A([n])=[n+1] pro
libovolné přirozené číslo n. (Uvědomte si, že každé slovo P
začíná prázdným slovem _, tj. P=_ P).
Abecedu B nazveme rozšířením abecedy T, je-li T podmnožinou B. V řadě případů je nutno při konstrukci schématu algoritmu v abecedě T použít mimo znaků abecedy T ještě další pomocné znaky. Pak řekneme, že jsme vytvořili schéma algoritmů nad abecedou T (tj. v nějaké abecedě B, která je rozšířením T).
Uvažujme zkrácené schéma algoritmu v abecedě B=TU{b1,b2}:
(a) b1b1->b2
(b) b2x->xb2 (x prvkem T)
(c) b2b1->b2
(d) b2->. _
(e) b1yx->x b1 y (x,y prvky T)
(f) _->b1
div b.
Čísla jsou na začátku činnosti algoritmu oddělena dvojtečkou.
Zdůvodněte jeho správnost.
11111:111)=1111111:11)=111111111:1111)=111111:1.