Teoria informacji/TI Wykład 1: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Stromy (dyskusja | edycje)
m TI Wykład 1 moved to Teoria informacji/TI Wykład 1: Przeniesienie na podstronę wykładu
Stromy (dyskusja | edycje)
Nie podano opisu zmian
Linia 11: Linia 11:
Zauważmy że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym są „ciasno upakowane”. Dowolny ciąg znaków ze zbioru {0, 1, …, 9} jest jakąś liczbą (o ile nie zaczyna się od zera), ale bardzo niewiele ciągów z liter {a, b, …, z} jest sensownymi słowami. Wynika to między innymi z tego że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać gdy jest ona wykorzystywana celowo:
Zauważmy że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym są „ciasno upakowane”. Dowolny ciąg znaków ze zbioru {0, 1, …, 9} jest jakąś liczbą (o ile nie zaczyna się od zera), ale bardzo niewiele ciągów z liter {a, b, …, z} jest sensownymi słowami. Wynika to między innymi z tego że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać gdy jest ona wykorzystywana celowo:


Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu małe przekłamanie nie zmienia wpisanej kwoty.
Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu nie musimy obawiać się że jakaś literówka zmieni wartość wpisanej kwoty.




Linia 19: Linia 19:




Zacznijmy od podstaw. Czy istnieją wiadomości których nie da się zapisać zwięźlej? Dowolną wiadomość możemy traktować jako ciąg bitów, czyli po prostu liczbę naturalną. Istnieje wiele sposobów zapisu liczb, i zajmowanie się wszystkimi naraz prowadzi do paradoksów. Rozważmy przykładowe zdanie ('''paradoks Berrego'''):
Zacznijmy od podstaw. Czy istnieją wiadomości których nie da się zapisać zwięźlej? Dowolną wiadomość możemy traktować jako ciąg bitów, czyli po prostu liczbę naturalną. Liczby naturalne można oczywiście zapisywać na wiele sposobów, i co więcej nie możemy zajmować się nimi wszystkimi „w ogólności”. Prowadzi do paradoksów:


''Niech '''n''' będzie najmniejszą liczbą naturalną której nie da się zdefiniować za pomocą mniej niż dwudziestu słów.''  
Rozważmy przykładowe zdanie ('''paradoks Berrego'''):
 
''Niech ''n'' będzie najmniejszą liczbą naturalną której nie da się zdefiniować za pomocą mniej niż dwudziestu słów.''  


Dwadzieścia słów można dobrać tylko na skończenie wiele sposobów. Nawet gdyby każdy sposób definiował inną liczbę, pozostaje nieskończenie wiele liczb których zdefiniować tak się nie daje. Wśród nich któraś jest najmniejsza, i właśnie ją zdefiniowaliśmy za pomocą mniej niż dwudziestu słów – sprzeczność.  
Dwadzieścia słów można dobrać tylko na skończenie wiele sposobów. Nawet gdyby każdy sposób definiował inną liczbę, pozostaje nieskończenie wiele liczb których zdefiniować tak się nie daje. Wśród nich któraś jest najmniejsza, i właśnie ją zdefiniowaliśmy za pomocą mniej niż dwudziestu słów – sprzeczność.  


Istotne jest zatem prawidłowe zdefiniowanie notacji, która służy nam do definiowania liczb. Notacja nie może być częścią badanego obiektu. Musi być czymś zewnętrznym, nadanym w celu rozróżniania pomiędzy obiektami.
Istotne jest zatem prawidłowe zdefiniowanie notacji, która służy nam do definiowania liczb. Aby uniknąć paradoksów takich jak wyżej, notacja nie może być częścią badanego obiektu. Musi być czymś zewnętrznym, nadanym w celu rozróżniania pomiędzy obiektami.




'''Definicja:'''
{{definicja|[Notacja]|Notacja| '''Notacją''' dla ''S'' nazywamy dowolną różnowartościową funkcję <math>\alpha:S \to \Sigma^*</math> gdzie <math>\Sigma</math> jest skończonym alfabetem.
''Notacją'' dla ''S'' nazywamy dowolną różnowartościową funkcję <math>\alpha:S \to \Sigma^*</math> gdzie <math>\Sigma</math> jest skończonym alfabetem.
}}




'''Fakt: ''' Jeśli <math> |S| = m \ge 1</math> i <math>|\Sigma|=r\ge2</math> to dla pewnego <math>s \in S</math> zachodzi:  
{{fakt||fakt_notacji| Jeśli <math> |S| = m \ge 1</math> i <math>|\Sigma|=r\ge2</math> to dla pewnego <math>s \in S</math> zachodzi:  
 
:<math>|\alpha(s)|\ge \lfloor log_r m \rfloor</math>
:<math>|\alpha(s)|\ge \lfloor log_r m \rfloor</math>
}}


'''Dowód: '''
'''Dowód: '''
Linia 41: Linia 43:
:<math>1 + r + r^2 + \ldots + r^{k-1}=\frac{r^k-1}{r-1}<r^k </math>
:<math>1 + r + r^2 + \ldots + r^{k-1}=\frac{r^k-1}{r-1}<r^k </math>


Podstawiając <math>k=\lfloor log_r m \rfloor </math> stwierdzamy że nie ma wystarczająco wiele ciągów krótszych niż ''k'' do oznaczenia wszystkich elementów ''S''.  
Podstawiając <math>k=\lfloor log_r m \rfloor </math>, stwierdzamy że nie ma wystarczająco wiele ciągów krótszych niż ''k'' do oznaczenia wszystkich elementów ''S''.  
QED.
QED.




'''Wniosek: ''' Jeśli <math>\alpha: N\to \Sigma^*</math> jest dowolną notacją dla liczb naturalnych, to dla nieskończenie wielu ''n'' musi zajść: <math>\alpha(n)> \lfloor log_r n \rfloor </math>
{{wniosek||wniosek_notacji| Jeśli <math>\alpha: N\to \Sigma^*</math> jest dowolną notacją dla liczb naturalnych, to dla nieskończenie wielu ''n'' musi zajść: <math>\alpha(n)> \lfloor log_r n \rfloor </math>.
}}


'''Dowód: ''' Wybierzmy ''m'' takie że <math>\lfloor log_r m \rfloor > |\alpha(0)| </math>. Z powyższego Faktu, dla pewnego <math>i_0 \in \{0, 1, \ldots, m-1\}</math> mamy <math>|\alpha(i_0)|\ge \lfloor log_r m \rfloor>\lfloor log_r i_0 \rfloor </math>. Z tego wynika również że <math>i_0>0</math>.
'''Dowód: ''' Wybierzmy ''m'' takie że <math>\lfloor log_r m \rfloor > |\alpha(0)| </math>. Z powyższego Faktu, dla pewnego <math>i_0 \in \{0, 1, \ldots, m-1\}</math> mamy <math>|\alpha(i_0)|\ge \lfloor log_r m \rfloor>\lfloor log_r i_0 \rfloor </math>. Z tego wynika również że <math>i_0>0</math>.


Wybierzmy teraz ''m’'' takie że <math>\lfloor log_r m' \rfloor > |a(i_0)| </math>. Znów musi istnieć <math>i_1 \in \{0, 1, \ldots, m'-1\}</math> takie że <math>|a(i_1)|\ge \lfloor log_r m' \rfloor>\lfloor log_r i_1 \rfloor</math>. Analogicznie <math>i_1>i_0</math>. I tak dalej. QED.
Wybierzmy teraz ''m’'' takie że <math>\lfloor log_r m' \rfloor > |a(i_0)| </math>. Znów musi istnieć <math>i_1 \in \{0, 1, \ldots, m'-1\}</math> takie że <math>|a(i_1)|\ge \lfloor log_r m' \rfloor>\lfloor log_r i_1 \rfloor</math>. Analogicznie <math>i_1>i_0</math>. I tak dalej.  
QED.




Jako zastosowanie, możemy podać teorioinformacyjny dowód znanego faktu:
Jako zastosowanie, możemy podać teorioinformacyjny dowód znanego faktu:


'''Fakt (Euklides): ''' Istnieje nieskończenie wiele liczb pierwszych.
{{fakt|(Euklides)|euklides|Istnieje nieskończenie wiele liczb pierwszych.}}
 
'''Dowód: ''' Załóżmy przeciwnie, że istnieje tylko ''M'' liczb pierwszych: <math>p_1, p_2, \ldots , p_M</math>. Wprowadzamy notację <math>\alpha: \mathbb{N} \to \{0,1,\#\}^* </math> w następujący sposób: Dla <math>n = p_1^{\beta_1}p_2^{\beta _2}\ldots p_M^{\beta _M}</math> niech


'''Dowód: ''' Załóżmy przeciwnie, że istnieje tylko ''M'' liczb pierwszych: <math>p_1, p_2, \ldots , p_M</math>. Wprowadzamy notację <math>\alpha: N \to \{0,1,\#\}^* </math> w następujący sposób: Dla <math>n = p_1^{\beta_1}p_2^{\beta _2}\ldots p_M^{\beta _M}</math> niech
:<math>\alpha(n) = bin(\beta _1)\#bin(\beta _2)\# \ldots \#bin(\beta _M)</math>
:<math>\alpha(n) = bin(\beta _1)\#bin(\beta _2)\# \ldots \#bin(\beta _M)</math>


Linia 63: Linia 68:
Ponieważ <math>2^{\beta _i}\le p_i^{\beta _i}\le n</math>, mamy <math>\beta _i \le log_2 n</math>, dla wszystkich ''i''. A zatem  
Ponieważ <math>2^{\beta _i}\le p_i^{\beta _i}\le n</math>, mamy <math>\beta _i \le log_2 n</math>, dla wszystkich ''i''. A zatem  
:<math>|\alpha(n)|\le M(1+\log_2 \log_2 n) </math>  
:<math>|\alpha(n)|\le M(1+\log_2 \log_2 n) </math>  
dla wszystkich ''n'', co oczywiście przeczy twierdzeniu że dla nieskończenie wielu ''n'' <math>|a(n)|\ge \log_3 n</math>. QED
dla wszystkich ''n'', co oczywiście przeczy twierdzeniu że dla nieskończenie wielu ''n'' <math>|a(n)|\ge \log_3 n</math>.  
QED.




Linia 75: Linia 81:
Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma czy potrafimy odtworzyć jednoznacznie ciąg argumentów.  
Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma czy potrafimy odtworzyć jednoznacznie ciąg argumentów.  


'''Definicja: ''' Odwzorowanie <math> \varphi : S \to \Sigma^*</math> dla skończonego niepustego zbioru ''S'' jest kodem, jeśli jego naturalne rozszerzenie do morfizmu <math> \hat\varphi</math> jest różnowartościowe. Mówimy że kod jest bezprefiksowy jeśli dodatkowo <math> \hat\varphi(s) \not\leq \hat\varphi(s') </math> dla <math>s \neq s'</math>.
 
{{definicja|[Kod]|kod| Odwzorowanie <math> \varphi : S \to \Sigma^*</math> dla skończonego niepustego zbioru ''S'' jest '''kodem''', jeśli jego naturalne rozszerzenie do morfizmu <math> \hat\varphi</math> jest różnowartościowe. Mówimy że kod jest '''bezprefiksowy''' jeśli dodatkowo <math> \hat\varphi(s) \not\leq \hat\varphi(s') </math> dla <math>s \neq s'</math>.
}}
 


Jak widać własność bezprefiksowości zależy wyłącznie od postaci zbioru <math>\varphi(S)</math>. Ponadto dla każdego kodu <math>\varepsilon \not\in \varphi (S)</math>.  
Jak widać własność bezprefiksowości zależy wyłącznie od postaci zbioru <math>\varphi(S)</math>. Ponadto dla każdego kodu <math>\varepsilon \not\in \varphi (S)</math>.  
Linia 87: Linia 96:
Czasem możemy jednak wymyśleć bardziej efektywne kodowanie. Jeśli wiemy że jakieś obiekty z ''S'' pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze <math>|\varphi(w)| </math>.
Czasem możemy jednak wymyśleć bardziej efektywne kodowanie. Jeśli wiemy że jakieś obiekty z ''S'' pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze <math>|\varphi(w)| </math>.


Bliską analogią jest tu ''Gra w 20 pytań''. W tej grze jedna osoba wymyśla obiekt o (w domyśle z jakiegoś dużego zbioru możliwości ''S''), a druga osoba stara się zgadnąć jaki to obiekt przez zadawanie pytań (np. co najwyżej 20), na które odpowiedzą może być tylko ''tak'' lub ''nie''. Tym samym pytania są tak naprawdę postaci <math>o \in S'</math>?, gdzie <math>S' \subseteq S</math>.
Bliską analogią jest tu ''Gra w 20 pytań''. W tej grze jedna osoba wymyśla obiekt o (w domyśle z jakiegoś dużego zbioru możliwości ''S''), a druga osoba stara się zgadnąć jaki to obiekt przez zadawanie pytań (co najwyżej 20), na które odpowiedzą może być tylko ''tak'' lub ''nie''. Tym samym pytania są tak naprawdę postaci <math>o \in S'</math>?, gdzie <math>S' \subseteq S</math>.




Linia 96: Linia 105:




Zapiszmy to formalnie. ''Drzewem nad zbiorem X'' (albo krócej 'X-drzewem'), będziemy nazywać dowolny niepusty zbiór <math>T \subseteq X^*</math> zamknięty na operację brania prefiksu. Relację bycia prefiksem będziemy oznaczać przez <math>\le</math>. W X-drzewie dowolny element ''w'' jest ''węzłem'' rzędu |''w''|, <math>\varepsilon</math> jest ''korzeniem'', <math>\le</math>-maksymalne węzły są ''liśćmi''.


- przykład
Zapiszmy to formalnie. ''Drzewem nad zbiorem X'', (albo krócej 'X-drzewem'), będziemy nazywać dowolny niepusty zbiór <math>T \subseteq X^*</math> zamknięty na operację brania prefiksu. Relację bycia prefiksem będziemy oznaczać przez <math>\le</math>. W X-drzewie dowolny element ''w'' jest ''węzłem'' rzędu |''w''|, <math>\varepsilon</math> jest ''korzeniem'', <math>\le</math>-maksymalne węzły są ''liśćmi''.
Dodatkowo będziemy posługiwać się następującymi pojęciami: dla dowolnego <math>w \in T</math>, <math>x \in X</math> i <math>v \in X^*</math>:
Dodatkowo będziemy posługiwać się następującymi pojęciami: dla dowolnego <math>w \in T</math>, <math>x \in X</math> i <math>v \in X^*</math>:
* ''wx'' jest ''bezpośrednim następnikiem'' (lub ''dzieckiem'') ''w''  
* ''wx'' jest ''bezpośrednim następnikiem'' (lub ''dzieckiem'') ''w''  
Linia 112: Linia 115:
Korzystając z tych definicji, możemy powiedzieć że dowolny bezprefiksowy kod <math>\varphi:S\to \Sigma^*</math> indukuje drzewo nad <math>\Sigma</math>: :<math>T_\varphi = \{w: \exists s: w \le \varphi(s)\}</math>.  
Korzystając z tych definicji, możemy powiedzieć że dowolny bezprefiksowy kod <math>\varphi:S\to \Sigma^*</math> indukuje drzewo nad <math>\Sigma</math>: :<math>T_\varphi = \{w: \exists s: w \le \varphi(s)\}</math>.  
W drugą stronę, dowolne drzewo <math>T \subset \Sigma^*</math> z |S| liśćmi indukuje bezprefiksowy kod nad ''S'' (z dokładnością do permutacji elementów zbioru ''S'').
W drugą stronę, dowolne drzewo <math>T \subset \Sigma^*</math> z |S| liśćmi indukuje bezprefiksowy kod nad ''S'' (z dokładnością do permutacji elementów zbioru ''S'').
Jak wspominaliśmy wcześniej, naszym zadaniem jest optymalizacja długości kodu, jednocześnie zabezpieczając się na przekłamania w czasie transmisji. Pierwszym krokiem będzie sprawdzenie jak krótkie mogą być długości słów kodowych.
Dla danego kodu <math>\varphi:S\to \Sigma^*</math>, niech <math>|\varphi|:S \to \mathbb{N}</math> określa ''funkcję długości'', zdefiniowaną jako <math>|\varphi|(s)= |\varphi(s)|</math>.
{{twierdzenie|[Nierówność Krafta]|kraft| Niech <math>2 \le |S| < \infty </math> i niech <math>|\Sigma|=r</math>. Funkcja <math>\ell:S \to \mathbb{N}</math> jest funkcją długości (<math>\ell = |\varphi|</math>) dla pewnego bezprefiksowego kodu <math>\varphi:S\to \Sigma^*</math> wtedy i tylko wtedy gdy:
:<math>\sum_{s \in S} \frac{1}{r^{\ell (s)}} \leq 1.</math>
}}
'''Dowód: '''
<math>\Rightarrow</math>
Jeśli wszystkie słowa <math>\varphi(S)</math> mają tą samą długość ''k'', to uwzględniając różnowartościowość <math>\varphi</math> dostajemy
<math>\sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \leq \frac{r^k}{r^k} = 1.</math>
Jeśli teraz mamy słowa różnej długości, to oznaczmy przez ''k'' maksymalną długość <math>\varphi(s)</math>. Następnie dla każdego ''s'' mierzymy długość jego kodu <math>|\varphi (s)| = i</math> i definiujemy
:<math>P_s = \{ \varphi (s) v : v \in \Sigma^{k-i} \}</math>
(czyli zbiór wszystkich liści na poziomie ''k'' poniżej <math>\varphi(s)</math> w pełnym <math>\Sigma</math>-drzewie). Łatwo teraz zauważyć że podmienienie <math>\varphi(s)</math> na cały zbiór <math>P_s</math> nie zmieni sumy:
:<math>\sum_{w \in P_s} \frac{1}{r^{|w|}} = \frac{r^{k-i}}{r^{k}} = \frac{1}{r^i}</math>,
a zbiory <math>P_s</math>,<math>P_{s'}</math> są parami rozłączne. Tym samym
:<math>\sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} = \sum_{s \in S} \sum_{w \in P_s}  \frac{1}{r^{|w|}} \leq \frac{r^k}{r^k} = 1</math>
<math>\Leftarrow</math>
Posortujmy elementy zbioru S względem rosnącej długości ich kodów <math>\ell (s)</math>, tak że <math>\ell (s_1 ) \leq \ldots \leq \ell (s_m )</math>. Indukcyjnie dla <math>i = 0,1, \ldots ,m-1</math> będziemy definiować <math> \varphi (s_{i+1})</math> jako ''leksykograficznie'' pierwsze słowo długości <math>\ell(s_{i+1})</math> które nie jest porównywalne z żadnym ze słów <math>\varphi (s_1), \ldots , \varphi (s_i)</math> (względem porządku prefiksowego). Jedyne co musimy pokazać to że takie słowo zawsze istnieje. Tak jak w poprzednim przypadku, oznaczmy przez <math>P_{s_j}</math> zbiór wszystkich węzłów rzędu <math>\ell(s_{i+1})</math> poniżej <math>\varphi(s_j)</math>. Łatwo sprawdzić że <math>|P_{s_j}| = r^{\ell (i+1)-\ell (j)}</math>. Warunkiem koniecznym i wystarczającym do istnienia szukanego wierzchołka jest
:<math> r^{\ell (i+1)-\ell (1)} +  r^{\ell (i+1)-\ell (2)}+ \ldots + r^{\ell (i+1)-\ell (i)} < r^{\ell (i+1)}</math>
co można zapisać jako
:<math> \frac{1}{r^{\ell (1)}} +  \frac{1}{r^{\ell (2)}}+ \ldots + \frac{1}{r^{\ell (i)}} < 1</math>
To z kolej jest spełnione na mocy założenia dla każdego <math>i<m</math>. QED
Jeśli kod nie jest bezprefiksowy, nierówność Krafta wciąż jest spełniona, co można pokazać za pomocą sprytnej techniki.
{{twierdzenie|(Mcmillan)|McMillan| Dla dowolnego kodu <math>\varphi : S \to  \Sigma^*</math> istnieje bezprefiksowy kod <math>\varphi'</math> dla którego <math>|\varphi | = |\varphi'|</math>
}}
'''Dowód:''' Przypadek <math>|S| = 1</math> jest trywialny. Dla <math>|S|\ge 2</math> musi zachodzić również <math>r=|\Sigma| \ge 2</math>. Wystarczy wtedy pokazać że <math>\varphi</math> spełnia nierówność Krafta. Wprowadźmy oznaczenie <math> K = \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}}</math> i załóżmy że ta nierówność nie jest spełniona, czyli <math>K>1</math>. Niech <math>\mathit{Min} = \min \{ |\varphi (s)| : s \in S \}</math>, <math>\mathit{Max} = \max \{ |\varphi (s)| : s \in S \}</math>. Rozważmy teraz
:<math>K^n = \left( \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \right)^n = \sum_{i = \mathit{Min} \cdot n}^{\mathit{Max}\cdot n} \frac{N_{n,i}}{r^i}</math>
Gdzie <math>N_{n,i}</math> jest liczbą sekwencji <math>q_1, \ldots ,q_n \in S^n</math> takich że <math>i = |\varphi (q_1)| + \ldots + |\varphi (q_n)| =| \varphi (q_1 \ldots q_n)|</math>. Z warunku że <math>\varphi</math> jest kodem, wynika że każda sekwencja odpowiada innemu słowu długości i, a więc takich sekwencji jest nie więcej niż słów.
:<math>\frac{N_{n,i}}{r^i} \leq 1</math>
Stąd otrzymujemy
:<math>K^n \leq (\mathit{Max} - \mathit{Min}) \cdot n +1</math>
co dla wystarczająco dużego n musi być fałszem, ponieważ funkcja wykładnicza rośnie szybciej niż liniowa. W konsekwencji mamy <math>K \leq 1</math>. QED.

Wersja z 11:26, 15 lip 2006

Je n’ai fait celle-ci plus longue que parce que je n’ai pas eu le loisir de la faire plus courte.

(Napisałem ten list trochę dłuższy, gdyż nie miałem czasu napisać go krócej).

Blaise Pascal, Lettres provinciales, 1657


Notacja, co to takiego?

Zaczynamy od prostego eksperymentu: Odgadnij słowo o którym ktoś myśli – na przykład zgadując literę po literze. Czy będzie to równie łatwe w przypadku odgadywania liczby? Zauważmy że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym są „ciasno upakowane”. Dowolny ciąg znaków ze zbioru {0, 1, …, 9} jest jakąś liczbą (o ile nie zaczyna się od zera), ale bardzo niewiele ciągów z liter {a, b, …, z} jest sensownymi słowami. Wynika to między innymi z tego że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać gdy jest ona wykorzystywana celowo:

Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu nie musimy obawiać się że jakaś literówka zmieni wartość wpisanej kwoty.


Teoria informacji charakteryzuje w sposób matematyczny sposoby zapisywania, transmitowana i odtwarzania informacji. W szczególności zajmuje się godzeniem dwóch przeciwstawnych celów:

  • zapisywania wiadomości jak najzwięźlej
  • chronienia wiadomości przed przekłamaniami podczas transmisji


Zacznijmy od podstaw. Czy istnieją wiadomości których nie da się zapisać zwięźlej? Dowolną wiadomość możemy traktować jako ciąg bitów, czyli po prostu liczbę naturalną. Liczby naturalne można oczywiście zapisywać na wiele sposobów, i co więcej nie możemy zajmować się nimi wszystkimi „w ogólności”. Prowadzi do paradoksów:

Rozważmy przykładowe zdanie (paradoks Berrego):

Niech n będzie najmniejszą liczbą naturalną której nie da się zdefiniować za pomocą mniej niż dwudziestu słów.

Dwadzieścia słów można dobrać tylko na skończenie wiele sposobów. Nawet gdyby każdy sposób definiował inną liczbę, pozostaje nieskończenie wiele liczb których zdefiniować tak się nie daje. Wśród nich któraś jest najmniejsza, i właśnie ją zdefiniowaliśmy za pomocą mniej niż dwudziestu słów – sprzeczność.

Istotne jest zatem prawidłowe zdefiniowanie notacji, która służy nam do definiowania liczb. Aby uniknąć paradoksów takich jak wyżej, notacja nie może być częścią badanego obiektu. Musi być czymś zewnętrznym, nadanym w celu rozróżniania pomiędzy obiektami.


Definicja [Notacja]

Notacją dla S nazywamy dowolną różnowartościową funkcję α:SΣ* gdzie Σ jest skończonym alfabetem.


Fakt

Jeśli |S|=m1 i |Σ|=r2 to dla pewnego sS zachodzi:
|α(s)|logrm

Dowód: Ciągów znaków z Σ o długości mniejszej niż k jest:

1+r+r2++rk1=rk1r1<rk

Podstawiając k=logrm, stwierdzamy że nie ma wystarczająco wiele ciągów krótszych niż k do oznaczenia wszystkich elementów S. QED.


Wniosek

Jeśli α:NΣ* jest dowolną notacją dla liczb naturalnych, to dla nieskończenie wielu n musi zajść: α(n)>logrn.

Dowód: Wybierzmy m takie że logrm>|α(0)|. Z powyższego Faktu, dla pewnego i0{0,1,,m1} mamy |α(i0)|logrm>logri0. Z tego wynika również że i0>0.

Wybierzmy teraz m’ takie że logrm>|a(i0)|. Znów musi istnieć i1{0,1,,m1} takie że |a(i1)|logrm>logri1. Analogicznie i1>i0. I tak dalej. QED.


Jako zastosowanie, możemy podać teorioinformacyjny dowód znanego faktu:

Fakt (Euklides)

Istnieje nieskończenie wiele liczb pierwszych.

Dowód: Załóżmy przeciwnie, że istnieje tylko M liczb pierwszych: p1,p2,,pM. Wprowadzamy notację α:{0,1,#}* w następujący sposób: Dla n=p1β1p2β2pMβM niech

α(n)=bin(β1)#bin(β2)##bin(βM)

gdzie bin(β) jest zwykłym zapisem binarnym liczby β (a więc |bin(β)|1+log2β).

Ponieważ 2βipiβin, mamy βilog2n, dla wszystkich i. A zatem

|α(n)|M(1+log2log2n)

dla wszystkich n, co oczywiście przeczy twierdzeniu że dla nieskończenie wielu n |a(n)|log3n. QED.


Kody

Niektóre własności notacji mają szczególne znaczenie dla ich praktycznego zastosowania. Przyjrzyjmy się na przykład co się dzieje jeśli w naturalny sposób rozszerzymy notację φ:SΣ* do morfizmu φ^:S*Σ*:

φ^(s1si)=φ(s1)φ(s2)φ(si)

Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma czy potrafimy odtworzyć jednoznacznie ciąg argumentów.


Definicja [Kod]

Odwzorowanie φ:SΣ* dla skończonego niepustego zbioru S jest kodem, jeśli jego naturalne rozszerzenie do morfizmu φ^ jest różnowartościowe. Mówimy że kod jest bezprefiksowy jeśli dodatkowo φ^(s)≰φ^(s) dla ss.


Jak widać własność bezprefiksowości zależy wyłącznie od postaci zbioru φ(S). Ponadto dla każdego kodu ε∉φ(S).

Łatwo zauważyć że każdy zbiór bezprefiksowy jest kodem. Istnieją oczywiście kody które nie są bezprefiksowe (np. dla φ(S)={aa,baa,ba}), a nie każda notacja jest kodem (np. dla φ(S)={a,ab,ba}).

W dalszej części będziemy omijać daszek i utożsamiać φ^ z φ.

Aby kodować zbiór S o m elementach za pomocą alfabetu Σ o r elementach (dla m,r2), wystarczy oczywiście używać ciągów długości logrm. Wtedy |φ(w)||w|logrm, dla dowolnego wS*.

Czasem możemy jednak wymyśleć bardziej efektywne kodowanie. Jeśli wiemy że jakieś obiekty z S pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze |φ(w)|.

Bliską analogią jest tu Gra w 20 pytań. W tej grze jedna osoba wymyśla obiekt o (w domyśle z jakiegoś dużego zbioru możliwości S), a druga osoba stara się zgadnąć jaki to obiekt przez zadawanie pytań (co najwyżej 20), na które odpowiedzą może być tylko tak lub nie. Tym samym pytania są tak naprawdę postaci oS?, gdzie SS.


Łatwo zauważyć że log2|S| pytań wystarczy do zidentyfikowania dowolnego obiektu w S. Czy da się to zrobić lepiej? W ogólności oczywiście nie. Dowolną strategię zadawania pytań możemy sobie wyobrazić jako drzewo binarne, z pytaniem w każdym wierzchołku i rozwiązaniami w liściach. Jeśli liści jest 2k, to drzewo musi oczywiście mieć głębokość co najmniej k. Jednak jeśli niektóre rozwiązania są bardziej prawdopodobne niż inne, możemy zmniejszyć oczekiwaną liczbę pytań. (Faktycznie dopiero taka wersja tej gry jest interesująca.)


Zapiszmy to formalnie. Drzewem nad zbiorem X (albo krócej 'X-drzewem'), będziemy nazywać dowolny niepusty zbiór TX* zamknięty na operację brania prefiksu. Relację bycia prefiksem będziemy oznaczać przez . W X-drzewie dowolny element w jest węzłem rzędu |w|, ε jest korzeniem, -maksymalne węzły są liśćmi.

Dodatkowo będziemy posługiwać się następującymi pojęciami: dla dowolnego wT, xX i vX*:

  • wx jest bezpośrednim następnikiem (lub dzieckiem) w
  • wv jest poniżej w
  • zbiór Tw={v:wvT} nazywamy poddrzewem indukowanym przez w


Korzystając z tych definicji, możemy powiedzieć że dowolny bezprefiksowy kod φ:SΣ* indukuje drzewo nad Σ: :Tφ={w:s:wφ(s)}. W drugą stronę, dowolne drzewo TΣ* z |S| liśćmi indukuje bezprefiksowy kod nad S (z dokładnością do permutacji elementów zbioru S).


Jak wspominaliśmy wcześniej, naszym zadaniem jest optymalizacja długości kodu, jednocześnie zabezpieczając się na przekłamania w czasie transmisji. Pierwszym krokiem będzie sprawdzenie jak krótkie mogą być długości słów kodowych.

Dla danego kodu φ:SΣ*, niech |φ|:S określa funkcję długości, zdefiniowaną jako |φ|(s)=|φ(s)|.


Twierdzenie [Nierówność Krafta]

Niech 2|S|< i niech |Σ|=r. Funkcja :S jest funkcją długości (=|φ|) dla pewnego bezprefiksowego kodu φ:SΣ* wtedy i tylko wtedy gdy:
sS1r(s)1.

Dowód:

Jeśli wszystkie słowa φ(S) mają tą samą długość k, to uwzględniając różnowartościowość φ dostajemy sS1r|φ(s)|rkrk=1.

Jeśli teraz mamy słowa różnej długości, to oznaczmy przez k maksymalną długość φ(s). Następnie dla każdego s mierzymy długość jego kodu |φ(s)|=i i definiujemy

Ps={φ(s)v:vΣki}

(czyli zbiór wszystkich liści na poziomie k poniżej φ(s) w pełnym Σ-drzewie). Łatwo teraz zauważyć że podmienienie φ(s) na cały zbiór Ps nie zmieni sumy:

wPs1r|w|=rkirk=1ri,

a zbiory Ps,Ps są parami rozłączne. Tym samym

sS1r|φ(s)|=sSwPs1r|w|rkrk=1

Posortujmy elementy zbioru S względem rosnącej długości ich kodów (s), tak że (s1)(sm). Indukcyjnie dla i=0,1,,m1 będziemy definiować φ(si+1) jako leksykograficznie pierwsze słowo długości (si+1) które nie jest porównywalne z żadnym ze słów φ(s1),,φ(si) (względem porządku prefiksowego). Jedyne co musimy pokazać to że takie słowo zawsze istnieje. Tak jak w poprzednim przypadku, oznaczmy przez Psj zbiór wszystkich węzłów rzędu (si+1) poniżej φ(sj). Łatwo sprawdzić że |Psj|=r(i+1)(j). Warunkiem koniecznym i wystarczającym do istnienia szukanego wierzchołka jest

r(i+1)(1)+r(i+1)(2)++r(i+1)(i)<r(i+1)

co można zapisać jako

1r(1)+1r(2)++1r(i)<1

To z kolej jest spełnione na mocy założenia dla każdego i<m. QED


Jeśli kod nie jest bezprefiksowy, nierówność Krafta wciąż jest spełniona, co można pokazać za pomocą sprytnej techniki.


Twierdzenie (Mcmillan)

Dla dowolnego kodu φ:SΣ* istnieje bezprefiksowy kod φ dla którego |φ|=|φ|

Dowód: Przypadek |S|=1 jest trywialny. Dla |S|2 musi zachodzić również r=|Σ|2. Wystarczy wtedy pokazać że φ spełnia nierówność Krafta. Wprowadźmy oznaczenie K=sS1r|φ(s)| i załóżmy że ta nierówność nie jest spełniona, czyli K>1. Niech Min=min{|φ(s)|:sS}, Max=max{|φ(s)|:sS}. Rozważmy teraz

Kn=(sS1r|φ(s)|)n=i=MinnMaxnNn,iri

Gdzie Nn,i jest liczbą sekwencji q1,,qnSn takich że i=|φ(q1)|++|φ(qn)|=|φ(q1qn)|. Z warunku że φ jest kodem, wynika że każda sekwencja odpowiada innemu słowu długości i, a więc takich sekwencji jest nie więcej niż słów.

Nn,iri1

Stąd otrzymujemy

Kn(MaxMin)n+1

co dla wystarczająco dużego n musi być fałszem, ponieważ funkcja wykładnicza rośnie szybciej niż liniowa. W konsekwencji mamy K1. QED.