Kody i szyfry
4. Kody wykrywające i korygujące błędy
4.3. Podstawowe twierdzenia o kodach wykrywających i korygujących błędy
Definicja (m,n) kodu i kodu liniowego. Zakładamy, że chcemy przesyłać słowa nad alfabetem GF(pk) (alfabetem jest ciało skończone mające pk elementów, gdzie p jest liczbą pierwszą w szczególności może to być ciało GF(2) = Z2 = {0,1}. Słowa przesyłane mają długość m, chcemy więc przesyłać słowa z (GF(pk))m. Koncepcja kodu wykrywającego lub korygującego błędy polega na wykorzystaniu kodu redundancyjnego GF(pk))m → (GF(pk))n, gdzie n > m. Taki kod nazywamy (m,n) kodem. Obiektami kodowanymi są tu słowa o długości m nad alfabetem GF(pk) a słowami kodowymi słowa z (GF(pk))m. Zbiory (GF(pk))m i (GF(pk))n są przestrzeniami liniowymi nad ciałem GF(pk). Jeśli odwzorowanie GF(pk))m → (GF(pk))n jest liniowe to kod nazywamy kodem liniowym.
Liniowość odwzorowania oznacza, że istnieje taka macierz A o współczynnikach w ciele GF(pk) mająca n wierszy i m kolumn, że dla wektora a ∈ (GF(pk))m mamy
gdzie wektor a jest traktowany jako macierz kolumnowa.
Kod wykrywający błędy powinien zachowywać się tak, że gdy odbieramy zamiast słowa kodowego (a) słowo z przekłamaniami na pewnej niewielkiej liczbie co najwyżej r pozycji (oznaczmy to słowo z przekłamaniami przez br((a))) to oglądając br((a)) będziemy mogli stwierdzić czy nastąpiły przekłamania.
Powiemy, że kod GF(pk))m → (GF(pk))n wykrywa fakt popełnienia co najwyżej r błędów jeśli dla każdego a ∈ (GF(pk))m zmiana cyfr na co najwyżej r pozycjach w słowie kodowym (a) nie powoduje przejścia słowa kodowego w słowo (b) dla pewnego b ∈ (GF(pk))m, a ≠ b.
Praktycznie więc wykrywanie błędu może polegać na porównaniu br((a)) z wszystkimi możliwymi słowami kodującymi (c) dla c ∈ (GF(pk))m. Jeśli nie stwierdzamy zgodności, to stwierdzamy, że słowo br((a)) zawiera przekłamanie.
Kod korygujący błędy powinien zachowywać się tak, że gdy odbieramy zamiast słowa kodowego (a) słowo z przekłamaniami na pewnej niewielkiej liczbie co najwyżej r pozycji (tzn. słowo br((a))) to oglądając br((a)) będziemy mogli skorygować błędy (stosując pewien algorytm) uzyskując słowo (a) a więc w konsekwencji stwierdzamy, że zostało nadane słowo a.
Zasadnicza koncepcja na jakiej opierają się kody korekcyjne jest taka: Niech GF(pk))m → (GF(pk))n będzie (m,n) kodem kodującym słowa o długości m za pomocą słów o długości n, gdzie n > m. Zakładamy, że podczas transmisji słowa (a) o długości m może powstać co najwyżej r błędów. Dla każdego a ∈ (GF(pk))m kodujemy przy tym słowo a takim ciągiem a ∈ (GF(pk))n , że
gdzie K(x,r) oznacza kulę o promieniu r w przestrzeni metrycznej GF(pk))n z metryką Hamminga dH. Warunek (1) oznacza, że każde dwie kule rodziny kul K((x),r); a ∈ GF(pk))m są rozłączne. Jeśli tak jest to aby stwierdzić jaka informacja została nadana wystarczy zastosować do słowa odebranego bk((a)); a ∈ (GF(pk))m regułę decyzyjną d: GF(pk))n→GF(pk))n zdefiniowaną wzorem
d(br(f(a))) = a
wtedy i tylko wtedy, gdy
dH((a),br,(a)) = {<d<sub><em>d<sub>H</sub></em>(<span class="equation"></span>(<em>x</em>),<em>b<sub>r</sub></em>(<span class="equation"></span>(<em>a</em>)) }(2)
Innymi słowy jako informację nadaną przyjmujemy takie a (GF ( pk ))m , że odebrane słowo br (f(a)) (GF( pk ))n jest najbliższe f(a) tzn.
dH (f(a), b) dH ( f(x), b) (3)
Jest oczywiste, że powyższa reguła decyzyjna przy warunku (1) jest poprawna w tym sensie, że pozwala na odtworzenie wiadomości nadanej przy ograniczonej do r ilości błędów transmisji.
Warto zauważyć, że istotą powyższego pomysłu na kod korekcyjny jest to, że wokół każdego słowa kodującego f(a) (gdzie a (GF ( pk ))m ) tworzymy otoczenie (w metryce Hamminga), którego elementy (oprócz f(a)) nie są wykorzystywane do kodowania słów z a (GF ( pk ))m . Możemy jednak odebrać (w wyniku wprowadzenia błędów podczas przesyłania słowa f(a)) dowolny element z tego otoczenia a mimo to nie tracimy orientacji w sytuacji, potrafimy wykryć i skorygować przekłamania.
Kod blokowy. Niech V będzie ustalonym alfabetem. Kodem blokowym nazywamy kod f : Vm Vn , w którym słowom o długości m (obiektom kodowanym) przyporządkowujemy słowa o długości n, gdzie n m .
Kod blokowy nazywamy kodem grupowym, jeśli słowa kodowe kodu tworzą grupę addytywną.
Różnych typów kodów korekcyjnych (ang. ECC od Error Correcting Codes) jest dosyć dużo. Z bardziej znanych warto wymienić:
- kody cykliczne (kody CRC - ang. Cyclic Redundancy Check)
- kody Hamminga
- kody Reeda-Solomona
- kody Bose-Chaudhuri-Hocquenghema (kody BCH)