Föreläsning 7 Felrättande koder Antag att vi vill skicka ett meddelande som består av bokstäver a,b,c,d. Vi kan koda a,b,c,d. Antag att det finns en viss sannolikhet att en bit i ett meddelande som skickas kan förvanskas. Ex: skickas. Det förvanskas till på vägen till mottagaren. Ett fel har alltså uppstått. Kan det korrigeras? Ex: Vi försöker med en annan kodning. a, b, c, d Om en bit förvanskas så får vi inget korrekt kodord. Vi kommer därför att upptäcka att något är fel. Men om vi t.ex. tar emot vet vi inte vilket korrekt kodord det motsvarar. Är det eller? Ex: Vi kodar nu a, a, a, a. Om ett fel uppstår nu kommer man inte bara att kunna upptäcka det utan också avgöra vad det rätta kodordet skall vara. Vi har en felrättande kod. Vi kommer i fortsättningen att studera koder där alla kodord har samma längd (till skillnad från förra avsnittet). Antag att K är en kod med kodord med längd n. Ex: K = {,,, } Maxstorleken av en kod av längd n är 2 n. Koden skall kunna användas för att m olika tecken krävs förstås att m 2 n d.v.s. n log 2 m. Avstånd: Avståndet mellan två kodord k,k 2 brukar man definiera till δ(k,k 2 )=antalet positioner där k,k 2 skiljer sig åt. Ex: δ(, ) = 3, δ(, ) = 2. Vi vill använda K och antar att bara ett fel kan uppstå per kodord. Sats: K är -felrättande om avståndet mellan alla kodord i K är 3. Bevis: Antag att kodord k i skickas. Antag att ett fel uppstår så att ordet förvanskas till ordet s som inte är ett kodord. δ(k i,s)=. Det finns inget annat k j med δ(s, k j )=.(Omdet fanns skulle δ(k i,k j )=2.) Vi kan alltså vara säkra på att s är en förvanskning av k i och vi kan då rätta felet. Problem: Vi vill skapa kod med minavstånd 3, längd n och som har så många kodord som möjligt. Hur bra går det att göra?
En övre gräns: Antag att det finns m kodord. Varje kodord har n grannar på avstånd. Om minavståndet är 3 har inga kodord några gemensamma grannar. Då måste m(n +) 2 n Så m 2n (n+). Ex: Om n =3måste m 8 4 =2. Om n =4måste m 6 5 d.v.s. m 3. Linjära koder Enklaste sättet att generera koder är att använda linjär algebra i Z 2.Vibeskriver kortfattat hur denna algebra fungerar: En vektor av längd n i Z 2 har formen (,,,,, ) (t.ex.) Alla komponenter är eller. Addition av vektorer sker komponentvis med tillägg av regeln += (d.v.s. räkning i Z 2 ). Ex: (,,,,, ) + (,,,,, ) = (,,,,, ) Vektorer kan multipliceras med talen eller. (,,,,, ) = (,,,,, ) (,,,,, ) = (,,,,, ) Obs: (,,,,, ) + (,,,,, ) = (,,,,, ) 2 vektor = vektor = Linjärt beroende: En mängd vektorer är linjärt beroende om någon av vektorerna kan skrivas som en summa av några av de övriga. Mängden är linjärt oberoende annars. Ex: Mängden (,,, ), (,,, ), (,,, ) är linjärt beroende. Mängden (,,, ), (,,, ), (,,, ) är linjärt oberoende. Linjär kod: Om det är så att summan av två kodord (tolkade som vektorer) alltid blir ett nytt kodord säger vi att koden är linjär. Vi kan också beskriva vad en linjär kod är genom att tala om hur man konstruerar en sådan: Vi tolkar kodord som vektorer av längd n i Z 2. (Totalt finns det 2 n sådana möjliga vektorer. Vi skall välja ut vissa av dem.) Antag att vi vill kunna koda m stycken olika tecken och att k är det minsta heltal log 2 m. (Vi vill skapa en kod med 2 k kodord.)
Välj ut en mängd av k linjärt oberoende vektorer b, b 2,... b k. Dessa vektorer utgör en bas för koden. (Talet k kallas för kodens dimension. Talet n kallas för kodens längd.) Det finns 2 k linjärkombinationer av b, b 2,... b k. Dessa 2 k vektorer utgör kodorden i vår linjära kod. Hur tecken kodas på kodord Vi antar nu att det finns 2 k tecken som skall kodas på lika många kodord. Vi kan först ange tecknen på binär form. (Det första som..., det andra som... o.s.v.) Om ett tecken har binära numret s s 2...s k så kodar vi det med kodordet s b + s 2 b2 +...s k bk Ex: Om b =(,,, ), b 2 =(,,, ), b 3 =(,,, ) och vi vill koda så får vi (,,, ) + (,,, ) + (,,, ) = (,,, ) Felrättande linjära koder Antag att vi har en linjär kod med dimension k och längd n. (Det finns alltså 2 k kodord.) Sats: Koden är felrättande (kan rätta fel) om inget kodord utom... har färre än 3 ettor. Problem: Givet n hur åstadkommer man en linjär felrättande kod med så stort k som möjligt. En övre gräns: På samma sätt som i en tidigare uppskattning vi gjorde får vi d.v.s. 2 k (n +) 2 n 2 k 2n (n +) För vissa smarta val av n och k går det att få likhet i olikheten. Man har då fått en optimal kod. Bra kodning: Det finns en linjär kod med n =7,k =4som är -felrättande. Den kallas för Hammingkoden. Det betyder att istället för att använda 4 bitar använder vi 7. Ett meddelande som annars skulle kräva n bitar kommer nu att kräva 7 4 bitar. För att få en felrättande kod betalar vi priset av en förlängning av koden med en faktor 7 4.
Vårt första försök till felrättand kod som innebar att vi tripplade varje kodord skulle innebär en förlängning med en faktor 3. Beskrivning av Hammingkoden: Vi beskriver koden på ett speciellt sätt. Vi bildar följande matris H i Z 2 : H = H kallas för kontrollmatrisen för koden. Kodorden definieras på följande sätt: En vektor x är ett kodord om och endast om H x =. (Alla kodord har längd 7.) Ex: x = ger H x =. Så x är ett kodord. x = ger H x =. Så x är inte ett kodord. Kolumnerna i H är talen, 2,...7 i binär form. Till varje linjär kod går det att hitta en kontrollmatris. Men Hammingkoden har en speciellt enkel form på kontrollmatrisen. Det går att se ganska enkelt att ingen vektor x med eller 2 ettor kan uppfylla H x =. Alltså har alla kodord utom fler än 2 ettor och koden är därför felrättande. En lösning av systemet H x = ger En annan beskrivning av koden
x = x 3 + x 5 + x 7 x 2 = x 3 + x 6 + x 7 x 4 = x 5 + x 6 + x 7 Man kan säga att x 3,x 5,x 6,x 7 bär informationen och att x,x 2,x 4 är kontrollsiffror. Om vi har ett binärt a a 2 a 3 a 4 sätter vi x 3 = a,x 5 = a 2,x 6 = a 3,x 7 = a 4 och beräknar sedan x,x 2,x 4. Ex: Ordet kodas till. På samma sätt kan alla 6 kodord fås. Syndromdekodning Antag att x är ett korrekt kodord och att x är x med en siffra fel. H x = s där s är en vektor med tre tal. Dessa tal bildar binära formen på ett tal mellan och7.dettatalangervilkenpositionfeletäri.vifåralltsådirektredapåvad felet är. Vektorn s brukar kallas för syndromet. Metoden att rätta fel kallas för syndromdekodning. Generella Hammingkoder Större matriser H kan konstrueras på följande sätt: Välj ett tal r.låth ha kolumner som är de binära formerna för talen, 2,...2 r. H har r rader oh 2 r kolumner. n =2 r och k =2 r r. r =3ger oss vår första Hammingkod. För r =4får vi n =5och k =. Alla dessa koder kallas för Hammingkoder.