Komprimace dat a kryptologie
Myšlenka: Jak zakódovat vstupní data do jediného čísla? Data se zakódují do zlomku n, 0 ≤ n < 1, n ∊ R Bezztrátová komprese
Podle pravděpodobnosti výskytu znaku je každému znaku přiřazena poměrná část intervalu <0,1). To je interval rozdělení znaků. SymbolPravděpodobnostInterval a 0.30<0.00, 0.30) b 0.15<0.30, 0.45) ……… z0.10<0.9,1.00)
Potom postupně upřesňujeme počáteční interval <0,1), dokud není vyprázdněn vstup. Číslo n leží ve vypočítaném intervalu. Zavedeme symboliku: Horní hodnota intervalu … high Spodní hodnota intervalu … low Rozpětí intervalu … range
Výpočet nových hranic intervalu pro jednotlivé znaky: high = low + range * horní hodnota intervalu znaku low = low + range * spodní hodnota intervalu znaku Výpočet probíhá pro všechny symboly na vstupu.
Číslo, které kóduje vstupní řetězec může být libovolné číslo z výsledného intervalu. Obvykle se bere to, které má nejkratší binární zápis.
Chceme zakódovat řetězec „ace“. Máme např. abecedu se znaky a,b,c,d,e. Provedeme rozdělení pravděpodobnosti výskytu znaků do intervalu znaků <0,1). SymbolPravděpodobnostInterval a 0.30<0.00, 0.30) b 0.15<0.30, 0.45) c 0.25<0.45, 0.70) d 0.10<0.70, 0.80) e 0.20<0.80, 1.00)
Výpočet nových hranic intervalu pro každý znak. Výsledný interval: <0.195,0.210) Jako výslednou hodnotu vybereme např. n=0.20 KrokSymbolPředchozí range lowhigh 001 1a c e
Při dekódování není potřeba předávat výsledný interval, stačí jen zvolené číslo n. Musíme mít ale k dispozici pravděpodobnosti výskytu znaků abecedy. Číslo n postupně upravujeme a při každém kroku k němu najdeme příslušný znak podle intervalu, ve kterém právě leží n. Nová hodnota n se vypočítá podle vztahu: n = (n – low) / range low, high … hodnoty intervalu, do kterého patří n Opakujeme tak dlouho, dokud není celý řetězec dekódován.
n = 0.20 Stanovíme jednotlivé znaky: Výsledný řetězec: „ace“ nlowhighrangeSymbol a c e
Problém: nekonečně dlouhý řetězec povede na interval s nekonečně velkou přesností. Je potřeba nekonečně mnoho bitů pro uložení. Řešení: V proměnných low a high se ukádá jen několik posledních desetinných míst, zbytek je zapsán na výstupu. V době kdy se rovnají MSB (nejvýznamnější bity) horní i dolní hranice intervalu, vypíšeme hotnotu na výstup a posuneme vlevo obě proměnné o jeden bit.
Pokud se MSB nerovnají, může nastat další další problém – podtečení. V situaci, kdy jsou hranice intervalu velmi blízko a stále nemají stejný MSB, mění se dále už jen ostatní bity, nikoli MSB – nedojde k posunu bitů vlevo a přesnost se ztratí. Podtečení nastává v případě, že dva MSB v low a se liší od jejich protějšků v high.
Řešení: Posun bitů vlevo od druhého bitu. Např.: low = high = podtečení posun: low = high =
begin spočti četnosti zdrojových jednotek output(četnosti) interval I := nový interval 0..1 rozděl I podle četnosti jednotek readSymbol(X) while (X!=EOF) do begin if (MSB(low) == MSB(high)) then begin output(MSB) případné zahozené číslice na výstup shift left high i low end else begin if (nebezpečí podtečení) then begin shift left high i low od druhé pozice end spočti nové low a high readSymbol(X) end output(zbytek) end
Srovnatelné s Huffmanovým kódováním Komprese trvá déle, ale má lepší kompresní poměr. JPEG JBIG2