Kody blokowe Wykład 1, 3 III 2011 Literatura 1. R.M. Roth, Introduction to Coding Theory, 2006 2. W.C. Huffman, V. Pless, Fundamentals of Error-Correcting Codes, 2003 3. D.R. Hankerson et al., Coding Theory and Cryptography. Essentials, 2000 1
Konstrukcja ciała Galois Ciało Galois rzędu q oznaczane jest symbolami F q = GF (q) i istnieje dokładnie dla q = p m, gdzie p {2, 3, 5, 7, 11,...} to liczba pierwsza oraz m N = {1, 2, 3,...}. Ciało F q jest jedyne z dokładnością do izomorfizmu. Może mieć wiele reprezentacji, ale wszystkie reprezentacje ciała ustalonego rzędu q są nawzajem izomorficzne. Z punktu widzenia reprezentacji ciał najprostszymi ciałami Galois są ciała F p, w których liczba elementów jest liczbą pierwszą p. Nadto właśnie ciało F p jest ciałem prostym w każdym ciele rzędu q = p m, tzn. F p jest najmniejszym w sensie inkluzji podciałem ciała GF(p m ). Przykład 3. F p = GF (p) = Z p, gdzie p jest liczbą pierwszą. Wtedy ciało Galois, a raczej zbiór jego elementów, ma postać F p = {0, 1,..., p 1}, gdzie elementy 0, 1,... oznaczają klasy reszt modulo p: 0 klasę [0], 1 klasę [1], i ogólnie [i] oznacza klasę wszystkich liczb całkowitych (ze zbioru Z), dla których reszta z dzielenia przez p jest i, i = 0, 1,..., p 1. Zatem F p = {[0], [1],..., [p 1]}. Działania w F p, czyli dodawanie i mnożenie modulo p, oznaczamy symbolami p i p. 2
Kanał transmisyjny binarny powinien być BSC (binary symmetric channel), tzn. dwójkowy (binarny) rozpoczęcie i zakończenie transmisji jest wykrywane, a kanał ma być bezpamięciowy symetryczny, tzn. prawdopodobieństwo poprawności jest takie samo dla obu symboli addytywny nie ma wymazywania ani wprowadzania nowych symboli; błąd może polegać na zmianie 0 w 1 lub 1 w 0. Tę ostatnią własność można wyrazić addytywnie w następujący sposób. Jeśli wysłano v C i otrzymano słowo w, w v (np. w C), to istnieje wektor e błędów w słowie w, taki że w = v 2 e lub równoważnie: w 2 e = v. Symbol 1 na dowolnej pozycji w słowie błędów e oznacza, że na tej pozycji nastąpiło przeinaczenie w kanale przesyłowym. Niech p oznacza prawdopodobieństwo przekłamania, 0 p 1, (albo niezawodności zgodnie z umową). Kanał jest bezużyteczny, gdy p 1 2, ponieważ wtedy nie da się określić interpretacji symboli wyjściowych. Wnioskiem jest, że kanał transmisyjny nazywamy dobrym, jeżeli spełnia warunek 0 p 1 (p 1 2 ). 3
Kodowanie informacji Niech u będzie słowem informacyjnym (u A k ), zaś C zbiorem słów kodujących oraz v słowem przesyłanym (v C A n ). Kodowaniem nazywamy bijekcję K postaci K : A k u v = K(u) C A n. Kody liniowe Jeżeli alfabet A ma strukturę ciała skończonego, wówczas zbiór A n wszystkich n-literowych słów dających się zapisać za pomocą alfabetu A, ma strukturę n- wymiarowej przestrzeni wektorowej nad ciałem A. Wtedy kodem liniowym długości n nazywamy podprzestrzeń wektorową C przestrzeni A n. 4
Metryka Niech X będzie dowolnym zbiorem niepustym. Metryką na zbiorze X nazywamy funkcję d : X X [0, ), która dla dowolnych elementów x, y, z należących do zbioru X, spełnia następujące warunki: 1. nieujemność, d(x, y) 0, i nieosobliwość, d(x, y) = 0 x = y, 2. symetrię, d(x, y) = d(y, x), 3. nierówność trójkąta, d(x, y) d(x, z) + d(z, y). Metryka Hamminga Metryką Hamminga nazywamy funkcję d H, która parom słów ustalonej długości przypisuje odległość równą liczbie pozycji, na których te dwa słowa się różnią. Formalnie, jeżeli x, y A n, to d H (x, y) = l, gdy x i y i dla dokładnie l wskaźników i spośród i = 1, 2,..., n. Dość łatwo można udowodnić, że metryka Hamminga jest metryką, tzn. ma trzy powyższe własności. 5
Minimalną wartość d funkcji d H na wszystkich parach różnych słów kodu C zapisujemy w postaci d = min x,y C, x y d H (x, y) i nazywamy (minimalnym) dystansem kodu C. Wtedy też d = min x,y C, x y wt(x y), gdzie wt(v) (wt od weight) jest liczbą niezerowych współrzędnych w słowie v. Zatem d znajdujemy po obliczeniu ( ) C 2 odległości. Jeśli jednak kod C jest liniowy, to dla x, y C mamy z := x y C oraz z 0 dla x y, a zatem d = min z C\{0} wt(z), tzn. d znajdujemy po obliczeniu tylko C 1 wag. 6
Wymagania stawiane kodom blokowym Jak już wcześniej wspominaliśmy, nie każdy ciąg znaków alfabetu jest zapisem słowa istniejącego w języku kodu. Problemem jest taki wybór słów kodowych, aby złożony z nich kod miał moc M dostatecznie dużą, ale by umożliwiał szybkie przesyłanie, czyli długość n ma być raczej mała, zaś kodowanie i dekodowanie dość proste, mało czasochłonne, oraz by kod miał wysoką odporność na zakłócenia, a to oznacza, że dystans d nie może być zbyt mały. Wymagania są więc kontradykcyjne, wysoce niezgodne. Można zauważyć, że wybranie kodu, w którym minimalna odległość słów wynosi 2, umożliwia wykrycie słów przychodzących z pojedynczymi błędami, bo słowa te nie należą do kodu. Natomiast, jeśli minimalna odległość słów wynosi 3, to kod nie tylko rozpoznaje słowa przychodzące z dwoma lub mniej błędami, ale i z dużym prawdopodobieństwem wskazuje dokładnie, w którym miejscu znalazł się błąd, tzn. kod umożliwia korygowanie pojedynczych błędów w słowach przychodzących. Wtedy bowiem słowo przychodzące z jednym błędem nie należy do kodu, ale jest w odległości 1 od jednego tylko słowa kodowego, a to właśnie słowo było wysłane, jeśli pojawił się błąd pojedynczy. 7
Kod powtarzający Przyjmujemy, że pojedyncze symbole y to słowa informacyjne, y A. Kodowanie w kodzie n-krotnie powtarzającym daje K(y) := y y... y (n razy), n 2. Przykład Dla n = 3 zamiast informacyjnego y mamy słowo kodowe yyy. Zatem kod binarny 3-krotnie powtarzający ma dwa słowa: 111, 000. Widać więc, że jest to liniowy kod [3, 1, 3], jego bazą bowiem jest jedno słowo 111. Jeśli więc otrzymano z kanału słowo 001, to dekodowanie prowadzi do słowa 000, które jest kodowe i najbliższe słowu otrzymanemu. Przykład Binarny kod parzystości (z parzystą liczbą jedynek w słowach) Dla n = 3 parametry kodu można zapisać w postaci: (3, M, d). Kodem tym jest zbiór C := {000, 110, 101, 011} i, jak widać, M = 4 oraz d = 2. Wtedy ogólna postać parametrów kodu wygląda następująco (3, 4, 2). Można stwierdzić, że jest to kod liniowy, ponieważ zbiór C jest zamknięty względem binarnego dodawania wektorów. Zatem C jest podprzestrzenią liniową przestrzeni F 3 2 nad ciałem F 2. Żeby wyznaczyć wszystkie parametry dla kodu liniowego C wystarczy znaleźć moc k bazy w C. Wiemy już, że k = log 2 M = 2. Ale możemy też łatwo znaleźć bazę. Zapisujemy (niezerowe) elementy zbioru C jako kolejne wiersze macierzy, powiedzmy A, i wyznaczamy jej WPS(A) (wierszową postać schodkową), w której wiersze przewodnikowe są niezerowe i stanowią szukaną bazę. Dla dowolnej macierzy A procedura taka produkuje bazę przestrzeni lin A generowanej przez wiersze macierzy A. Jednakże przypadek, gdy C jest binarnym kodem parzystości, jest szczególnie prosty. Wystarczy bowiem zauważyć, że k < 3, bo jedyny zbiór trzech niezerowych wektorów w C ma jako sumę słowo zerowe, a zatem każde dwa z tych słów stanowią bazę, skąd k = 2, zaś liczbą baz (nieuporządkowanych) jest 3. 8
Przypomnijmy elementarne przekształcenia wierszowe macierzy. Są to następujące działania na wierszach: zamiana miejscami dwóch wierszy (stąd permutowanie wierszy), pomnożenie dowolnego wiersza przez dowolny skalar różny od zera, dodanie do dowolnego wiersza dowolnego innego wiersza tej macierzy, pomnożonego przez dowolny skalar (w konsekwencji dodanie do wiersza kombinacji liniowej pozostałych wierszy). 9
Information rate Definiujemy wielkość R, którą nazwiemy wskaźnikiem (współczynnikiem) informacji (information rate) kodu (n, M) nad alfabetem F q o q symbolach. R = log q M, n gdzie M jest mocą kodu. Jeśli ten kod jest liniowy, to ma M = q k, gdzie k jest wymiarem kodu. Wtedy więc R = k n. Przykładowo dla binarnego kodu trzykrotnie powtarzającego długości n = 3 mamy R = 1 3. Natomiast dla binarnego kodu parzystości długości n = 3, R = 2 3. 10
Przykład Danymi są binarny kod C długości n = 11 = k (tzn. nie ma nadmiarowych symboli w słowach), a zatem C = 2 11 = 2048, oraz kanał o niezawodności p = 1 10 8 i z prędkością przesyłu 10 7 cyfr na sekundę. Zatem liczbą słów przesyłanych w ciągu 1 sekundy jest 107 11. To czy dany symbol dotrze do nas jako poprawny lub nie, można utożsamiać z sukcesem i porażką w rozkładzie Bernoullego. Dlatego też błędne słowo pojawia się z prawdopodobieństwem 11p 10 (1 p) + ( ) 11 2 p 9 (1 p) 2 +... + ( ) 11 11 (1 p) 11 11 10, 8 bo dla k 2, (1 p) k 0. Otrzymamy więc średnio 11 10 107 8 11 = 0, 1 błędnego słowa na sekundę, co daje odpowiednio 1 błąd na 10 sekund, 6 błędów na minutę, 360 błędów na godzinę, 8640 błędów na dobę i są to błędne słowa niezauważone. Sytuację tę łatwo poprawiamy. Mianowicie do słów informacyjnych dodajemy cyfrę kontrolną zwaną symbolem parzystości. Jeśli w słowie długości n = 11 liczba jedynek jest parzysta, dopisujemy 0, jeśli liczba jedynek jest nieparzysta, dopisujemy 1. Mamy więc k = 11 oraz n = 12. Teraz słowa z pojedynczymi błędami są wykrywane wśród słów otrzymanych. Prawdopodobieństwo zaś pojawienia się dwóch błędów w słowie wynosi 1 p 12 12p 11 (1 p) = ( ) 12 2 p 10 (1 p) 2 + 12 11 2 (1 p) 2 = 66 10, 16 bo dla k 3 jest (1 p) k (1 p) 2 i dlatego pomijamy składniki z czynnikami (1 p) k, gdzie k 3, zaś p 10 1. Obliczamy liczbę słów błędnych ale akceptowanych. Jest ich 66 10 107 16 12 = 11 2 10 9 na sekundę. Odwrotność tej liczby to średnia liczba sekund, w których pojawi się jedno błędne i niezauważone słowo. Jest to więc 2 10 9 11 sekund, a po przeliczeniu na dni jest to 2 10 9 11 /(602 24) > 2100, tzn. jedno błędne słowo jest akceptowane średnio co 2100 dni (!) 11
Kody Hamminga liniowe, binarne mają parametry [n = 2 r 1, k = n r, d = 3], r = 2, 3,..., gdzie r jest liczbą symboli nadmiarowych (ang. redundant). Jeśli r = 2, mamy do czynienia z kodem H 2 : [3, k = 3 2, 3] = [3, 1, 3]. Wtedy H 2 := {111, 000}, czyli jest to znany nam kod, kod 3-krotnie powtarzający. Macierz generująca Macierzą generującą kod liniowy C o parametrach [n, k, d] nazywamy macierz G = G C F k n 2, której wiersze stanowią bazę kodu C. Np. G = G H2 = [ 1 1 1 ]. Macierz generująca G ma postać systematyczną (lub standardową), gdy G = [I k A], gdzie A F k (n k) 2. Powyższa macierz G H2 = [I 1 A], gdzie A = [1 1], ma postać systematyczną. 12
Ortogonalność Ortogonalność w F n 2 określona jest za pomocą iloczynu skalarnego (ale zdegenerowanego). Jest to standardowy iloczyn skalarny, tzw. kropkowy (ang. dot product). Dla x, y F n 2 x y := n i=1 x iy i F 2. x y x y = 0 ( F 2 ). Przykład zdegenerowania iloczynu skalarnego Niech x = (101) = 101. Wtedy x 2 = 101 101 = 1 1 + 0 0 + 1 1 = 1 + 0 + 1 = 0 w F 2, tzn. kwadrat skalarny słowa niezerowego jest zerem (i nie jest kwadratem długości słowa). Zatem binarne słowo niezerowe, jeśli tylko ma parzystą wagę, to jest do siebie ortogonalne. Dla dowolnego zbioru S zawartego w F n 2, możemy rozważać powłokę liniową lin(s) =: S, tzn. S określamy jako zbiór wszystkich możliwych sum elementów zbioru S. Zatem S jest kodem liniowym generowanym przez podzbiór S. Symbol S oznacza zbiór wszystkich wektorów ortogonalnych do zbioru S, tzn. S := {x F n 2 x v = 0 v S}. Można sprawdzić, że zbiór S jest zamknięty względem dodawania, czyli jest kodem liniowym. Nadto S jest kodem ortogonalnym nie tylko do zbioru S, ale też do kodu S. Wynika to z rozdzielności iloczynu kropkowego względem dodawania wektorów. Kod S zawiera wszystkie wektory ortogonalne do kodu S, czyli jest dopełnieniem ortogonalnym kodu S w przestrzeni F n 2. Zachodzi więc równość S = S. Kod S nazywamy kodem dualnym do kodu generowanego przez S. Od dowolnego kodu liniowego możemy przejść do kodu dualnego, C C. Wtedy zachodzi twierdzenie (którego nie popsuło zdegenerowanie iloczynu skalarnego) dim C + dim C = n. 13