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) 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))) to oglądając br( (a)) będziemy mogli stwierdzić czy nastąpiły przekłamania.
(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
(a) nie powoduje przejścia słowa kodowego w słowo  (b) dla pewnego b ∈ (GF(pk))m,  a ≠ b.
(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
(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(
(c) dla c ∈ (GF(pk))m. Jeśli nie stwierdzamy zgodności, to stwierdzamy, że słowo br( (a)) zawiera przekłamanie.
(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) 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))) to oglądając  br( (a)) będziemy mogli skorygować błędy (stosując pewien algorytm) uzyskując słowo
(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.
(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
(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(
(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
(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),br, (a)) =
(a)) =  {<d<sub><em>d<sub>H</sub></em>(<span class="equation">
{<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>x</em>),<em>b<sub>r</sub></em>(<span class="equation"> </span>(<em>a</em>)) }
</span>(<em>a</em>)) } (2)
(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)
 dH (f(a), b)  dH ( f(x), b) (3)
 (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.
  (GF ( pk ))ms . Zdolności korekcyjne tak zdefiniowanego kodu są oczywiste. Widać s od razu, że popełnienie co najwyżej r  błędów w słowie kodowym (gdzie
 (GF ( pk ))ms . Zdolności korekcyjne tak zdefiniowanego kodu są oczywiste. Widać s od razu, że popełnienie co najwyżej r  błędów w słowie kodowym (gdzie  ) nie przeszkadza w poprawnym odczytaniu takiego słowa kodowego. Kod s krotnie powtórzony jest (m, s  m) kodem.
 ) nie przeszkadza w poprawnym odczytaniu takiego słowa kodowego. Kod s krotnie powtórzony jest (m, s  m) kodem.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)