Kódoláselmélet. (Humann kód, hibajavító kódok, véges testek konstrukciója. Reed-Solomon kód és dekódolása.) 1 Kommunikáció során az adótól egy vev ig viszünk át valamilyen adatot egy csatornán keresztül. Az adatot az információ mennyiséggel mérhetjük, melynek mértékét az általa megszüntetett bizonytalansággal mérünk. Tegyük fel, hogy adatainkat r különböz jelb l álló sorozattal kódoljuk, ekkor ha az adott jelsorozat (üzenet) p valószín séggel fordul el, akkor az információtartalma legyen I := log r p. Egy forrás által kibocsájtott átlagos információtartalom a forrás entropiája a következ mennyiség legyen: p i log r p i, ahol pi az i. üzenet el fordulásának valószín sége. Minden adatot egy adott karakterkészlet jeleib l álló sorozattal kódolunk, ugyanis ez az a forma, mellyel könnyen tudunk különféle machinációkat végrehajtani. Kódolásnak az injektív leképezéseket nevezzük. Azért csak az injektíveket tekintjük kódolásnak, mert csak ezek dekódolhatóak. Minden üzenet felbontható elemi részekre, amelyet már le tudunk kódolni jelsorozatokká, ezen elemi részeknek megfelel kódszavak egymás után írásával kapjuk meg az üzenet ún. bet nkénti kódolással. Üzeneteinket a természetes nyelvek redundánsan közlik, melyre a zajos környezet miatt szükség is van, hiszen ha minden szavunkat legfeljebb 5 bet vel írnánk le (amit meg is tehetnénk), úgy pl. az aabaf és aadaf szavakat elég zajos helyen meg sem tudnánk különböztetni, pedig lehet, hogy teljesen mást jelentenének, ezzel szemben a kenyér és sajtosperec szavakat még zajos metrón is megkülönböztethetjük (még ha nem is értjük, de legalább tudjuk, hogy ez a kett nem ugyanaz volt). Ezen jelsorozatokban fellelhet redundanciát a tömörítéssel lehet csökkenteni, ami gyorsabb átvitelt is eredményezhet. Jelöljük A,B,...-vel egy adott ábécé bet ib l álló halmaz, A + -szal az ezen ábécé feletti legalább egy hosszú szavakat, csillagos változatában megengedjük az üres szót is. A bet nkénti kódolás egy A B + függvény, melyet úgy terjsztünk ki egy A + B + függvénnyé, hogy a sorozatokat alkotó bet k kódját egymás után írva azt kapjuk, mintha ezzel a függvénnyel képeztük volna le az üzenetet. Prex, szux, inx a szavak elejét, végét és közepét jelentik (mindhárom foga-
2 lomba belefér az egész szó maga is). Szavak nem üres halmazát prexmentesnek nevezzük, ha benne egyik szó sem valódi prexe a másiknak. Kódok tulajdonságai közül néhány fontosabb. Egy kód felbontható, ha a megfelel A + B + függvény injektív. Egy kód prexmentes, ha a kódolás értékkészlete prexmentes. Egy kód vessz s, ha van olyan B + -beli elem, mely az értékkészlet t le különböz elemének szuxse, de egyiknek sem prexe, vagy inxe. Ha ilyen vessz nincs, akkor a kód vessz mentes. Kód átlagos szóhossza a különböz bet k kódjának hossza szorozva az el fordulás valószín ségével, ez szummázva minden bet re. 1. Tétel (McMillan egyenl tlenség). Legyen A egy n elem, B egy r elem abécé, r>1, és legyen ϕ : A B + injektív függvény. Ha e leképezés által létesített betünkénti kódolás felbontható, akkor r ϕ(ai) 1. Megfordítva, ha l1,...,ln olyan pozitív egészek, melyek megfelelnének az el bbi szummában látott kitev knek, úgy van olyan prex kódolása A-nak a B elemeivel, melyben az i. bet hossza li. E tétel szemléletesen azt fejezi ki, hogy felbontható kódban az átlagos szóhossz nem lehet túlságosan kicsi. A második része pedig azt szemlélteti, hogy felbontható kódból ugyanolyan hosszakkal készíthet prex kód is, ha esetleg els re nem ilyet sikerült volna összerakni. Adott valószín ségekhez tartozó, adott elemszámú kódoló ábécével megkonstruált minimális átlagos szóhosszúságú prex kódot optimális kódnak nevezzük. Ezek azon kódok, amelyekben a McMillan egyenl tlenség által adott szumma minél jobban megközelíti az egyet, pontosabban mivel a valós számok körében tetsz leges közelítés érhet el, azt a kódot nevezzük optimálisnak, melynek átlagos szóhossza a szumma+1-et már nem éri el, de legalább a szumma értéke. Ilyen optimális kódot ad a Human kód, amelynek konstrukciója a következ. Rendezzük valószín ségük csökken sorrendjébe a bet ket, majd a két legnagyobb
3 valószín ség bet t vonjuk össze egy közös kódúvá. Itt lényegében az történik, hogy folyamatosan építjük a kódfát, a legnagyobb valószín ség bet k kódját téve a legrövidebbnek, oly módon, hogy a két legkisebb valószín ség bet lesz a kódfa legalsó szintjén, és felfelé haladva jönnek az egyre s r bben el forduló bet k, de egy bet az mindig egy levélen lehet. Hibajavításnál az els dleges szempont az, hogy az átviteli közeg által okozott esetleges hibákat kisz rjük, javítsuk. Ennek alapján kétfajta hibakorlátozó kód létezik, a hibajelz, valamint a hibajavító kódok. Egy kód t-hiba jelz, ha mindig hibát jelez, ha a küldött kódszó max t helyen hibásodott meg. Pontosan t hiba jelz nek akkor nevezzük, ha van olyan t+1 hiba, amit már nem jelez. Hibajavításra ezt hasonlóan deniáljuk. Ahhoz, hogy a hibajelzés és javítás között kapcsolatot teremthessünk, be kell vezetni a Hamming-távolság fogalmát. u és v kódszavak Hamming távolsága az egymástól eltér helyiértékek száma. Ez valóban rendelkezik a távolságfüggvények megszokott tulajdonságaival (szimmetria, csak egyezés esetén nulla,háromszög egyenl tlenség). u kódszó Hamming súlya a nem nulla bitek száma. Kód távolsága a két minimális távolságú kódszavának távolsága, súlya a minimális súlyú kódszó súlya. Egyszer en látható, hogy egy kód pontosan akkor t hiba jelz, ha t kisebb mint a kód távolsága, és pontosan akkor pontosan t hiba jelz, ha t megegyezik a távolság- 1-gyel. Például paritásbites kód esetén a kód távolsága 2, ez a kód a hibát csak jelezni tudja, javítani nem. Minimális távolságú dekódolás esetén mindig a távolságban legközelebb álló kódszóra döntünk ha hibás volt az átvitel. Több ilyen esetén valamilyen más algoritmussal dönthetünk az egyikre. Adott távolságú kódnál a távolság felének az alsó egészrésze az a határ, aminél kevesebb vagy még pont annyi hibával ez a fajta dekódolás m ködhet, hiszen háromszög egyenl tlenség miatt ez a kódszó lesz a legközelebb ahhoz amit kaptunk. Összefoglalva tehát ha egy kód távolsága d, akkor a kód d hiba jelz, pontosan d-1 hiba jelz, d/2 javító, és pontosan (d-1)/2 alsó egészrész javító.
4 További hibajavító kódok a mátrixos paritás bit, amikor egy adott mátrixban van az üzenet, és ennek minden sora és oszlopa után helyezünk egy paritásbitet. Ezzel már javítani is lehet, ám pl pont négyzetesen elhelyezked hibákat ezzel is csak detektálni lehet, javítani nem mindig. Lineáris kódok esetében a kódszavakat egy K test feletti lineáris térb l vesszük. Egy ilyen kódot e tér alterének tekintjük. Ha a tér k dimenziós, a kód távolsága d, és a test számossága q, akkor jelöljük ezt a kódot [n,k,d]-vel, (esetleg q-t is feltüntethetjük a jelölésben). Egy lineáris kód két mátrixszal jellemezhet, az ún. generátormátrixszal, amelyben az altér bázisvektorai szerepelnek, azaz ez egy k n -es mátrix; valamint az ellen rz mátrixszal, melynek tulajdonsága, hogy vele jobbról szorozva a kódvektorokat 0-t kapunk, míg más vektorokkal szorozva nem nullát. Bármely K k -beli elemet megszorozva a generátormátrixszal, kódszót kell kapnunk. Reed-Solomon kódoknál egy test feletti l dimenziós vektorteret veszünk, amihez hozzárendelünk egy polinomot, mégpedig c K l -hez a c i x i polinomot. Ez a hozzárendelés megfordítható természetesen. Ez egy összegtartó, injektív, valamint skalárszorost tartó leképezés. Most válasszunk a véges test multiplikatív csoportjából egy elemet, a-t, melynek rendje legalább l, jelöljük n-nel. Tudjuk, hogy ekkor a- nak az n-edik hatványa a test szorzásra nézett egységeleme, így a akárhanyadik hatványa ezen az n-ediken is az egységelem. Továbbá ezen kisebb hatványok mint különböznek, hiszen a rendje n, így azonnal következik, hogy az a i -k és csak ezek a gyökei a x n e polinomnak, vagyis felírható a gyöktényez s felbontásos alakja ennek a hatványok segítségével. Válasszuk a g polinomot ezen hatványok szorzatának, de a szorzat most csak n-k-ig menjen el, vagyis g = n k i=0 (x ai ). Ez a polinom láthatóan osztja az x n e polinomot. Ennek többszörösei (azaz legfeljebb k-1-edfokú nem nulla polinomokkal való szorzatai) legyenek az általa generált Reed- Solomon kód. C elemei a legfeljebb n-1-ed fokú polinomok, és van is ilyen fokú polinom, pl x k 1 g. Belátható, hogy C egy lineáris altere a legfeljebb k-1 dimenziós K feletti térnek, valamint, hogy a C a K n k dimenziós altere. Belátható továbbá,
5 hogy a K feletti legfeljebb n-1-ed fokú polinomok pontosan akkor elemei e g generálta kódnak, ha g minden gyöke gyöke u-nak is. Ennek a kódnak egy ellen rz mátrixát kaphatjuk, ha az i-edik sor j-edik elemének az a (i+1)j -nek választjuk, ugyanis a egy n-k-ad rend részmátrixának a determinánsa pont ebben az esetben lesz 0, ami a megfelel kiemelések után látszik is. A kód egyik legfontosabb tulajdonsága, hogy a kód távolsága d=n-k+1, és mivel H rangja n-k, így a kód maximális távolságú. Még egy fontos probléma a véges testek megkonstruálása. Nevezetes tétel, hogy minden Z p maradékosztálygy r pontosan akkor test, ha p prím. További nevezetes tételek, hogy minden már véges test ezeknek a b vítésével jön létre, vagyis minden testnek valamely p prímre Z p a legsz kebb részteste, ún. prímteste. Mivel egy n-ed fokú polinommal történ testb vítés után egy p n elem test jön létre, úgy könnyen látható, hogy minden véges test elemszáma prímhatvány, valamint, hogy minden elemszámra izomorától eltekintve egy véges test létezik. Tegyük fel, hogy egy q elem testet szeretnénk b víteni q n elem vé. Ennek lépései: 1. Keresünk egy, a q elem test feletti irreducubilis polinomot, azaz olyat, aminke ott nincs gyöke. 2. Ennek a gyökét megjelöljük valamilyen eddig nem használt bet vel (pl i-vel). 3. Meghatározzuk az új test elemeit, amelyek i legfeljebb n-1-edfokú polinomjai lesznek (mint pl komplexeknél a b vítés másodfokúval történt, s ott i els fokú polinomjai lettek az új elemek, mint pl 2+4i) 4. Meghatározzuk az új test összeadó, és szorzótábláját. Összeadásnál még egyszer a dolog, szorzásnál viszont lépten nyomon fel kell használni, hogy i annak az adott polinomnak a gyöke, különböz számolási trükkökre van szükség. (pl amikor valósat b vítettük komplexre az x 2 +1 polinommal, akkor az i*i értékét az i*i+2=0 segítségével számoltuk ki, mivel feltettük, hogy i a polinom gyöke.)