Kódelmélet összefoglaló Visontay Péter (sentinel@schbmehu) 2002 január 1 Alapfogalmak Kódolás: a k hosszú u üzenetet egy n hosszú c kódszóba képézzük le Hibák: a csatorna két végén megjelenő c bemeneti és v kimeneti vektorok Hamming távolsága d(c, v) azon i pozíciók száma, ahol c i = v i Ez az átküldött üzenet hibáinak száma Egyszerű hiba: a hiba helye és értéke is ismeretlen Törléses hiba: a hiba helye ismert, csak az érték nem Dekódolás: Meghatározzuk, hogy a csatorna kimenetén megjelenő jelsorozat melyik kódszónak felelt meg a csatorna bemenetén A kódolófüggvény inverzével a kódszóból visszaállítjuk az eredeti üzenetet Hibás detekció: ha a hibák egy kódszót egy másikba visznek át Kódtávolság: a kód szavai közötti minimális Hamming-táv: d min = min d(c, c ) Hibajelzés: egy d min kódtávolságú kód d 1 hibát tud jelezni d min 1 2 egyszerű hibát tud javítani d min 1 törléses hibát tud javítani Kód paramétere: ha egy kódolás k hosszú üzeneteket n hosszú kódba képez le, a kód (n, k) paraméterű Ha d min értékét ismerjük, a kód (n, k, d min ) paraméterű Singleton-korlát (1 kódábécé elemszáma): alak): egy M kódszóból álló, n hosszú és d min kódtávú kódra (q a M q n d min+1 Singleton-korlát (2 alak): egy (n, k) paraméterű kódra a korlát alakja: d min n k + 1 MDS kód: azon kódot, melyre a Singleton-korlátban = áll, maximális távolságú (maximum distance separable) kódnak nevezzük Hamming-korlát: ha egy (n, k) paraméterű kód t hibát tud javítani, akkor t i=0 ( ) n (q 1) i q n k i 1
Perfekt kód: olyan kód, melyre a Hamming-korlátban = áll 2 Bináris lineáris kódok Lineáris kód: egy C kód lineáris, ha minden c, c C-re c + c C A 0 vektor minden lineáris kódnak eleme Generátormátrix: egy C kód generátormátrixa a C lineáris tér egy bázisának vektoraiból (mint sorvektorokból) álló G mátrix A generátormátrix segítségével kódolhatjuk az üzeneteket, azaz ha u = (u 1, u 2,, u k ), akkor a kódolt üzenet: c = ug Megj: több generátormátrix is generálhatja ugyanazt a kódszóhalmazt Szisztematikus kód: egy (n, k) paraméterű lineáris kód szisztematikus, ha minden kódszavára igaz, hogy annak utolsó n k szimbólumát elhagyva éppen a neki megfelelő k hosszú üzenetet kapjuk, azaz kódolás során a k hosszú üzenetet egészítjük ki n k karakterrel Szisztematikus kód generátormátrixa: G = (I k, B) ahol I k a k k méretű egységmátrix, B pedig egy k (n k) méretű mátrix (így G mérete k n) Innen a kódszó szerkezete: c = (u 1, u 2,, u k, c k+1, c k+2,, c n ) Itt a kód első k karaktere az üzenetszegmens, a maradék a paritásszegmens Paritásmátrix: olyan n k n-es H mátrix, melyre Hc T = 0 akkor és csak akkor, ha a c C (Azaz ezt használjuk annak ellenőrzésére, hogy egy kód helyes-e) Minden lineáris kódnak van paritásmátrixa Tétel: minden C lineáris kódra igaz, hogy HG T = 0 Paritásmátrix számítása: G = (I k, B) = H = ( B T, I n k ) Itt a B-t az adott test (pl GF (7)) felett kell értelmezni, így pl bináris esetben B T = B T! Vektor súlya: egy c vektor w(c) súlya a koordinátái közt lévő nem nulla elemek száma Kód minimális súlya: w min = min w(c) c C,c =0 Tétel: minden lineáris kód kódtávolsága megegyezik a minimális súlyával, azaz d min = w min 2
Tétel: minden lineáris kód kódtávolsága egyenlő a paritásmátrixa azon oszlopainak minimális számával, melyek lineárisan összefüggők Ortogonális komplemens: egy kód ortogonális komplemense (duálisa) a paritásmátrix mint generátormátrix által képzett kód Szindróma: s = eh T ahol az e = v c vektor a hibavektor, a szindrómavektor dimenziója pedig n k A szindróma lényege, hogy ha a Hc T kiszámításakor nem 0-t kapunk (azaz a vett kódszó hibás), akkor ki tudjuk következtetni, hogy mi a hibavektor, amit a vett kódból kivonva kapjuk meg az eredeti kódszót Standard elrendezési táblázat: Szindróma Javítható hibaminták s (0) e (0) = 0 c (1) c (2) s (1) e (1) c (1) + e (1) c (2) + e (1) s (2) e (2) c (1) + e (2) c (2) + e (2) Az első oszlopban felsoroljuk az összes lehetséges szindrómát (q n k db) A második oszlop felírása az s T = He T egyenlet megoldásával történik (az e-k lesznek a javítható hibaminták) Ha több lehetséges megoldás van, akkor a minimális súlyút kell választani A táblázat segítségével végezhető a táblázatos dekódolás Példa: e 1 1 0 0 1 1 1 e 2 0 = 0 1 0 0 1 e 3 1 1 0 0 1 1 e 4 } {{ } } {{ } szindróma H e 5 } {{ } hibavektor Megoldás: Az egyenletrendszer megoldásához ki kell választani, hogy a paritásmátrix melyik oszlopainak összege adja ki a szindrómát A hibavektorban ezen oszlopok i sorszámainak megfelelő e i -k értéke 1, a többié 0 Ez esetben a jó megoldások: (4); (1, 3); (2, 5); (1, 2, 3, 4, 5); hiszen ezen oszlopok összege [1 0 1] T Mivel nekünk a minimális elemszámú megoldás kell, válasszuk az első megoldást, a 4 oszlopot Ez alapján a keresett hibavektor [0 0 0 1 0] T Bináris Hamming-kód: egy hibát tud javítani, paritásmátrixa az összes lehetséges n k hosszú nemnulla oszlopvektorból álló mátrix Pl (7,4) paraméterű Hamming-kód: 1 1 0 1 1 0 0 H = 1 0 1 1 0 1 0 0 1 1 1 0 0 1 3
Tétel: a Hamming kód perfekt, és a Hamming korlát alapján igaz rá, hogy 1 + n = 2 n k 3 Nembináris lineáris kódok Véges test: egy q elemszámú testet véges testnek nevezünk és GF (q)-val jelöljük (Test: értelmezett rajta az összeadás és szorzás) Tétel: GF (q) esetén q = p m alakú, ahol p prím és m 1 Elem rendje: Minden 0 a GF (q)-ra létezik egy legkisebb m természetes szám, amit az a elem rendjének nevezünk, és melyre a m = 1 Primitív elem: Egy α GF (q)-t a GF (q) primitív elemének nevezzük, ha α rendje q 1 Különböző testek primitív elemei: GF (q) Primitív elemek GF (3) 2 GF (5) 2, 3 GF (7) 3, 5 GF (11) 2, 6, 7, 8 GF (13) 2, 6, 7, 11 Nembináris kód: hasonlóan értelmezett és generált, mint a bináris kódok, de értékkészlete egy GF (q) test elemeiből kerül ki Nembináris Hamming-kód: egy hibát tud javítani A paritásmátrix oszlopai mind különbözőek, nincs köztük nullvektor, és az első nem nulla elem minden oszlopban 1 Példa: az (n, n 2) paraméterű Hamming-kód (ez MDS kód): H = ( 1 1 1 1 1 ) 0 1 α α 2 α n 3 0 1 Itt α egy nem 0 elem, és a hatványozások a GF (q) test felett értelmezettek! (Azaz pl 3 2 = 2 mod 7) Tétel: a maximális hosszú nembináris Hamming-kód perfekt, és a Hamming korlát alapján igaz rá, hogy 1 + n(q 1) = q n k Véges test feletti polinomok: a(x) = a 0 + a 1 x + + a m x m GF (q) feletti n-edfokú polinom, ha a i, x GF (q) és a m = 0 A polinom fokszáma deg a(x) Műveletek véges test feletti polinomokkal: Összeadás: az azonos fokú együtthatókat összeadjuk Szorzás: minden tagot minden taggal szorzunk, majd az azonos fokú tagokat csoportosítjuk A műveletek elvégzése után a tagoknak venni kell a q-val vett osztási maradékát Pl 15x 2 + 9x = x 2 + 2x mod 7 4
Euklideszi osztás polinomokra: a(x) = q(x)d(x) + r(x) Ha nincs maradék, d(x) a(x) (d(x) osztója a(x)-nek) Reed-Solomon kód: lineáris kód, kódtávolsága d min = n k + 1 (MDS kód) Megjegyzés: ha t és n meg van adva egy feladatban, de k nincs, akkor használhatjuk a 2t = n k összefüggést Primitív (szóhosszú) Reed-Solomon kód: olyan, GF (q) feletti RS-kód, melynek kódszóhosszára igaz, hogy n = q 1 Reed-Solomon kód 1 konstrukció: Legyenek α 0, α 1,, α n 1 a GF (q) különböző elemei, és u = (u 0,, u k 1 ), amelyhez az u(x) = u 0 + u 1 x + + u k 1 x k 1 üzenetpolinomot rendeljük Ekkor a kódszó előállítása: c 0 = u(α 0 ), c 1 = u(α 1 ), 1 1 1 1 α 0 α 1 α 2 α n 1 G = α0 k 1 α1 k 1 α2 k 1 αn 1 k 1 Reed-Solomon kód 2 konstrukció: Legyen α a GF (q) egy nem 0 eleme, melynek rendje m n és az 1 konstrukcióban legyen α i = α i : 1 1 1 1 1 α α 2 α n 1 G = 1 α 2 α 4 α 2(n 1) 1 α k 1 α 2(k 1) α (n 1)(k 1) Reed-Solomon kód 3 konstrukció: A c vektorhoz rendeljük a c(x) = c 0 + c 1 x + + c n 1 x n 1 polinomot Ha az α elem rendje m n, akkor a kód definíciója: C = {c : c(α i ) = 0, i = 1, 2,, n k} {c : Hc T = 0} 1 α α 2 α n 1 1 α 2 α 4 α 2(n 1) H = 1 α n k α 2(n k) α (n k)(n 1) Nem rövidített Reed-Solomon kód: ha a 3 konstrukcióban m = n, azaz a generáló elem rendje megegyezik a kódszóhosszal Ilyenkor a 3 és a 2 konstrukció megegyezik Rövidített Reed-Solomon kód: ha a 3 konstrukcióban m > n Reed-Solomon kódok dekódolása: Bonyolult, lásd TK243 4 Aritmetika GF (p m )-ben 5
Irreducíbilis polinom: GF (p) feletti, nem nulladfokú P (x) polinom irreducíbilis, ha nem bontható fel két, nála alacsonyabb fokú GF (p) feletti polinom szorzatára Bináris esetben irreducíbilis polinomok: Néhány példa: x 2 + x + 1; x 3 + x + 1; x 4 + x + 1; x 5 + x 2 + 1; x 6 + x + 1; x 7 + x 3 + 1; GF (p m ) GF (p) konverzió Legyen p prím, P (x) egy GF (p) feletti irreducíbilis polinom és Q = {0, 1,, p m 1} Q két kiválasztott elemének (a és b) kölcsönösen egyértelműen feleltessünk meg egy-egy GF (p) feletti, legfeljebb (m 1)-edfokú polinomot a + b legyen az a c Q, melynek megfelelő c(x)-re c(x) = a(x) + b(x) a b legyen az a d Q, melynek megfelelő d(x)-re d(x) = a(x) b(x) mod P (x) Ezzel az aritmetikával Q egy GF (p m ) GF (2 2 )-beli aritmetika: P (x) = x 2 + x + 1 Testelem Polinom 0 0 1 1 2 x 3 x + 1 GF (2 2 )-beli műveletek: Összeadás: koordinátánkénti (átvitel nélküli) bináris összeadás, pl 11 + 01 = 10 Szorzás: a két számnak megfelelő polinomokat összeszorozzuk és vesszük a szorzat P (x) szerinti osztási maradékát, pl 3 3 = (x + 1)(x + 1) = x 2 + 2x + 1 = x 2 + 1 = x mod (x 2 + x + 1) GF (2 2 ) GF (2) műveleti táblái a fentiek alapján felírva: + 0 1 2 3 0 0 1 2 3 1 1 0 3 2 2 2 3 0 1 3 3 2 1 0 0 1 2 3 0 0 0 0 0 1 0 1 2 3 2 0 2 3 1 3 0 3 1 2 5 Ciklikus kódok Ciklikus eltolás: Egy c = (c 0, c 1,, c n 1 ) vektor ciklikus eltoltja az Sc = (c n 1, c 0,, c n 2 ) Ciklikus kód: olyan kód, amiben bármely kódszó ciklikus eltoltja is kódszó Kód(szó)polinom: a c = (c 0, c 1,, c n 1 ) kódszóhoz rendelt c(x) = c 0 + c 1 x + + c n 1 x n 1 polinom 6
Generátorpolinom: minden (n, k) paraméterű, ciklikus, lineáris kódban a nem azonosan 0 kódpolinomok között egyértelműen létezik egy minimális fokszámú g(x) főpolinom Egy c C akkor és csak akkor, ha g(x) c(x), azaz létezik egy u(x) üzenetpolinom úgy, hogy c(x) = g(x)u(x) Tétel: a generátorpolinom fokszáma n k Tétel: ciklikus, lineáris kód generátorpolinomára g(x) x n 1 Generátorpolinom generátormátrixa (1 módszer): g 0 g 1 g 2 g n k 1 1 0 0 0 0 g 0 g 1 g n k 2 g n k 1 1 0 0 G = 0 0 0 0 g 0 g 1 g n k 1 1 g n k = 1 minden sorban, mert g(x) főpolinom (= legmagasabb fokú tagjának együtthatója 1) Megj: ez a felírás nem szisztematikus! Generátorpolinom generátormátrixa (2 módszer, szisztematikus generálás): G első k oszlopa az I k egységmátrix lesz, a maradék n k k elem kitöltése: 1 Kiszámítjuk az [x (n k)+i mod g(x)] maradékpolinomokat i = 0, 1,, k 1-re Pl x 5 = x 2 (1 + x + x 3 ) x 2 (1 + x) = x 2 (1 + x) = 1 + x + x 2 mod (1 + x + x 3 ) 2 Az ezen polinomokhoz tartozó vektorokat (pl x 2 + x = [1 1 0]) beírjuk a generátormátrix üres soraiba (lentről felfelé haladva) Paritásellenőrző polinom: egy g(x) generátorpolinomú lineáris, ciklikus kód esetén h(x) = xn 1 g(x) Tétel: lineáris, ciklikus kód esetén c(x) akkor és csak akkor kódszó, ha c(x)h(x) = 0 mod (x n 1) Ciklikus Reed-Solomon kód: A 3-as RS-kód konstrukcióban legyen az n kódszóhossz egyenlő az α elem m rendjével (nem rövidített RS-kód) Ekkor a kód ciklikus és generátorpolinoma, valamint paritásellenőrző polinoma: n k g CRS (x) = (x α i ) h CRS (x) = i=1 n i=n k+1 (x α i ) CRC kód: generátorpolinomával megadott bináris, ciklikus kód, melyet a generátorpolinom szerinti maradékos osztással, szisztematikusan generálnak (Lásd TK219, 418 tétel) 5 Vegyes kódok 7
BCH-kód: az n = q m 1 kódszóhosszú, GF (q) feletti kódot t hibát javító BCH-kódnak nevezzük, ha a g(x) generátorpolinomjának gyökei az α i GF (q m ), i = 1, 2,, 2t testelemek BCH-kód generátorpolinoma: lásd TK232 BSC(p) csatorna: p valószínűséggel elrontja a bitet, 1 p valószínűséggel hiba nélkül átviszi Rövidített kód: egy C(n, k) kód azon kódszavai által alkotott C(n i, k i) kód, melyeket a kód az i darab 0-val kezdődő üzenetekhez rendel Páros paritásbit (egyszerű paritásbit): a kódszó végére illesztett bit, mely a kódszó 1- eseinek számát párosra egészíti ki Paraméterek: C(n, k, d) = C (n + 1, k, d ) Ha d páros: d = d; ha d páratlan: d = d + 1 1 1 1 1 0 H C = H C 0 0 Páratlan paritásbit: a kódszó végére illesztett bit, mely a kódszó 1-eseinek számát páratlanra egészíti ki Paraméterek: C(n, k, d) = C (n + 1, k, d ) Ha d páros: d = d + 1; ha d páratlan: d = d Kódátfűzés: egy C(n, k, d) kód m db n hosszú kódszavát egy m n-es mátrixba rendezzük soronként, majd a mátrix oszlopait sorrendben kiolvasva kapjuk a C m = C(mn, mk, d) kódot Hibacsomó: a hibavektor egy l hosszúságú szegmense hibacsomó, ha a szegmens első és utolsó karaktere nem zérus Tétel: ha g(x) a C kód generátorpolinoma, akkor g(x m ) a C m kód generátorpolinoma Tétel: A C m átfűzéses kód m t hosszú hibacsomót javít (t a C kód hibajavító képessége) Hibacsomójavító képesség: egy C(n, k) lineáris kód l hibacsomójavító képességére fennáll, hogy l n k 2 Reiger-optimalitás: ha egy kód hibacsomójavító képességére igaz, hogy l = n k 2, a kód Reiger-optimális Szorzatkód: egy C 1 (n 1, k 1, d 1 ) és egy C 2 (n 2, k 2, d 2 ) lineáris kód felhasználásával egy C 1 C 2 (n 1 n 2, k 1 k 2, d 1 d 2 ) kódot hozunk létre Szorzatkód generátormátrixa: lásd TK238 6 Transzformációs kódolás 8
Transzformációs kódolás: a Reed-Solomon kódok Fourier-transzformációt felhasználó kódolási módszere Paraméterek: legyen GF (q) = GF (p m ), ahol p prím; α pedig legyen GF (q) egy n-edrendű eleme (n a kódszóhossz) Üzenet trafókódolása: 1 Az u = (u 0, u 1,, u k 1 ) kódszó elé teszünk n k darab 0-t, így kapjuk meg az n hosszú spektrumot: C = (0, 0,, 0, u } {{ } 0, u 1,, u k 1 ) n k 2 A spektrumon elvégezzük az inverz Fourier-transzformációt: n 1 c i = f(n) α ij C j 3 Az így kapott c = (c 0, c 1,, c n ) a transzformációs kódolású kódszó f(n) számítása: Legyen a 1 az a inverze GF (p) fölött, azaz a a 1 = 1 mod p Pl 3 1 = 5 mod 7, mert 3 5 = 15 = 1 mod 7 Ekkor f(n) = (n mod p) 1 Bináris esetben f(n) = 1 Ha α primitív eleme GF (q)-nak, akkor f(n) = (p 1) 1 mod p j=0 7 Konvolúciós kódolás A konvolúciód kódolás alapelve: a forrás bitfolyama k bites üzenetkeretekre van osztva A kódoló m üzenetkeretet tárol léptetőregiszterben (időegység alatt 1 keretet léptetünk be a regiszterbe, a legrégebbi keretet pedig eldobjuk) Minden időegység alatt az éppen bejövő új keret és a tárolt m keret alapján a kódoló kiszámol egy n bit hosszúságú kódszókeretet, ami a kódoló kimenetén megjelenik Ezen kódolás eredménye egy fa-kód Kódsebesség: R = k n Kényszerhossz: K = (m + 1)k Blokkhossz: N = (m + 1)n Konvolúciós kód: egy (n, k) fa-kódot, ha lineáris, invariáns és véges kényszerhosszú, (N, K) konvolúciós kódnak hívunk Kibővített bináris fa reprezentáció: a fa csomópontjaiból két irányba léphetünk a kódolandó üzenetbitnek megfelelően A fa éleit azon bit n-essel címkézzük meg, amely a kódoló kimenetén megjelenik az aktuális üzenetbit belépésének hatására A gyökértől a fa élei mentén a fa leveleiig vezető utak egy-egy kódszónak felelnek meg A csomópontokat állapotokkal címkézzük meg (az állapotkódnak érdemes a shiftregiszterben éppen eltárolt biteket megfeleltetni) Állapotátmenet-gráf: az előbbi fa reprezentáció állapotkódjai lesznek a csomópontok 9
(állapotok), melyek mindegyikéből két nyíl vezet másik állapotokba címkézett, ahol i az üzenetbit, jk pedig a kimeneten megjelenő bitek Az él i/jk formában Trellis ábrázolás: a fa-ábrázoláshoz hasonló, de az egy mélységben lévő azonos állapotokat összevonjuk Az egymást követő élek utakat alkotnak, amelyek mindegyike a 00 állapotból indul, és oda is fut be végül A kódoló kétféle leírása (példa): Lineáris kombinációk Ekvivalens generátorpolinomok x 2i 1 = u i + u i 2 g 1 (x) = 1 + x 2 x 2i = u i + u i 1 + u i 2 g 2 (x) = 1 + x + x 2 Generátorpolinom-mátrix: általános esetben a g ij (x) az üzenetkeret i-edik bitje és a kódkeret j-edik bitje közti összefüggést írja le Ekkor a generátorpolinomokat mátrixba rendezhetjük: G(x) = [g ij (x)] Katasztrofális kód: egy konvolúciós kód katasztrofális, ha tetszőlegesen nagy Hamming-súlyú input-sorozat esetén korlátos Hamming-súlyú marad az output Tétel: egy kód akkor és csak akkor katasztrofális, ha állapotgráfjában létezik egy hurok, amelyet alkotó valamennyi élen a kódszókeretek 0 súlyúak i-edik minimális távolság: a legkisebb Hamming-táv az output sorozatok első i kódszókeret hosszú (i n bit) szegmense között Jelölése: d i Távolságprofil: d 1, d 2, d 3, Szabad távolság: d free = d = max d i Viterbi-dekódolás: a konvolúciós kódok maximum-likelihood dekódolására optimalizált algoritmus Lásd TK270 Leágazó kódszavak: Legyen a(d, i) a trellis-ábrázoláson a zéró kódszónak megfelelő útból az 1 csomópontban leágazó azon utak darabszáma, amelyek d Hamming-távolságra vannak és i súlyú üzenetekhez tartoznak T(D,I) meghatározása: Állapotgráf átrajzolása: 00 állapot felbontása A és B állapotokká Élek felcímkézése Ij D k alakú címkékkel, ahol j az üzenetbit, és k az élhez tartozó kimenet Hamming-súlya Egyenletrendszer felírása a csomópontokra, a pontba bemenő élek összegzésével (pl X = ID 2 A + IZ) B = T (D, I) A felhasználásával T (D, I) kiszámítása 10