Codierungstheorie Skript zur Vorlesung im SS 2010 Diplom-und Masterstudiengang Prof. Peter Hauck Arbeitsbereich Diskrete Mathematik Wilhelm-Schickard-Institut Universität Tübingen Inhaltsverzeichnis Einführung 3 1 Grundbegriffe und einfache Beispiele 5 2 Grundbegriffe der Informationstheorie und der Kanalcodierungssatz von Shannon 12 3 Lineare Codes 24 4 Reed-Muller-Codes und Majority-Logic-Decodierung 39 5 Expander-Codes und LDPC-Codes 54 6 Zyklische Codes 64 7 Reed-Solomon-Codes 73 8 Faltungcodes 79 1 Literatur 1. E. R. Berlekamp, Algebraic Coding Theory. Aegean Park Press, 1984. 2. B. Friedrichs, Kanalcodierung. Springer, 1995. 3. D. Jungnickel, Codierungstheorie. Spektrum Akademischer Verlag, 1995. 4. J. Justeson and T. Høholdt, A Course in Error-Correcting Codes. European Mathematical Society, 2004. 5. W. Lütkebohmert, Codierungstheorie. Vieweg, 2003. 6. F. MacWilliams and N. J. A. Sloane, The Theory of Error-Correcting Codes. North Holland, 1977. 7. W. W. Peterson, Error-Correcting-Codes. John Wiley & Sons, 1962 8. V. S. Pless and W. C. Huffman (editors), Handbook of Coding Theory I, II. Elsevier, 1998. 9. T. Richardson and R. Urbanke, Modern Coding Theory. Cambridge University Press, 2008. 10. S. Roman, Coding and Information Theory. Springer, 1992. 11. R.-H. Schulz, Codierungstheorie. Vieweg, 2003. 12. J. van Lint, Introduction to Coding Theory. Springer, 1999. 13. S. A. Vanstone and P. C. Oorschot, An Introduction to Error-Correcting Codes with Applications. Kluwer, 1989. 14. W. Willems, Codierungstheorie. De Gruyter, 1999. 15. W. Willems, Codierungstheorie und Kryptographie. Birkhäuser, 2008. 16. S. Xambó-Descamps, Block Error-Correcting Codes. Springer, 2003. 2 Einführung Codierung: Sicherung von Daten und Nachrichten gegen zufällige Fehler bei der Übertragung oder Speicherung (Kanalcodierung). Situation (vereinfacht): Quelle Nachricht Kanal− Codierer codiert Nachricht Kanal Störungen! Decodierer Empfänger 1. codierte Nachricht zurückgewinnen 2. ursprüngliche Nachricht zurückgewinnen Ziele bei der Codierung: 1. Möglichst viele bei der Übertragung/Speicherung aufgetretene (zufällige) Fehler sollen bei der Decodierung erkannt und ggf. sogar korrigiert werden. 2. Der Aufwand zur Codierung und Decodierung soll möglichst gering sein. Grundprinzip: Hinzufügen von Redundanz Zwei Hauptaufgaben: • Konstruktion geeigneter Codes Anforderung: Gute Fehlererkennungs, -korrektureigenschaften mit möglichst geringer Redundanz • Konstruktion von Codierern, Decodierern Anforderung: Effizienz In der Praxis werden im wesentlichen zwei Typen von Codes unterschieden: Blockcodes und Faltungscodes. Wir werden beide Typen in der Vorlesung behandeln. Prinzipien bei der Kanalcodierung: FEC-Verfahren (Forward Error Correction) Aufgetretene Fehler werden erkannt und korrigiert. Vorteil: keine Verzögerung bei der Übertragung Nachteil: ggf. große Redundanz notwendig! 3 ARQ-Verfahren (Automatic Repeat Request) Aufgetretene Fehler sollen erkannt werden, werden aber nicht korrigiert. Stattdessen wird eine Wiederholung der Übertragung beim Sender angefordert. Vorteil: geringe Redundanz Nachteil: ggf. erhebliche Verzögerung bei wiederholter Übertragung 4 1 Grundbegriffe und einfache Beispiele Redundanz als Möglichkeit der Fehlererkennung und -korrektur kennzeichnet schon natürliche Sprachen. Wir werden jetzt einige einfache Beispiele beschreiben, an denen schon eine Reihe wichtiger Prinzipien der Kanalcodierung sichtbar werden. Zuvor eine Bemerkung zur Schreibweise: Wir werden Wörter der Länge n über einem Alphabet A sowohl in der Form a1 a2 . . . an als auch als Zeilenvektoren (a1 , a2 , . . . , an ) schreiben. Darüberhinaus kommt auch die umgekehrte Reihenfolge der Indizes oder ein Laufbereich von 0 bis n − 1 vor. Die Länge eines Wortes w = (a1 , a2 , . . . , an ) bezeichnen wir mit ℓ(w)(= n). 1.1 Beispiele (Prüfzifferncodes). Die Nachrichten bestehen aus Wörtern (Blöcken) der Länge n. An diese wird zur Codierung eine Prüfziffer angefügt. (a) Parity-Check-Code Die Nachrichten seien z.B. 00, 01, 10, 11 über dem Alphabet A = {0, 1}. Sie werden über demselben Alphabet auf folgende Weise codiert: 00 → 000 01 → 011 10 → 101 11 → 110 Eine Nachricht (x1 , x2 ) wird also zu (x1 , x2 , (x1 + x2 ) mod 2) codiert. Der ASCII-Code ist von diesem Typ: 128 Zeichen werden mit 8 Bits codiert, wobei das achte Bit ein Parity-Check-Bit ist, d.h. x8 = (x1 + . . . + x7 ) mod 2. (b) alter ISBN-Code Die frühere International Standard Book Number ist ein 10-stelliger Code, der jedes Buch international erkennbar macht. Die ersten 9 Ziffern kennzeichnen Erscheinungsland, Verlag und Buch; an diese wird eine zehnte Prüfziffer angehängt (Redundanz). Uncodierte Wörter sind über dem Alphabet B = {0, . . . , 9} und Codewörter sind über dem Alphabet A = {0, 1, . . . , 9, X} gebildet. X steht für 10. Die Prüfziffer c1 wird so gewählt, dass für c10 c9 ...c1 gilt: 10 X k=1 kck ≡ 0 5 (mod 11) Ist dabei c1 = 10, so wird c1 = X gesetzt. Der Code ist 1-Fehler-erkennend. Durch die gewichtete Quersumme wird auch sichergestellt, dass die Vertauschung zweier Ziffern erkannt wird. (c) EAN-13-Prüfzifferncode Die Europäische Artikelnummer ist ein 13-stelliger Code, der sich auf vielen Produktverpackungen befindet. Nachrichten und Codewörter sind aus dem Alphabet A = B = {0, . . . , 9}. Sei c13 ...c1 ein Codewort. c13 ...c2 beschreibt Herstellungsland, Hersteller und Produkt. c1 wird so gewählt, dass gilt: c13 + 3c12 + c11 + . . . 3c2 + c1 ≡ 0 (mod 10). Seit 1.1.07 wird statt des in (b) beschriebenen ISBN-10-Codes ISBN-13 verwendet, der mit EAN-13 kompatibel ist. Der Präfix 978 bzw. 979 Buchland“ wird der 10-stelligen ISBN-10 vorangestellt. Anschließend ” wird die Prüfziffer gemäß EAN-13 neu berechnet. (d) Seriennummern der EURO-Scheine Die Seriennummer besteht aus einem führenden Buchstaben (nicht alle Buchstaben A-Z kommen vor, A-I, O, Q nicht; X steht für Deutschland) und einer 11-stelligen Zahl. Die letzte Ziffer ist eine Prüfziffer. Diese wird wie folgt bestimmt: Codiere den führenden Buchstaben in eine 2-stellige Dezimalzahl entsprechend seiner Position im Alphabet. Das liefert c13 . . . c1 . c1 wird dabei so gewählt, dass gilt: 13 X i=1 c1 ≡ 8 (mod 9). (Also könnte man 9 auch durch 0 ersetzten und in Z9 rechnen.) 9 ↔ 0 zeigt, dass nicht alle Einzelfehler erkannt werden. Klar: keine Vertauschungen werden erkannt. Vorteil: Modulo-9-Rechnung entspricht (iterierte) Quersummenbildung bis zum 1-stelligen Ergebnis. Warum gerade 8, ist unklar. (Seriennummern der DM-Scheine waren subtiler aufgebaut.) 6 1.2 Beispiele. (a) 1.1(a): Angenommen 111 wird empfangen. Klar: 1 oder 3 Fehler sind aufgetreten. Ein Fehler könnte an jeder beliebigen Stelle entstanden sein. (b) Codiere stattdessen: 00 → 000000 01 → 010101 10 → 101010 11 → 111111 3-facher Wiederholungscode. Zwei verschiedene Codewörter unterscheiden sich an mindestens 3 Stellen. Tritt 1 Fehler auf, so ist das nächstgelegene Codewort das gesendete. Es handelt sich also um einen 1-Fehler-korrigierenden Code. (c) Es geht mit weniger Redundanz als in (b): 00 → 00000 01 → 01101 10 → 10110 11 → 11011 Wieder sind zwei verschiedene Codewörter an mindestens 3 Stellen unterschiedlich, aber die Redundanz ist geringer als in (b). Mit Fehler“ ist hier die Änderung eines Bits gemeint. Es könnte aber auch ” sein, dass eine Stelle nicht mehr als 0 oder 1 identifiziert werden kann: Auslöschung. (Wir betrachten zunächst nur Änderungen und keine Auslöschungen.) In Beispiel 1.1, 1.2 wurden zur Codierung Nachrichten fester Länge k in Codewörter fester (größerer) Länge n codiert. Wichtig: Nicht alle Wörter der Länge n sind Codewörter (das wird ausgenutzt zum Erkennen und Korrigieren von Fehlern). Das führt zu folgender Definition: 1.3 Definition. Sei A eine endliche Menge (Alphabet), n ∈ N. Ein Blockcode C der (Block-) Länge n über A ist eine Teilmenge von An = A . . × A}. | × .{z ←n→ Die Elemente von C heißen Codewörter. Ist |A| = 2 (i. Allg. A = {0, 1}), so heißt C binärer (Block-)Code. 7 (Solange wir uns mit Blockcodes beschäftigen, sagen wir auch kurz Code“ ” statt Blockcode“). ” Ist |C| = m, so lassen sich Alphabete B der Größe m codieren. B kann auch aus Blöcken über einem kleineren Alphabet (z.B. {0, 1}) bestehen (wie in den Beispielen in 1.2). Folgen von Elementen aus B (d.h. Wörter über B) werden dann in Folgen von Codewörtern codiert. Die Zuordnung: Element von B 7→ Codewort“ ist die Codierungsfunktion. ” (Sie kann auch kontextabhängig sein.) In 1.2 hatten wir schon von Abstand gesprochen. Das präzisieren wir: 1.4 Definition. Sei A ein endliches Alphabet, n ∈ N, a = (a1 , . . . , an ), b = (b1 , . . . , bn ) ∈ An . d(a, b) = |{i : 1 ≤ i ≤ n, ai 6= bi }| d(a, b) heißt Hamming-Abstand von a und b. (Richard W. Hamming, 1915-1998; Bell Labs, Naval Postgraduate School Monterey, USA; Mitbegründer der Codierungstheorie mit einer Arbeit aus dem Jahre 1950.) 1.5 Satz. Sei A ein Alphabet und a, b, c ∈ An beliebig. Dann gilt: (1) 0 ≤ d(a, b) ≤ n (2) d(a, b) = 0 ⇔ a = b (3) d(a, b) = d(b, a) (4) d(a, b) ≤ d(a, c) + d(c, b) (Dreiecksungleichung) Also ist d eine Metrik. Ist A eine kommutative Gruppe bezgl. + (z.B. A = Zn ), so: (5) d(a + c, b + c) = d(a, b) (Translationsinvarianz) Beweis. Nur (4): Ist ai 6= ci , so ist ai 6= bi oder ci 6= bi . Behauptung folgt. Beachte: Wird ein Wort x ∈ C gesendet und y ∈ An empfangen mit d(x, y) = k, so sind k Fehler aufgetreten. 8 1.6 Definition. (a) Hamming-Decodierung für einen Blockcode C ⊆ An : Wird y ∈ An empfangen, so wird y zu einem x′ ∈ C decodiert mit d(x′ , y) = min d(x, y). x∈C (x′ ist im Allgemeinen nicht eindeutig bestimmt!) (Wann diese Decodierung sinnvoll ist, werden wir uns in Kürze überlegen.) (b) Sei C ⊆ An ein Blockcode. Der Minimalabstand von C ist: d(C) = min d(x, x′ ). x,x′ ∈C x6=x′ (c) Ein Blockcode C heißt t-Fehler-korrigierend, falls d(C) ≥ 2t + 1. Ein Blockcode C heißt t-Fehler-erkennend, falls d(C) ≥ t + 1. Zur Bezeichnung in 1.6(c): • Ist d(C) ≥ 2t + 1 und ist x ∈ C, so liegt in der Kugel“ ” Kt (x) = {y ∈ An : d(x, y) ≤ t} vom Radius t um x genau ein Codewort, nämlich x (da d(C) > t). Treten also bei der Übertragung von x höchstens t Fehler auf, so liegt das empfangene Wort in Kt (x), aber in keiner Kugel Kt (x′ ), x′ ∈ C, x′ 6= x, d.h. d(y, x′) > d(y, x) für alle x′ ∈ C, x′ 6= x. Der Grund dafür ist, dass die Kugeln von Radius t um Codewörter disjunkt sind. Angenommen y ∈ Kt (x1 ) ∩ Kt (x2 ). Dann gilt d(x1 , x2 ) ≤ d(x1 , y) + d(y, x2) ≤ 2t < d(C). Also liefert bei maximal t aufgetretenen Fehlern Hamming-Decodierung das korrekte gesendete Codewort x. (Hamming-Decodierung kann aber inkorrekt sein, falls mehr als t Fehler aufgetreten sind.) 9 t t ≥ d(C) x1 x2 Kt (x2 ) Kt (x1 ) • Ist d(C) ≥ t + 1, und sind bei der Übertragung eines Codewortes maximal t Fehler (und mindestens einer) aufgetreten, so ist das empfangene Wort kein Codewort. Es wird erkannt, dass Fehler aufgetreten sind. 1.7 Beispiele. (a) m-facher Wiederholungscode: Block der Länge k (fest) wird m mal gesendet. (n = m · k) -Fehler-korrigierend. d(C) = m. C ist m−1 2 (vgl. Beispiel 1.2; dort m = 3). (b) Code aus Beispiel 1.2(c): d(C) = 3, n = 5. C ist 1-Fehler-korrigierend, 2-Fehler-erkennend. (c) Sei C = {000000 | {z }, 101101 | {z }, 110110 | {z }}. Dann ist d(C) = 3. C ist also | {z }, 011010 x1 x2 x3 x4 1-Fehler-korrigierend. Angenommen x1 = 000000 wird gesendet und y = 000011 wird empfangen (2 Fehler). d(xi , y) ≥ 3 für alle i = 2, 3, 4. Hamming-Decodierung liefert also x1 . Angenommen x1 = 000000 wird gesendet und y = 100001 wird empfangen. d(x1 , y) = d(x2 , y) = 2, d(x3 , y), d(x4 , y) ≥ 3. Hamming-Decodierung ist also nicht eindeutig. Angenommen x1 = 000000 wird gesendet und y = 011000 wird empfangen. d(x2 , y) = 1. Es wird also falsch zu x2 decodiert. 1.8 Definition. Sei C ein Blockcode in An mit |A| = q. logq (|C|) n heißt Informationsrate (kurz: Rate) von C. (1 − R wird gelegentlich Redundanz von C genannt.) R= 10 Beachte: logq (|An |) = n. Die Informationsrate gibt an, welcher Anteil eines Codewortes reine Information ist. Einheit: Infosymbol/Codesymbol. (Beachte: Ohne Codierung könnte man die |C| Codewörter jeweils mit logq (|C|) Zeichen aus A komprimiert darstellen.) 1 kannn man auch als Verzögerungsfaktor betrachten, der durch die CodieR rung der Infosymbole verursacht wird. Manchmal ist es notwendig, die Rate auf Bits statt auf Symbole zu beziehen. Das führt zur binären Rate Rb = R · log2 (q) Infobit/Codesymbol. 1.9 Beispiele. (a) m-facher Wiederholungscode, |A| = q, n = k · m, |C| = q k . k R = k·m = m1 (q = 2: Ein Infobit auf m Bits) (b) Code aus Beispiel 1.2(c): 4 Codewörter über {0, 1} der Länge 5. R = 52 (c) Parity-Check-Code der Länge n: R = n−1 . n Ziel der Codierungstheorie: Finde Codes mit hoher Rate und kleiner Decodierfehlerwahrscheinlichkeit (bei Hamming-Decodierung heißt das großer Minimalabstand). Das geht im Prinzip: Satz von Shannon (s. folgendes Kapitel). 11 2 Grundbegriffe der Informationstheorie und der Kanalcodierungssatz von Shannon Quelle Q Kanal Empfänger E Strings über Alphabet A Erhält den Output des Kanals: Zeichen über Alphabet B Modulation Demodulation (i. Allg. A = B , Hard−Decision; aber auch A 6= B kann sinnvoll sein; z.B. zusätzlich das Zeichen ? für Auslöschung; oder allg. Soft−Decision−Demodulation s. Kap. 8) Quelle: 2.1 Voraussetzung. Die Quelle Q gebe die Zeichen aus dem Alphabet A mit der Wahrscheinlichkeit pQ (a), a ∈ A, aus. Also: X 0 ≤ pQ (a) ≤ 1, pQ (a) = 1. a∈A (Gedächtnislose Quelle; Wahrscheinlichkeit von a ist nicht von dem vorangegangenen Zeichen abhängig. Idealisierung!) 2.2 Definition. Der Informationsgehalt eines von Q ausgegebenen Zeichens a ∈ A ist 1 IQ (a) := log2 = − log2 (pQ (a)) ∈ R≥0 ∪ {∞}. pQ (a) Einheit: Bit (Im Folgenden: log = log2 ) Interpretation: Je größer pQ (a), desto geringer ist die Überraschung, wenn a auftritt. Der Informationsgehalt stellt ein Maß für die Überraschung dar (Beispiel: Erdbeben, kein Erdbeben) 12 Dass man als Maß gerade log pQ1(a) wählt, hat folgenden Grund: Man will, dass der Informationsgehalt nur von der Wahrscheinlichkeit von a abhängt und dass gilt: (1) Für zwei unabhängig voneinander ausgegebene Zeichen soll sich der Informationsgehalt addieren. (2) Die Funktion soll stetig sein und es soll I(a) < I(b) gelten, falls pQ (a) > pQ (b) gilt. (3) Geeignete Normierung Das führt auf log( pQ1(a) ). 2.3 Definition. Die Entropie einer Quelle Q ist definiert durch X X H(Q) := pQ (a)IQ (a) = − pQ (a) log(pQ (a)) ≥ 0 a∈A a∈A (Ist pQ (a) = 0, so definiert man pQ (a)IQ (a) = 0; das ist sinnvoll, da 1 limx→0 x · log x = 0.) Interpretation: Die Entropie ist der mittlere Informationsgehalt pro Zeichen einer Quelle Q. Sie wird in Bit/Symbol gemessen. Sie Wieviele Bits werden im Durchschnitt P lässt sich auch so interpretieren: a∈A pQ (a) · l(Codewort von a) zur eindeutigen Präfixcodierung des Alphabets A mindestens benötigt. [Shannon’s Quellcodierungssatz → Datenkompression] 2.4 Beispiele. A = {a1 , . . . , aq } (a) pQ (a1 ) = 1, pQ (ai ) = 0, i ≥ 2. Dann H(Q) = 0. (b) pQ (ai ) = 1q , 1 ≤ i ≤ q. Dann IQ (ai ) = log(q), H(Q) = log(q). (q = 2: H(Q) = 1) (c) |A| = 8 1 • Ist pQ (ai ) = für alle i, so H(Q) = 3 nach (b). 8 Kompakteste Präfixcodierung von A benötigt 3 Bits pro Symbol. 13 • pQ (a1 ) = pQ (a2 ) = 41 , pQ (a3 ) = pQ (a4 ) = 1 pQ (a8 ) = 16 1 H(Q) = 2 · 14 · 2 + 2 · 81 · 3 + 4 · 16 · 4 = 2, 75. Mögliche Codierung (z.B. Huffman): a1 a2 a3 a4 a5 a6 a7 a8 → → → → → → → → 1 , 8 pQ (a5 ) = . . . = 11 10 011 010 0011 0010 0001 0000 2.5 Bemerkung. Für alle Wahrscheinlichkeitsverteilungen pQ gilt: 0 ≤ H(Q) ≤ log(q) (|A| = q). Das Maximum wird bei Gleichverteilung angenommen. Kanal: 2.6 Voraussetzung. Der Kanal sei ein diskreter gedächnisloser Kanal. Das bedeutet: Es gibt feste Wahrscheinlichkeiten p(b|a), wobei p(b|a) die Wahrscheinlichkeit ist, dass b ∈ B empfangen wird, falls a ∈ A gesendet wird. p(b|a) ist nicht abhängig von zuvor gesendeten Signalen. Die p(b|a) sind die Übergangswahrscheinlichkeiten des Kanals (bedingte Wahrscheinlichkeiten). P Klar: b∈B p(b|a) = 1. 2.7 Beispiele. (a) A = B, p(b|a) = 0 , b 6= a 1,b=a Ungestörter Kanal (b) p(b|a1 ) = p(b|a2 ) für alle a1 , a2 ∈ A, b ∈ B D.h. die Wahrscheinlichkeit, dass b empfangen wird, hängt nicht von dem gesendeten a ∈ A ab. Total gestörter Kanal Z.B. A = B = {0, 1}, p(b|a) = 21 für alle a ∈ A, b ∈ B. (c) A = B = {0, 1} p(0|1) = p(1|0) = p, p(0|0) = p(1|1) = 1 − p. Binärer symmetrischer Kanal (für unsere Anwendungen der wichtigste Fall). 14 Empfänger: 2.8 Definition. Die Wahrscheinlichkeitsverteilung pE beim Empfänger E (Outputverteilung) ist gegeben durch X pE (b) = p(b|a)pQ (a), b ∈ B. a∈A (pE (b) ist die Wahrscheinlichkeit, dass b empfangen wird, wenn ein Symbol aus A von Q generiert und durch den Kanal geschickt wurde.) Outputentropie: H(E) = − X pE (b) log(pE (b)). b∈B 2.9 Beispiele. (a) A = B, ungestörter Kanal, so H(E) = H(Q), denn pE (a) = pQ (a). (b) Total gestörter Kanal: pE (b) = p(b|a) für alle a ∈ A, b ∈ B. Wichtige Frage: Wieviel Information transportiert ein Kanal, der von einer Quelle Q gespeist wird, im Mittel pro eingegebenem Zeichen? Einfluss: Quelle und Kanal (Rauschquelle) tragen beide zu H(E) bei. Welcher Anteil von H(E) wird durch Kanalstörungen verursacht? 2.10 Definition. Seien a ∈ A, b ∈ B. Der bedingte Informationsgehalt von b, falls a gesendet wurde, ist 1 = − log(p(b|a)). I(b|a) := log p(b|a) Interpretation: Wenn a gesendet wurde, erwarten wir mit Wahrscheinlichkeit p(b|a) die Ausgabe b. I(b|a) ist also ausschließlich durch den Kanal verursacht worden. 2.11 Definition. Der mittlere bedingte Informationsgehalt bei Eingabe a (bedingte Entropie für a) ist X X 1 p(b|a) log p(b|a)I(b|a) = H(E|a) = . p(b|a) b∈B b∈B 15 Die Streuentropie oder Irrelevanz des Kanals mit Quelle Q ist X XX 1 H(E|Q) = pQ (a)H(E|a) = pQ (a)p(b|a) log . p(b|a) a∈A a∈A b∈B Interpretation: H(E|Q) ist der Anteil der Entropie von E, der im Mittel (bei Sendung eines Symbols) vom Kanal (also der Rauschquelle) beigesteuert wird. Leicht zu sehen: H(E|Q) ≤ H(E). 2.12 Beispiele. (a) UngestörterPKanal (A = B): H(E|Q) = a∈A pQ (a) log(1) = 0. (b) Total gestörter Kanal: H(E|a) = H(E) für alle a ∈ A, also auch H(E|Q) = H(E). (c) Binärer symmetrischer Kanal: H(E|a) = −(1 − p) log(1 − p) − p log p = H(E|Q). 2.13 Definition. Die mittlere Transinformation eines Kanals mit Ausgang E und Quelle Q ist I(Q, E) := H(E) − H(E|Q). Bemerkung. Man kann leicht zeigen: I(Q, E) ≤ H(Q). Interpretation: I(Q, E) gibt an, wieviel nutzbare Information pro gesendetem Symbol im Mittel über den Kanal transportiert werden kann (in Abhängigkeit einer gegebenen Wahrscheinlichkeitsverteilung der Quelle Q). 2.14 Definition. Die Kanalkapazität C eines Kanals ist definiert durch C := max alle W-Vert. der Quelle Q Einheit: Bit/Symbol Bemerkung. 0≤C Bem. nach 2.13+2.5 ≤ log(q), falls |A| = q. 16 I(Q, E) In der Regel ist C schwer zu bestimmen. Für manche Kanäle ist es einfach. 2.15 Beispiele. (a) Sei K ein ungestörter Kanal. Dann gilt: 2.12(a) 2.9 I(Q, E) = H(E) = H(Q), also C = log(q) nach 2.5 (Q mit Gleichverteilung). (C = 1 für eine binäre Quelle) (b) Sei K ein total gestörter Kanal. Dann gilt: C = 0 nach 2.12(b). 2.16 Satz. Die Kapazität eines binären symmetrischen Kanals ist C = 1 + p log(p) + (1 − p) log(1 − p) ≤ 1 (= log(2)) (Gleichheit wird erreicht für die Gleichverteilung auf Q) [C = 1 ⇔ p = 0 (ungestörter Kanal) oder p = 1 (jedes Bit wird umgedreht) C = 0 ⇔ p = 21 (total gestörter Kanal)] 1 C(p) 0.5 0 0.5 1 p Beweis: H(E|Q) = −(1 − p) log(1 − p) − p log p nach 2.12(c). Daher ist I(Q, E) = H(E) + (1 − p) log(1 − p) + p log p. I(Q, E) wird also maximal, wenn H(E) maximal wird. Dies ist nach 2.5 für pE (0) = pE (1) = 21 der Fall. Aus pE (0) = (1 − p) · pQ (0) + p · pQ (1) und pE (1) = (1 − p) · pQ (1) + p · pQ (0) folgt dann pQ (0) = pQ (1) = 12 . Dann ist H(Q) = H(E) = 1 und die Behauptung folgt. 17 Also: Die Kanalkapazität gibt an, wieviel nutzbare Information über einen Kanal übertragbar ist. Sei z.B. |A| = 2 und die Datenrate des Kanals sei 106 Bit/Sekunde (physikalisch). Hat der Kanal eine Kapazität von 0, 8 Bit/Symbol (Symbol = b Bit, da |A| = 2), so sind im besten Fall nur 0, 8 · 106 Bit/Sekunde nutzbare Information übertragbar. Der Satz von Shannon wird aussagen, dass man diese Übertragbarkeit von nutzbarer Information fast vollständig ausnutzen kann bei beliebig kleiner Decodierfehlerwahrscheinlichkeit. Situation: log (C) Code C der Länge n über A, |A| = q. R = nq Infosymbol/Codesymbol. D.h. der Anteil R der Symbole eines Codewortes enthält Information. Manchmal braucht man auch die binäre Rate Rb (vgl. Bemerkung nach 1.9): Wieviele Bits pro Codesymbol sind Information. Ein Symbol in A entspricht log2 (q) Bits. Also Rb = R · log2 (q). (q = 2, so R = Rb ) Code: Rb Bits pro Codesymbol reine Information Kanal: überträgt maximal C Bit/Symbol an Information Kann man einen Code finden, dessen binäre Rate möglichst nahe an der Kapazität des Kanals liegt und der trotzdem eine beliebig kleine Decodierfehlerwahrscheinlichkeit hat? Antwort: Ja. Dazu: Wie decodiert man am besten? 2.17 Decodierprinzipien. Voraussetzung: Die Codewörter werden über einen beliebigen diskreten gedächtnislosen Kanal übertragen. Angenommen y = (y1 , . . . , yn ) ∈ B n wird empfangen. In welches x b ∈ C soll decodiert werden? Bisher haben wir A = B und Hamming-Decodierung betrachtet. Ob das gut ist, hängt natürlich von pQ ab. (Betrachte den Spezialfall, dass Q immer nur dasselbe Codewort sendet.) Da der Kanal gedächtnislos ist, ist die Wahrscheinlichkeit, dass y empfangen Qn wird, falls x ∈ C gesendet wird: p(y|x) = i=1 p(yi |xi ). Die Wahrscheinlichkeitsverteilung pQ auf A liefert in derselben Art eine Wahrscheinlichkeitsverteilung pQ auf C. (Idealisierung; ansonsten wählt man direkt eine Wahrscheinlichkeitsverteilung auf C bzw. An und fasst An als Alphabet auf, um die vorige Begrifflichkeit anwenden zu können.) 18 (a) Die beste Decodierung ist die Maximum-Aposteriori-Decodierung (MAP): Wähle zu empfangenem y ∈ B n dasjenige x b ∈ C mit pQ (b x)p(y|b x) ≥ pQ (x)p(y|x) für alle x ∈ C. Damit maximiert man die Aposteriori-Wahrscheinlichkeit p(x|y) | {z } = bedingte W.-keit, dass x gesendet wurde, falls y empfangen wurde. p(y|x)pQ (x) (Bayes-Formel). pQ (y) | {z } fest für geg. y Problem: In der Regel kennt man pQ nicht. Dann: (b) Maximum-Likelihood-Decodierung (MLD): Zu gegebenem y ∈ B n wird zur Decodierung ein Codewort x b ∈ C gewählt, so dass p(y|b x) ≥ p(y|x) für alle x ∈ C. Sind alle Codewörter gleich wahrscheinlich, so entspricht dies MAP. 2.18 Decodierprinzipien bei binärem symmetrischem Kanal. (p < 12 ) (a) Bei einem binären symmetrischen Kanal ist MLD = Hamming-Decodierung. Für jedes empfangene Wort wird nach dem nächstgelegenen Codewort decodiert. Dieser Bereich wird zu c 1 decodiert. c1 ( Codewort) c2 c3 19 Hamming-Decodierung kann sehr aufwändig sein. Stattdessen gelegentlich einfacheres Verfahren: (b) Bounded Distance Decoding (BDD): Es wird ein festes t gewählt und um jedes Codewort wird eine Kugel vom Radius t gelegt. Decodiert werden diejenigen Wörter, die in genau einer Kugel liegen, die anderen nicht. Schlechtere Decodierung als MLD, aber in gewissen Fällen einfacher. y t t c1 c3 t c2 (c) Bounded Minimal Distance Decoding (BMD): Um jedes Codewort wird eine Kugel vom Radius t = ⌊ d(C)−1 ⌋ gelegt. 2 Dann sind die Kugeln disjunkt (siehe 1.6). Es werden nur diejenigen Wörter decodiert, die in einer Kugel liegen. (Form von BDD) y t t c1 c3 t c2 20 2.19 Kanalcodierungssatz von Shannon. (Claude Shannon 1916-2001; u.a. MIT) Gegeben sei ein diskreter gedächtnisloser Kanal mit Kapazität C, Quellenalphabet A. Wähle ε, ε′ > 0 beliebig. Dann existiert ein n ∈ N und ein Blockcode der Länge n über A, dessen binäre Rate R die Bedingung C − ε′ ≤ R < C erfüllt und wobei die Decodierfehlerwahrscheinlichkeit bei MLD kleiner als ε ist. Umgekehrt: Ist Rb > C, so kann die Decodierfehlerwahrscheinlichkeit eine gewisse Grenze nicht unterschreiten. Bevor wir den Beweis skizzieren, vergleichen wir die Aussage des Satzes mit einem Code, den wir schon kennen, dem 3-fachen Wiederholungscode über Z2 . 2.20 Beispiele. C = 3-facher Wiederholungscode von Blöcken der Länge 2 über Z2 , R = Rb = 1 . C = {(000000), (010101), (101010), (111111)}. 3 Wir nehmen einen binären symmetrischen Kanal an. p(0|0) = p(1|1) = 1 − p, p(1|0) = p(0|1) = p, p < 21 . Wie groß ist die Decodierfehlerwahrscheinlichkeit bei Hamming-Decodierung (= MLD, falls alle Codewörter gleich wahrscheinlich sind)? • 0,1 Fehler treten auf: Korrekte Decodierung • 2 Fehler treten auf: Wahrscheinlichkeit für genau 2 Fehler: p2 (1 − p)4 . Bei 6 der 15 Möglichkeiten für die 2 Fehler wird falsch decodiert (bei jedem Codewort). Die Wahrscheinlichkeit für 2 Fehler und falsche Decodierung ist also 6p2 (1 − p)4 . • 3,4,5,6 Fehler treten auf: Es wird immer falsch decodiert. Wahrscheinlichkeit für i Fehler: pi (1 − p)6−i . Diese könne an auftreten, i = 3, 4, 5, 6. 21 6 i Stellen Die Decodierfehlerwahrscheinlichkeit ist also 6p2 (1 − p)4 + 20p3 (1 − p3 ) + 15p4 (1 − p)2 + 6p5 (1 − p) + p6 . Angenommen p = 0, 01. Dann ist die Decodierfehlerwahrscheinlichkeit etwa 5, 96 · 10−4 < 0, 001. Beachte: Die Kapazität des Kanals ist C = 1+p log p+(1−p log 1 − p) ≈ 0, 92. Die Rate R ≈ 0, 33 ist deutlich kleiner. Beweisidee des Satzes von Shannon bei binärem symmetrischen Kanal. Sei p < 21 . Sei x ∈ {0, 1}n (n im Moment beliebig), x wird über den Kanal gesendet. Das empfangene Wort enthält im Mittel n · p Fehler. n r (Wahrscheinlichkeit für r Fehler ist r p (1 − p)n−r ; Binomialverteilung) Je größer n, umso größer ist die Wahrscheinlichkeit, dass die Anzahl der Fehler nahe bei n · p liegt. (Verhältnis von Standardabweichung zu Erwartungswert (Variationskoeffiziq ) ent): 1−p np Betrachte die vom Radius n · p um x (bzgl. der Hamming-Distanz). P Kugel n Sie enthält n·p k=0 k Wörter. Eine Abschätzung (siehe z.B. Friedrichs, Anhang A.2) zeigt: Pn·p einfache n nH(p) , wobei H(p) = −p log p − (1 − p) log(1 − p) (Entropie für k=0 k ≈ 2 2 Zeichen mit Wahrscheinlichkeit p, 1 − p). Könnte man {0, 1}n in disjunkte Kugeln vom Radius n·p zerlegen, so erhielte 2n man 2nH(p) = 2n(1−H(p)) = 2nC viele Kugeln. Wählt man die Mittelpunkte dieser Kugeln als Codewörter, so wird (bei = C. großem n) fast immer korrekt decodiert. Die Rate des Codes ist nC n Die Zerlegung von {0, 1}n in disjunkte Kugeln vom Radius np geht allerdings nicht. Was man aber machen kann: Man wählt den Radius der Kugeln etwas größer als np (in von ε′ und p abhängiger Weise). Man wählt zufällig 2R·n (C − ε′ ≤ R < C) viele Wörtern in {0, 1}n als Codewörter. Die MLD-Decodierung wird verschlechtert zu BDD mit Parameter t. Man kann dann zeigen, dass selten ein Wort empfangen wird, das in keiner Kugel liegt (denn dann müssen mehr als t Fehler aufgetreten sein) und dass außerdem im Mittel über alle Zufallswahlen auch die Wahrscheinlichkeit klein ist, dass es zwei Codewörter im Abstand ≤ t von einem empfangenen Wort gibt (weil man den Radius der Kugeln nicht zu groß gewählt hat). 22 Insgesamt kann man dann zeigen, dass der Erwartungswert für einen Decodierfehler ≤ ε ist, wenn man n genügend groß wählt. Daher muss es mindestens einen solchen Code geben. (Genauer Beweis: Friedrichs, Kapitel 2.7 (für binären symmetrischen Kanal); Roman, Kapitel 3.4) 23 3 Lineare Codes 3.1 Definition. Sei K ein endlicher Körper, n ∈ N. Ein linearer Code ist ein Unterraum des K-Vektorraums K n (Zeilenvektoren); insbesondere ist K das Alphabet. Ist dim(C) = k (≤ n) und d(C) = d, so heißt C ein [n, k] oder [n, k, d]-Code über K. |C| = q k . Ist |K| = q, so verwendet man auch die Schreibweise [n, k, d]q -Code. Rate: nk . 3.2. Endliche Körper • Zp ist bzgl. der Addition und Multiplikation modulo p ein endlicher Körper, falls p eine Primzahl ist. • Ist K ein endlicher Körper, so ist |K| = pm für eine Primzahl p und ein m ∈ N. • Zu jeder Primzahlpotenz pm gibt es (bis auf Isomorphie) genau einen endlichen Körper K mit |K| = pm . • Konstruktion endlicher Körper der Ordnung pm , m > 1: Sei f ein irreduzibles Polynom vom Grad m in Zp [t]. Zp [t]m−1 ist die Menge der Polynome vom Grad ≤ m − 1 über Zp . Bezgl. der normalen Addition von Polynomen und der Multiplikation g ⊙h = g ·h mod f (Rest bei Division durch f ) ist Zp [t]m−1 ein Körper der Ordnung pm . Beispiel: Körper der Ordnung 4 Z2 = {0, 1}, f = t2 + t + 1 ist irreduzibel. K = {0, 1, t, t + 1}. Es ist t2 mod f = t + 1, t2 + t mod f = 1 und (t + 1)(t + 1) mod f = t2 + 1 mod f = t. Damit erhält man folgende Multiplikationstabelle: ⊙ 0 1 t t+1 0 0 0 0 0 1 0 1 t t+1 t 0 t t+1 1 t+1 0 t+1 1 t 24 3.3 Beispiele. (a) n-facher Wiederholungscode über Zp (jedes Symbol wird n-mal wiederholt): C = {(0, ..., 0), (1, ..., 1), ..., (p − 1, ..., p − 1)} ist ein linearer [n, 1]-Code über Zp ; C = h(1, . . . , 1)i. P (b) C = {(u1, ..., un−1 , un ) : ui ∈ Zp , ni=1 ui = 0 in Zp } ist ein [n, n − 1]Code über Zp ( Parity-Check-Code“); ” C = h(1, 0, . . . , 0, p − 1), . . . , (0, . . . , 0, 1, p − 1)i. (c) C = {(0, 0, 0, 0, 0), (0, 1, 1, 0, 1), (1, 0, 1, 1, 0), (1, 1, 0, 1, 1)} aus 1.2 (c) ist ein linearer [5, 2]-Code über Z2 ; C = h(1, 0, 1, 1, 0), (0, 1, 1, 0, 1)i. 3.4 Definition. Sei K ein endlicher Körper. (a) Sei x ∈ K n . wt(x) = d(x, 0) = |{i | xi 6= 0}| heißt das Gewicht von x. (b) Ist {0} = 6 C ⊆ K n , so heißt wt(C) = min06=x∈C wt(x) das Minimalgewicht von C. 3.5 Satz. Ist C = 6 {0} ein linearer Code über K, so ist d(C) = wt(C). Beweis. Da C linear ist (x, x′ ∈ C ⇒ x − x′ ∈ C) und der Hamming-Abstand translationsinvariant ist (1.5), gilt: d(C) = = = = min{d(x, x′ ) : x, x′ ∈ C, x 6= x′ } min{d(x − x′ , 0) : x, x′ ∈ C, x 6= x′ } min{d(y, 0) : y ∈ C, y 6= 0} wt(C). 3.6 Definition. Sei C ein [n, k]-Code über K und g1 = (g11 , . . . , g1n ), . . . , gk = (gk1 , . . . , gkn ) eine Basis von C. Dann heißt die k × n-Matrix g1 g11 · · · g1n .. G = ... = ... . gk gk1 · · · gkn Erzeugermatrix (oder Generatormatrix ) von C. 25 3.7 Satz. Sei C ein [n, k]-Code über K und G eine k × n-Matrix über K. Dann gilt: G ist eine Erzeugermatrix von C ⇔ C = {uG : u ∈ K k }. ↑ Zeilenvektor Beweis: g1 ⇒: uG = (u1 , . . . , uk ) ... = (u1 g1 + . . . + uk gk ). gk k Also: {uG : u ∈ K } besteht aus allen Linearkombinationen von g1 , ..., gk . Behauptung folgt. g1 ⇐: Sei C = {uG : u ∈ K k }, G = ... . gk Wie oben: Alle Linearkombinationen der Zeilen von G bilden C. dim(C) = k ⇒ g1 , ..., gk sind linear unabhängig, bilden also eine Basis von C. 3.8 Bemerkung. (a) G beschreibt eine injektive lineare Abbildung K k → K n ; C ist das Bild. Durch Multiplikation mit G wird eine Codierungsmöglichkeit von Infowörtern in K k auf Codewörter in K n angegeben. (b) Führt man elementare Zeilenoperationen an G durch, so erhält man wieder eine Erzeugermatrix von C . (c) Gibt es eine Erzeugermatrix 1 0 ... 0 1 . . . G = (Ik | A) = .. .. . . 0 0 ... 0 ∗ ... 0 ∗ ... .. . ∗ ... 1 ∗ ... ∗ ∗ , ∗ ∗ so ist für ein Infowort u = (u1 , . . . , uk ) das zugeordnete Codewort uG = (u1 , . . . , uk , ∗ . . . ∗). Eine solche Erzeugermatrix heißt von Standardform (oder in systematischer Form; obige Codierung heißt dann systematische Codierung). Nicht jeder Code besitzt eine Erzeugermatrix in Standardform. Doch durch elementare Zeilenumformungen und Spaltenvertauschungen kann man einen äquivalenten“ Code erhalten mit Erzeugermatrix in Stan” dardform. 26 Beispiel. C aus 3.3 (c) 1 0 1 1 0 in Standardform Erzeugermatrix G = 0 1 1 0 1 1 1 0 1 1 G′ = ist ebenfalls eine Erzeugermatrix von C, aber nicht in 0 1 1 0 1 Standardform. Unterräume kann man auch als Lösungsräume homogener linearer Gleichungssysteme beschreiben. Dies führt zum Begriff der Erzeugermatrix eines Codes: 3.9 Satz und Definition. Sei C ein [n, k]-Code über K. Dann existiert eine (n − k) × n-Matrix H, so dass gilt: Ist x ∈ K n , so: x ∈ C ⇔ Hxt = 0 . ↑ (n−k)×1 (äquivalent: xH t = 0 ) ↑ 1×(n−k) H heißt Kontrollmatrix von C . Es ist rg(H) = n − k (d.h. die Zeilen von H sind linear unabhängig). (Dann gilt auch: HGt = 0, falls G Erzeugermatrix des Codes C ist.) Beweis. g1 .. Sei g1 , . . . , gk eine Basis von C und G = . , gi = (gi1 , . . . , gin ). gk Betrachte das lineare Gleichungssystem: g11 t1 + . . . + g1n tn = 0 .. .. .. .. . . . . gk1 t1 + . . . + gkn tn = 0. t1 .. Das heißt G · . = 0, bzw. (t1 , . . . , tn ) · Gt = 0 tn Da die Koeffizientenmatrix G den Rang k hat, ist die Dimension des Lösungsraumes n − k. Sei h1 = (h11 , . . . , h1n ), . . . , hn−k = (hn−k,1, . . . , hn−k,n ) eine Basis des Lösungsraumes. h1 h1 · git .. Setze H = ... . Dann gilt Hgit = = 0 für alle i = 1, . . . , k . t hn−k hn−k · gi 27 (hi . . . , hn−k erfüllen die i-te Gleichung oben). Also: Hxt = 0 für alle x ∈ C. Aus rg(H)= n − k folgt dim(Lösungsraum von Hxt = 0) = k, das heißt C ist der Lösungsraum von Hxt = 0. 3.10 Bemerkung. (a) Der Beweis von 3.9 gibt ein Verfahren an für: Erzeugermatrix → Kontrollmatrix. • Löse das LGS Gxt = 0. • Wähle eine toren). h1 .. • H := . Basis des Lösungsraumes ht1 , . . . , htn−k (hi Zeilenvek- hn−k ist eine Kontrollmatrix. (b) Umgekehrt: Kontrollmatrix → Erzeugermatrix Bilde eine Basis des Lösungsraumes von Hxt = 0. 3.11 Beispiele. P (a) Parity-Check-Code C = {(u1 , ..., un ) : ni=1 ui = 0} über Z2 : 1 0 ... ... 0 1 0 1 0 . . . 0 1 . .. .. . ... . . Erzeugermatrix G = . . .. .. . 0 1 0 ... ... ... 1 1 H = (1, 1, ..., 1) Kontrollmatrix 1 0 1 1 0 (b) C aus 1.2(c), Erzeugermatrix G = 0 1 1 0 1 Bestimmung der Kontrollmatrix: Lösung von Gxt = 0: x3 , x4 , x5 beliebig und x2 = x3 + x5 , x1 = x3 + x4 . 1 1 1 0 0 Das liefert H = 1 0 0 1 0. 0 1 0 0 1 An der Kontrollmatrix kann man den Minimalabstand des linearen Codes ablesen: 28 3.12 Satz. Sei C = 6 {0} ein [n, k]-Code über K mit Kontrollmatrix H. Dann gilt: d(C) = wt(C) = min {r ∈ N : es gibt r linear abhängige Spalten in H } = max {r ∈ N : je r − 1 Spalten in H sind linear unabhängig} Beweis. Seien s1 , . . . , sn die Spalten von H. Da C = 6 {0} ist, sind s1 . . . , sn linear abhängig (als Vektoren in K n−k ). Sei w ∈ N minimal, so dass es wP linear abhängige Spalten gibt, etwa si1 , . . . , siw . Dann existieren cj ∈PK mit nj=1 cj sj = 0 und cj 6= 0 genau für j ∈ {i1 , . . . , iw }. Also ist auch nj=1 cj stj = 0. Setzte c = (c1 , . . . , cn ). Dann ist st1 n X t cH t = (c1 , ..., cn ) ... = ci si = 0. (∗) t i=1 sn Damit ist Hct = 0. Also ist c ∈ C und wt(c) = w und damit wt(C) ≤ w. Angenommen es gibt ein 0 6= c ∈ C mit w = wt(c) < w. Dann folgt aus cH t = 0 wie in (∗), dass es w linear abhängige Spalten in H gibt. Dies ist ein Widerspruch zur Wahl von w. Also wt(C) = w. 2. Gleichheit klar. 3.13 Beispiel. Beispiel aus 3.11(c). Je zwei Spalten von H sind linear unabhängig, aber 1 1 0 1 , 0 , 1 sind linear abhängig. Also ist d(C) = 3. 0 0 0 3.14 Korollar (Singleton-Schranke). Ist C = 6 {0} ein linearer [n, k]-Code über K mit d(C) = d, so ist d ≤ n−k +1. Beweis: Nach der 2. Gleichheit in 3.12 gilt: d ≤ rg(H) + 1 = n − k + 1 (H Kontrollmatrix von C ). 3.15 Bemerkung und Definition. (a) Beachte: k = logq (|C|). Man kann auch für beliebige Codes C über A, |A| = q, zeigen, dass d ≤ n − logq (|C|) + 1, d.h. logq (|C|) ≤ n − d + 1 (|C| ≤ q n−d+1 ) gilt. Codes, für die Gleichheit gilt in 3.14 (bzw. 3.15) heißen MDS-Codes (maximum distance separable). 29 (b) Über Z2 gibt es nur triviale Beispiele von MDS-Codes. Man kann zeigen, dass C = {(0, . . . , 0), (1, . . . , 1)} (n = d, k = 1), C = Zn2 (n = k, d = 1) und n C = {c ∈ Z2 : wt(c) gerade} (k = n − 1, d = 2) die einzigen MDS-Codes über Z2 sind. Später (Kap. 7) werden wir nicht triviale Beispiele von MDS-Codes über anderen Körpern angeben. Wir beweisen jetzt eine weitere Schranke, die auch für beliebige Codes gilt. Wir benötigen das folgende Lemma, das wir für q = 2 schon implizit im Beweis des Satzes von Shannon verwendet haben. 3.16 Lemma. Sei |A| = q, x ∈ An ,Pt ∈ N0, Kt (x) = {y ∈ An : d(x, y) ≤ t}. Dann ist |Kt (x)| = ti=0 ni (q − 1)i . Beweis. Abstand i zu x: i Positionen von x auswählen: n Möglichkeiten. i An jeder Position Eintrag von x ändern: je (q − 1) Möglichkeiten. Insgesamt: ni (q − 1)i Wörter y mit d(x, y) = i. Behauptung folgt. 3.17 Satz (Hamming-Schranke, Kugelpackungsschranke). Sei C ein Code der Länge n über A, |C| > 1, |A| = q. Sei t ∈ N0 maximal mit d(C) ≥ 2t + 1, d.h. t = ⌊ d(C)−1 ⌋. Dann gilt 2 |C| ≤ Pt i=0 qn . n (q − 1)i i Beweis. Kugeln von Radius t um Codewörter sind disjunkt (siehe Bemerkung nach Definition 1.6).P Mit 3.16: |C| · ti=0 ni (q − 1)i ≤ |An | = q n . 3.18 Definition. Ein Code heißt perfekt, falls in 3.17 Gleichheit gilt. · · S S Äquivalent: x∈C Kt (x) = An . ( bezeichnet die disjunkte Vereinigung.) 30 3.19 Bemerkung. Ist C perfekt, |C| > 1, t wie in 3.17, so ist d(C) = 2t + 1 (d.h. perfekte Codes haben ungeraden Minimalabstand). Beweis. Es ist d(C) ≥ 2t + 1 nach Wahl von t. Wähle x ∈ C und ändere x an t+1 Stellen ab. Das liefert z mit d(x, z) = t+1. Also x ∈ / Kt (x). Perfektheit: ∃ x′ ∈ C mit d(x′ , z) ≤ t. d(x, x′ ) ≤ d(x, z) + ′ d(x , z) ≤ 2t + 1. Also: d(C) = 2t + 1. Wir konstruieren nun mit Hilfe der Kontollmatrix eine Serie linearer perfekter Codes (mit d = 3), die Hamming-Codes. 3.20 Hamming-Codes. Sei q eine Primzahlpotenz und K ein Körper mit |K| = q. ℓ −1 , k = n − ℓ. Sei ℓ ∈ N beliebig, n = qq−1 Dann existiert ein perfekter [n, k]-Code C über K mit d(C) = 3, der HammingCode. Konstruktion. ℓ −1 1-dimensionale Un|K ℓ \ {0}| = q ℓ − 1. Also enthält K ℓ genau n = qq−1 terräume. Wähle aus jedem einen Vektor 6= 0 aus und bilde aus den entsprechenden Spaltenvektoren eine ℓ × n-Matrix H. Es ist rg(H) = ℓ, denn H enthält ℓ linear unabhängige Spalten. Sei C der Code mit Kontrollmatrix H, C = {x ∈ K n : Hxt = 0} Hamming-Code. dim(C) = n − ℓ = k, |C| = q k . Je zwei Spalten in H sind linear unabhängig, aber es gibt drei linear abhängige Spalten. 3.12: d(C) = 3. Perfektheit: (t=1) P1 i=0 qn qn qn = = = q n−ℓ = q k = |C|. n ℓ i 1 + n(q − 1) q (q − 1) i Beachte: Es gibt mehrere Möglichkeiten für einen [n, k]-Hamming-Code, je nach Auswahl und Anordnung der Spaltenvektoren. Sie haben aber alle (bei festen q, ℓ) die gleichen Parameter. 31 3.21 Beispiele. 3 −1 (a) q = 2 und ℓ = 3. Dann ist n = 22−1 1 0 0 H= 0 1 0 0 0 1 = 7. 1 0 1 1 1 1 0 1 0 1 1 1 liefert einen [7, 4]-Hamming-Code über Z2 Also: C = {(x1 , . . . , x7 ) : x1 + x4 + x6 + x7 = 0, x2 + x4 + x5 + x7 = 0, x3 + x5 + x6 + x7 = 0} Erzeugermatrix 1 1 0 0 1 1 G= 1 0 1 1 1 1 für C: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 (b) q = 3 und ℓ = 3. Dann ist n = 33 −1 3−1 = 13. 1 0 0 1 2 0 0 1 2 1 2 1 1 H= 0 1 0 1 1 1 2 0 0 1 1 2 1 0 0 1 0 0 1 1 1 1 1 1 1 2 [13, 10]-Hamming-Code über Z3 . |C| = 310 = 59.049. Toto 13’er Wette: Fülle 59.049 Toto-Tipps aus mit den Codewörtern des [13, 10]-HammingCodes über Z3 . Jeder Vektor ∈ Z13 3 hat höchstens Abstand 1 von einem Codewort. D.h. man hat mindestens 12 Richtige. (Vgl. Anzahl aller Tipps = 313 = 1.594.323) Ergebnis vom 1./2.5.2010: (1 2 0 0 0 1 2 1 0 0 0 2 1) = y 2 t Hy = 0, also y ∈ / C. 2 1 2 (Wenn man in H statt der Spalte 0 die Spalte 0 gewählt hätte, 1 2 wäre y ∈ C.) Also hat man nur 1 × 12 Richtige und mehrmals 10 bzw. 11 Richtige. Einsatz: 29.525, 50 + 4921 × 0, 35 = 31.246, 85 {z } | Bearbeitungsgebühr 32 Gewinn bei 12 Richtigen: 13.625,90 (bei 13 Richtigen: 81.755,80) Was ist das nächstgelegene Codewort zu y (Decodierung)? Es gibt x ∈ C mit d(x, y) = 1. Alle Elemente von C zu testen wäre zu langsam. Schneller: x unterscheidet sich von y an einer Stelle i, statt yi steht dort (yi + a) mod 3, a = 1 oder 2. h1i 2 Also 0 = Hy t = H(xt + (0, . . . , 0, a , 0, . . . , 0)t ) = a · h2i , ↑ h3i 2 i a = 1, 2. 2 Suche also in H die Spalte, die ein Vielfaches von 0 ist: 2 Die gesuchte Spalte steht an 8. Stelle, d.h. i = 8. 2 1 0 = a · 0 liefert a = 2. 2 1 Ersetze nun die i-te Stelle von y durch yi − a, also in unserem Fall y8 durch y8 − 2 = y8 + 1 = 1 + 1 = 2. Das liefert die Decodierung y → x = (1 2 0 0 0 1 2 2 0 0 0 2 1). Das war der Tipp. ↓ Hannover-Gladbach 6:1 Dies geht allgemein: 3.22 Schnelles Verfahren zur Hamming-Decodierung von Hamming– Codes. Empfängt man y und ist Hy t = 0, so ist y ∈ C. Gilt Hy t 6= 0, so suche in H diejenige Spalte s mit Hy t = a · s, a ∈ K \ {0}. Ist dies die i-te Spalte von H, so ändere yi in yi − a (mod q). Dies liefert x ∈ C, zu dem y decodiert wird. (Im binären Fall vereinfacht sich das Verfahren, da a = 1; ändere das Bit an der i-ten Stelle.) Wir befassen uns jetzt mit der Hamming-Decodierung beliebiger linearer [n, k]q -Codes. Wurde y empfangen, so könnte man alle q k Codewörter testen, welches minimalen Abstand zu y hat. Das kann sehr aufwändig sein. Bei Codes mit 2k > n gibt es ein effizienteres Verfahren: die SyndromDecodierung. Dazu benötigt man den Begriff der Nebenklassen eines Unterraums: 33 3.23 Bemerkung (Nebenklassen von Unterräumen in Vektorräumen). Sei C ein Unterraum des Vektorraums V . Für jedes v ∈ V heißt v + C := {v + x : x ∈ C} die Nebenklasse von C zu v. (Beachte: v = v + 0 ∈ v + C.) (a) Für v1 , v2 ∈ V gilt entweder v1 +C = v2 +C oder (v1 +C)∩(v2 +C) = ∅. Beweis: Angenommen, (v1 + C) ∩ (v2 + C) 6= ∅. Dann gibt es ein y ∈ (v1 + C) ∩ (v2 + C) mit y = v1 + x1 = v2 + x2 für x1 , x2 ∈ C. Daraus folgt: v1 = v2 + (x2 − x1 ) ∈ v2 + C. Für ein beliebiges x ∈ C gilt v1 + x = v2 + (x2 − x1 ) + x ∈ v2 + C. D.h. v1 + C ⊆ v2 + C. Analog erhält man die andere Inklusion. Insgesamt gilt v1 + C = v2 + C. (b) v1 + C = v2 + C ⇔ v1 − v2 ∈ C ⇔ v1 ∈ v2 + C (Insbesondere: v1 + C = C(= 0 + C) ⇔ v1 ∈ C) Beweis: 1. Äquivalenz: ⇒“: v1 = v1 + 0 = v2 + x für ein x ∈ C ⇒ v1 − v2 = x ∈ C. ” (a) ⇐“: v1 − v2 = x ∈ C ⇒ v1 + 0 = v2 + x ∈ (v1 + C) ∩ (v2 + C) ⇒ ” v1 + C = v2 + C. 2. Äquivalenz klar. (c) Wähle aus jeder Nebenklasse von C einen Vertreter vi . Dann: V = [ ˙ i vi + C (disjunkte Vereinigung) (d) Sei V ein Vektorraum über einem endlichen Körper K. Dann gilt |C| = |v + C| für alle v∈ V : C → v+C Die Abbildung ist bijektiv. x 7→ v + x (e) Aus (c) und (d) folgt: Ist C ein [n, k]-Code über K, |K| = q, so hat C genau q n−k verschiedene Nebenklassen in K n . 3.24 Syndrom-Decodierung linearer Codes. Sei C ein linearer [n, k]-Code über K, |K| = q, mit Kontrollmatrix H; also ist H eine (n − k) × n−Matrix. Ist y ∈ K n , so heißt Hy t ∈ K n−k das Syndrom von y. (a) x ∈ C ⇔ Hxt = 0 ⇔ x hat Syndrom 0 (kein Krankheitsbild“). ” 34 (b) y1 , y2 liegen in derselben Nebenklasse bezüglich C (d.h. y1 + C = y2 + C) ⇔ Hy1t = Hy2t (d.h. y1 , y2 haben das gleiche Syndrom.) (a) [y1 + C = y2 + C ⇔ y1 − y2 ∈ C ⇔ 0 = H(y1 − y2 )t = Hy1t − Hy2t ] (c) Jedes z ∈ K n−k tritt als Syndrom auf (klar nach (b) und 3.23(e)). Daher: Wird x ∈ C gesendet und y = x + f empfangen (f =Fehlervektor), so haben y und f das gleiche Syndrom. Hamming-Decodierung: Bestimme in der Nebenklasse von y einen Vektor e von minimalem Gewicht, einen sogenannten Nebenklassenführer (im Allgemeinen nicht eindeutig). Decodierung: y → y − e. Dazu: Ordne die Nebenklassenführer in lexikographischer Ordnung ihrer Syndrome (definiere dazu eine Ordnung auf K). Z.B. im binären Fall: Das Syndrom gibt die Stelle (0, ..., 2n−k − 1) des gesuchten Nebenklassenführers an (0 < 1). Das kann immer noch sehr aufwändig sein, z.B. bei einem [70, 50]-Code über Z2 . C hat dann 220 Nebenklassen, jeder Nebenklassenführer hat 70 Bit. Speicherplatzbedarf: 70 · 220 Bit = 8, 75 Megabyte (Allgemein: q n−k · n · log q Bits) Speichert man hingegen alle 250 Codewörter, so hat man einen Speicherplatzbedarf von 70 · 250 Bit ≈ 9.000 Terabyte. 3.25 Definition. Sei K ein endlicher Körper. Die Abbildung < , >: K n × K n → K ist definiert durch < u, v >:= n X i=1 ui vi = uv t ∈ K, wobei u = (u1 , . . . , un ), v = (v1 , . . . , un ). (Vgl. Euklidsches Skalarprodukt im Rn .) 3.26 Bemerkung. (a) < u + v, w > = < u, w > + < v, w > für alle u, v, w ∈ K n , λ∈K (b) < λu, v > = λ < u, v > (c) < u, v > = < v, u > (a)-(c) besagen, dass < , > eine symmetrische Bilinearform ist. (d) < 0, v > = < v, 0 > = 0 für alle v ∈ K n (e) Ist u ∈ K n mit < u, v >= 0 für alle v ∈ K n , so ist u = 0. 35 Beweis. (e) Sei v = ei . Dann gilt 0 =< u, ei >= ui . Dies gilt für i = 1, . . . , n, also u = 0. Beachte: Aus < v, v >= 0 folgt im Allgemeinen nicht v = 0. Z.B. gilt in K = Z2 : < v, v >= 0 ⇔ v hat eine gerade Anzahl an Einsen. 3.27 Definition (Dualer Code). Sei C ⊆ K n (C braucht kein Unterraum zu sein). Dann heißt C ⊥ = {y ∈ K n : < y, x > = 0 für alle x ∈ C} der duale (oder orthogonale) Code zu C . C ⊥ ist immer ein Unterraum, also ein linearer Code, selbst wenn C nicht linear ist. C ⊥ = (hCiK )⊥ . 3.28 Satz. Sei C ein [n, k]-Code über K. (a) C ⊥ ist ein [n, n − k]-Code. (b) (C ⊥ )⊥ = C (c) G ist Erzeugermatrix von C ⇔ G ist Kontrollmatrix von C ⊥ H ist Kontrollmatrix von C ⇔ H ist Erzeugermatrix von C ⊥ (d) Ist (Ik | A) eine Erzeugermatrix von C (in Standardform), so ist (−At | In−k ) eine Erzeugermatrix von C ⊥ , also Kontrollmatrix von C . Beweis. x1 .. n (a) Sei G Erzeugermatrix von C , y ∈ K , G = . , {xi }ki=1 Basis von xk C. y ∈ C ⊥ ⇔ < x, y > = 0 für alle x ∈ C ⇔ < xi , y > = 0 i = 1, . . . , k ⇔ Gy t = 0 Damit ist G Kontrollmatrix von C ⊥ , dim(C ⊥ ) = n − rg(G) = n − k. (b) C ⊆ (C ⊥ )⊥ ist klar. Die Gleichheit folgt aus Dimensionsgründen nach (a). 36 ⊥ (c) G Erzeugermatrix von C ⇒ G Kontrollmatrix von C (siehe (a)). x1 Sei umgekehrt G Kontrollmatrix von C ⊥ , G = ... . xk t ⊥ Dann gilt Gy = 0 für alle y ∈ C , d.h. < xi , y >= 0 für alle i = 1, . . . , k und alle y ∈ C ⊥ . ⊥ (b) ⇒ x1 , . . . , xk ∈ C ⊥ = C. Zeilen von G linear unabhängig, dim(C) = k ⇒ G Erzeugermatrix von C. Die zweite Äquivalenz folgt aus (b). (d) Es gilt: Ik = −At Ik +In−k At = 0. (− |{z} A | In−k )(Ik | |{z} A ) = (−A | In−k ) {z } At | (n − k) × n k × (n − k) | {z } (n − k) × n t t t n×k Daraus folgt, dass (−At | In−k ) eine Kontrollmatrix von C ist und damit nach (c) eine Erzeugermatrix von C ⊥ . 3.29 Beispiel. Duale Codes zu den Hamming-Codes: i h ℓ q −1 Der Hamming-Code H ist ein q−1 , n − ℓ -Code über K, |K| = q. |{z} =n Die Kontrollmatrix H enthält aus jedem 1-dimensionalen Unterraum von K ℓ einen Vektor 6= 0. Sei C = H⊥ . i h ℓ −1 , ℓ -Code. Er Nach 3.28(c) ist H Erzeugermatrix von C. C ist also ein qq−1 heißt Simplex-Code. Es gilt: Jedes Codewort 6= 0 in C hat Gewicht q ℓ−1 , d.h. der Abstand zwischen zwei verschiedenen Codewörtern ist immer konstant q ℓ−1 ; insbesondere ist d(C) = q ℓ−1 : Seien z1 , . . . , zl die Zeilen von H, 0 6= x = (x1 , . . . , xn ) ∈ C. Da die Zeilen von H eine Basis von C bilden, gibt es ai ∈ K mit P P x = ℓi=1 ai zi = ℓi=1 ai · (zi1 , . . . , zin ). Setze a = (a1 , . . . , aℓ ) ∈ K ℓ . Beachte: a 6= 0. 37 Es gilt: xj = 0 ⇔ Pℓ i=1 ai zij = 0 ⇔ z1j .. . zjℓ | {z } ∈ hai⊥ . j-te Spalte von H ⊥ hai hat Dimension ℓ − 1 nach 3.28(a). ℓ−1 hai⊥ enthält also q q−1−1 der Spalten hj von H. q ℓ−1 −1 viele Komponenten q−1 ℓ−1 q (q−1) = q ℓ−1 . q−1 Damit sind in x genau q ℓ−1 −1 xj = 0. wt(x) = n − q−1 = Der Simplex-Code ist nicht perfekt, von kleiner Dimension, hat aber großen Minimalabstand. Speziell: Dualer Code zum [7, 4]-Hamming-Code über Z2 : Simplex-Code C: [7, 3]-Code mit Minimalabstand d(C) = 4 1 0 0 1 0 1 1 Erzeugermatrix = 0 1 0 1 1 0 1 0 0 1 0 1 1 1 C = {(0000000), (1001011), (0101101), (0010111), (1100110), (1011100), (0111010), (1110001)} 38 4 Reed-Muller-Codes und Majority-Logic-Decodierung 4.1 Definition und Bemerkung. (a) Eine Boole’sche Funktion ist eine Abbildung f : Zm 2 → Z2 . Ordne die Elemente von Z2 lexikographisch: v0 = (0, . . . , 0), v1 = (0, . . . , 0, 1), . . . , v2m −1 = (1, . . . , 1). (D.h. vi entspricht dem Koeffizientenvektor der Binärdarstellung von i, P j−1 also i = m x 2 , falls vi = (xm , . . . , x1 ).) j=1 j f → f = (f (v0 ), . . . , f (v2m −1 )) liefert eine bijektive Abbildung von der Menge der Boole’schen Funk2m 2m tionen Zm Boole’sche Funktionen 2 → Z2 auf Z2 . Also gibt es 2 m Z2 → Z2 . Sie bilden einen Z2 -Vektorraum und einen kommutativen Ring mit Eins. (b) Sei J = {j1 , . . . , jr } ⊆ {1, . . . , m}, j1 < . . . < jr . Definiere die Boole’sche Monomfunktion fJ durch fJ (xm , . . . , x1 ) = xj1 · . . . · xjr (Multiplikation in Z2 ) für (xm , . . . , x1 ) ∈ Zm 2 . (Also fJ (xm , . . . , x1 ) = 1 ⇔ xj1 = . . . = xjr = 1.) Es gibt 2m Boole’sche Monomfunktionen fJ . J = ∅, so fJ = 1. (c) Die Boole’schen Monomfunktionen fJ : Z2m → Z2 sind linear unabhängig über Z2 : P Sei J⊆{1,...,m} cJ fJ = 0. Einsetzen von (0, . . . , 0) liefert: c∅ = 0. Einsetzen von (0, . . . , 0, 1), . . . , (1, 0, . . . , 0) liefert: ci = 0, i = 1, . . . , m. So fortfahrend erhält man cJ = 0 für |J| = 2, 3, . . . , m. (d) Eine Boole’sche Polynomfunktion ist eine Z2 -Linearkombination von m Boole’schen Monomfunktionen. Nach (b), (c) gibt es davon 22 . Nach (a): Jede Boole’sche Funktion ist eine Boole’sche Polynomfunktion. Grad(f ) = maximaler Grad der auftretenden Monome. Grad(0) = −∞. Das Produkt von zwei Boole’schen Polynomfunktionen erhält man durch distributives Ausmultiplizieren. Beachte dabei, dass xi xj = xj xi und x2i = xi (als Funktionen) gilt. 39 Beispiel: f (x3 , x2 , x1 ) = 1 + x2 + x1 x3 + x2 x3 (Summe und Produkt über Z2 ). Dann ist f = (1, 1, 0, 0, 1, 0, 1, 0). [Jedes Polynom in n Variablen x1 , . . . , xn liefert auch eine Funktion e Zm 2 → Z2 ; da aber xi und xi denselben Wert für xi = 1, 0 liefern, braucht man nur Polynome, wo in den Monomen kein xi mit Potenz ≥ 2 auftritt.] 4.2 Bemerkung. Gegeben sei eine Boole’sche Funktion f durch ihren Wertevektor“ f . Wie ” findet man die Darstellung von f als Polynomfunktion? Die Summe entspricht XOR und das Produkt entspricht ∧. Es ist leicht, jede Boole’sche Funktion mit ∧, ∨, − (und, oder, Negation) darzustellen: _ ^ ^ xk . f= xj ∧ {a=(am ,...,a1 )∈Zm 2 :f (a)=1} {j:aj =1} {k:ak =0} Benutze jetzt ·=∧ 1 + g = ḡ f + g + fg = f ∨ g g+g =0 g·g =g g · ḡ = 0 g + ḡ = 1. Beispiel: f = (00011000), d.h. f (011) = 1 = f (100), Rest 0. f = x1 x2 x3 ∨ x1 x2 x3 = x1 x2 (1 + x3 ) ∨ (1 + x1 )(1 + x2 )x3 = x1 x2 (1 + x3 ) + (1 + x1 )(1 + x2 )x3 + x1 x2 (1 + x3 )(1 + x1 )(1 + x2 )x3 {z } | =0 = x1 x2 + x1 x2 x3 + x3 + x1 x3 + x2 x3 + x1 x2 x3 = x1 x2 + x1 x3 + x2 x3 + x3 . 4.3 Definition. Sei 0 ≤ r ≤ m. Definiere den binären Reed-Muller-Code RM(r, m) durch m RM(r, m) = {f ∈ Z22 : f : Zm 2 → Z2 Boole’sche Polynomfunktion vom Grad ≤ r}. 40 Muller,1954, Reed, 1954 (Majority-Logic-Decodierung für RM-Codes) (Reed-Muller-Codes sind sogenannte Auswertungscodes“, denn die Codewörter ” entstehen durch die Auswertung gewisser Funktionen an allen Punkten des Zm 2 .) Per Konstruktion gilt also RM(0, m) ⊆ RM(1, m) ⊆ . . . ⊆ RM(m, m). 4.4 Beispiel. m = 3, r = 2, f (x3 , x2 , x1 ) = x1 + x2 x3 + 1 x3 x2 x1 f 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 , 1 1 d.h. (10101001) ∈ RM(2, 3). 4.5 Satz. Sei 0 ≤ r P ≤ m. Dann Code der Länge 2m , Dimen ist RM(r, m) ein linearer r m m−r . sion k = i=0 i und Minimalabstand d = 2 Beweis. Länge 2m ist klar. Es gibt mi Boole’sche Funktionen vom Grad i. Damit folgt die Behauptung über die Dimension aus 4.1(c). Per Induktion nach m zeigen wir nun d = d (RM(r, m)) = 2√m−r : m = 0 (also auch r = 0): RM(0, = {(0), (1)} und d = 1. 0) m−r Sei m > 0. Es ist wt x1 . . . xr = 2 , also d ≤ 2m−r . Sei f 6= 0 eine Polynomfunktion vom Grad ≤ r. 0 6= f (xm , . . . , x1 ) = g(xm−1 , . . . , x1 ) + xm h(xm−1 , . . . , x1 ). Wir müssen zeigen, dass wt(f ) ≥ 2m−r , d.h. dass mindestens 2m−r Vektoren v ∈ Zm 2 existieren mit f (v) 6= 0. Beachte: Grad(h) ≤ r − 1. Ist h = 0, so ist r ≤ m − 1. Per Induktion ist wt(g) ≥ 2m−r−1 , wobei g als Funktion Z2m−1 → Z2 betrachtet wird. Für jedes a = (am−1 , . . . , a1 ) ∈ Z2m−1 mit g(a) 6= 0 ist dann f (0, a√ m−1 , . . . , a1 ) = f (1, am−1 , . . . , a1 ) 6= 0. Damit ist wt(f) ≥ 2 · 2m−r−1 = 2m−r . Sei h 6= 0. Ist g 6= 0, so existieren per Induktion mindestens 2m−r−1 Vektoren a ∈ Z2m−1 mit g(a) 6= 0. Damit ist auch f (0, a) 6= 0. Ist zusätzlich g + h 6= 0, so existieren mindestens 2m−r−1 Vektoren b ∈ Z2m−1 mit (g + h)(b) 6= 0, also ist f (1, b) 6= 0. √ Dies liefert 2m−r Vektoren v ∈ Zm 2 mit f (v) 6= 0. 41 Ist g = 0, so ist Grad(h) ≤ r−1, und es existieren per Induktion√2(m−1)−(r−1) = 2m−r Vektoren c ∈ Z2m−1 mit h(c) 6= 0, also auch f (1, c) 6= 0. Ist g + h = 0, so ist Grad(g)=Grad(h), also Grad(g) ≤ r − 1. Dann existieren per Induktion 2(m−1)−(r−1) = 2m−r Vektoren w ∈ Z2m−1 mit g(w) 6= 0, also √ f (0, w) 6= 0. 4.6 Beispiele. (a) (1, . . . , 1) ∈ RM(r, m) für alle 0 ≤ r ≤ m, denn (1, . . . , 1) ist der Wert | {z } 2m der Funktion 1. (b) RM(0, m) ist der [2m , 1]-Wiederholungscode {(0, . . . , 0), (1, . . . , 1)}. | {z } | {z } 2m 2m m (c) RM(m, m) = (Z2 )2 (d) C = RM(1, m) ist ein [2m , m + 1]-Code mit d(C) = 2m−1 . Speziell RM(1, 5) ist ein [32, 6]-Code mit d(C) = 16. Er wurde bei den Mariner Expeditionen 6, 7 und 9 zum Mars (1969 - 1972) für die Bildübertragung zur Erde eingesetzt. Die 26 = 64 Codewörter entsprachen der Helligkeit (Grautöne) eines Bildpunktes. Wegen 7 ≤ d(C)−1 = 15 ist RM(1, 5) ein 7 Fehler-korrigierender Code der 2 2 Länge 32. Ein Bild wurde in ein 600 × 600 Gitterpunkte zerlegt und jeder dieser 360.000 Punkte in ein Codewort codiert. 1 m (e) RM(m − 1, m) = {x ∈ (Z2 )2 : wt(x) ist ungerade}. (Das kann man mit der Methode aus dem Beweis von Satz 4.5 beweisen.) Insbesondere haben alle Wörter in jedem RM(r, m), r ≤ m − 1, gerades Gewicht. 4.7 Satz. Für 0 ≤ r ≤ m − 1 ist RM(r, m)⊥ = RM(m − r − 1, m). (Insbesondere ist RM(r, 2r − 1) ein selbstdualer Code der Dimension 22r und der Länge 22r+1 .) 1 vgl. www.jpl.nasa.gov bzw. www.nasa.gov 42 Beweis. Sei f ∈ RM(r, m) und g ∈ RM(m − r − 1, m). Dann ist grad(f · g) ≤ r + m − r − 1 = m − 1 ⇒ f · g ∈ RM(m − 1, m). Nach 4.6(e) hat f · g gerades Gewicht. Sei f = (f (v0 ), . . . , f (v2m −1 )) = (c0 , . . . , c2m −1 ) und g = (g(v0 ), . . . , g(v2m −1 )) = (d0 , . . . , d2m −1 ). Dann hat f · g = (c0 d0 , ..., c2m −1 d2m −1 ) gerades Gewicht. P2m −1 ⇒ f, g = i=0 ci di = 0 (in Z2 ). Also: RM(m − r − 1, m) ⊆ RM(r, m)⊥ . m−r−1 X m . dim(RM(m − r − 1, m)) = i i=0 r X m 3.28 ⊥ m dim(RM(r − m) ) = 2 − i i=0 r m X X m m − = i i i=0 i=0 m m X X m m − = j i j=m−r i=0 m−r−1 X m . = i i=0 Aufgrund der Gleichheit der Dimensionen gilt Gleichheit. 4.8 Bemerkung. Es gibt eine 1-1-Beziehung zwischen Boole’schen Funktionen Zm 2 → Z2 und m Teilmengen des Z2 . Betrachte dazu die beiden injektiven Abbildungen f 7→ Tr(f ) = {x ∈ Zm 2 : f (x) = 1} (Träger von f ) und 1 x∈M M 7→ χM : χM (x) = (charakteristische Funktion von f ). 0 x∈ /M Es gilt χTr(f ) = f und Tr(χM ) = M (inverse Operationen). (Also: Jede Boole’sche Funktion ist von der Form χM .) Frage: Für welche M ⊆ Zm 2 ist χM ∈ RM(r, m)? Eine hinreichende Bedingung liefert der folgende Satz: 4.9 Satz. Sei M ein t-dimensionaler Unterraum von Zm 2 , t ≥ m − r. Dann ist χM ∈ RM(r, m). 43 Beweis. Als t-dimensionaler Unterraum von Zm 2 ist M Lösungsraum eines homogenen LGS in m Unbekannten mit m − t Gleichungen (Koeffizientenmatrix = Kontrollmatrix von M): a1,1 x1 + ... + a1,m xm = 0 .. .. . . am−t,1 x1 + ... + am−t,m xm = 0 Setze pi (x1 , ..., xm ) = ai,1 x1 +...+ai,m xm +1 (Boole’sches Polynom vom Grad 1). m−t Sei p(x1 , ..., xm ) = Πi=1 pi (x1 , ..., xm ). Dann ist p ein Boole’sches Polynom vom Grad m − t ≤ r, d.h. p ∈ RM(r, m). Nun gilt für (y1 , ..., ym ) ∈ Zm 2 : p(y1 , ..., ym ) = 1 ⇔ pi (y1 , ..., ym ) = 1, i = 1, ..., m − t ⇔ ai,1 y1 + ... + ai,m ym = 0 i = 1, ..., m − t ⇔ (y1 , ..., ym ) ∈ M. Also: χM = p ∈ RM(r, m). 4.10 Bemerkung. (a) Ein t-dimensionaler affiner Unterraum des Zm 2 ist eine Nebenklasse eines t-dimensionalen (linearen) Unterraums des Zm 2 . Die Elemente jedes t-dimensionalen affinen Unterraumes des Zm 2 lassen sich als Lösungen eines inhomogenen LGS in m Unbekannten mit m−t Gleichungen beschreiben. Indem man im obigen Beweis die Definition der pi modifiziert (+1 nur, wenn in der entsprechenden Gleichung auf der rechten Seite eine 0 steht), lässt sich genauso zeigen: Ist M ein t-dimensionaler affiner Unterraum des Zm 2 , t ≥ m − r, so ist χM ∈ RM(r, m). (b) Man kann zeigen: m RM(r, m) = hχM ∈ Z22 : M t-dim. affiner UR von Zm 2 , t ≥ m − ri. Beweis: MacWilliams, Sloane, Chapter 13, §6. 4.11 Beispiel. m = 3, r = 1. M = {(000), (101), (011), (110)} (2-dimensionaler Unterraum von Z32 ) χM = (10010110) 44 Kontrollmatrix für M: 1 (a11 , a12 , a13 ) 0 = 0 1 0 (a11 , a12 , a13 ) 1 = 0 1 Es gilt also: a11 + a13 = 0 a12 + a13 = 0 Der Lösungsraum dieses LGS wird erzeugt von (1, 1, 1), also ist (a11 , a12 , a13 ) = (1, 1, 1). 4.9: Für p(x3 , x2 , x1 ) = x1 + x2 + x3 + 1 ist p = χM ∈ RM(1, 3). (Man hätte p natürlich auch mit der Methode von 4.2 aus χM berechnen können.) Für Reed-Muller-Codes gibt es ein effizientes Decodierverfahren (das aber nicht auf Reed-Muller-Codes beschränkt ist): Majority-Logic-Decodierung. Dazu benötigen wir zunächst folgende Definition: 4.12 Definition. Seien y (1) , . . . , y (ℓ) ∈ K n , K ein endlicher Körper, 1 ≤ i1 < i2 < . . . < is ≤ n. y (1) , . . . , y (ℓ) heißen orthogonal bezüglich der Positionen i1 , . . . , is , falls gilt: Tr(y (i) ) ∩ Tr(y (j)) = {i1 , . . . , is } für alle i, j = 1, . . . , ℓ, i 6= j. (Tr(x1 , . . . , xn ) = {i : xi 6= 0}) D.h. (j) (j) (1) yi1 = . . . = yis = 1 für alle j = 1, . . . , ℓ. (j ′ ) (2) Ist a ∈ {1, . . . , n} \ {i1 , . . . , is }, so ist ya 6= 0 für höchstens ein j ′ ∈ {1, . . . , ℓ}. (D.h. außerhalb der Positionen i1 , . . . , is sind die y (j) orthogonal“ zueinander.) ” (Wichtiger Fall: orthogonal bezüglich einer Position) Wir betrachten im Folgenden nur den Fall K = Z2 . Grundlage für die Majority-Logic-Decodierung ist der folgende Satz: 45 4.13 Satz. Sei C ein [n, k]-Code über Z2 , y (1) , . . . , y (ℓ) ∈ Zn2 orthogonal bezüglich der Positionen i1 , . . . , is . Angenommen x ∈ C wird gesendet und z ∈ Zn2 wird empfangen, und es sind maximal t ≤ 12 ℓ Fehler aufgetreten. Dann gilt: Die Anzahl der Fehler in z an den Stellen i1 , . . . , is ist ungerade ⇔ |{j : Anzahl der Fehler an den Positionen von Tr(y (j) ) ist ungerade}| > |{j : Anzahl der Fehler an den Positionen von Tr(y (j)) ist gerade}|. Beweis. Von den t fehlerhaften Positionen in z seien u ≥ 0 innerhalb von i1 , . . . , is , o.B.d.A. i1 , . . . , iu , und t − u außerhalb von i1 , . . . , is . Für jede der t−u fehlerhaften Stellen außerhalb von i1 , . . . , is gibt es maximal ′ ein y (j ) , das an der Stelle Eintrag 6= 0 hat (Bedingung (2) aus 4.12). Also: Mindestens ℓ − (t − u) der y (j) haben an sämtlichen fehlerhaften Stellen außerhalb von i1 , . . . , is eine Null. Seien dies bei geeigneter Nummerierung y (1) , . . . , y (v) , v ≥ ℓ − (t − u). Es ist v ≥ ℓ − t ≥ 2ℓ , da t ≤ 2ℓ . ⇒“: ” Es ist u ungerade, also u ≥ 1. Daher v ≥ ℓ − (t − u) ≥ ℓ − (t − 1) ≥ 2ℓ + 1. Da die fehlerhaften Positionen in Tr(y (j) ) für j = 1, . . . , v sämtlich in i1 , . . . , is liegen, ist die Anzahl der fehlerhaften Positionen dieser Tr(y (j) ) gerade u, also ungerade. Daher: |{j : Anzahl der Fehler an den Positionen von Tr(y (j) ) ist ungerade}| ≥ v ≥ ℓ + 1. Also hat die Mehrzahl der y (j) , j = 1, . . . , ℓ eine ungerade Anzahl von 2 Fehlern an den Positionen ihrer Träger. ⇐“: ” Angenommen, u ist gerade. Dann haben alle y (j) , i = 1, . . . , v, eine gerade Anzahl von Fehlern an den Positionen von Tr(y (j) ). Aus v ≥ 2ℓ folgt somit |{j : Anzahl der Fehler an den Positionen von Tr(y (j)) ist ungerade}| ≤ |{j : Anzahl der Fehler an den Positionen von Tr(y (j)) ist gerade}|. Als Korollar erhalten wir jetzt eine Aussage, falls die Vektoren y (1) , . . . , y (ℓ) aus 4.13 zusätzlich in C ⊥ liegen. 4.14 Korollar. Sei C ein [n, k]-Code über Z2 , y (1) , . . . , y (ℓ) ∈ C ⊥ orthogonal bezüglich der Positionen i1 , . . . , is . Angenommen x ∈ C wird gesendet und z ∈ Zn2 wird empfangen, und es sind maximal t ≤ 21 ℓ Fehler aufgetreten. Dann gilt: 46 Anzahl der Fehler in z an den Stellen i1 , . . . , is ist ungerade ⇔ |{j : y (j), z = 1}| > |{j : y (j) , z = 0}|. Ist s = 1, so lässt sich auf diese Weise feststellen, ob Position i1 in z fehlerhaft ist oder nicht. Diese lässt sich dann korrigieren (K = Z2 ): (Einfache) Majority-Logic-Decodierung (Majoritäts-Decodierung). (Will man alle Positionen korrigieren, so braucht man für jede Position geeignete ℓ Vektoren aus C ⊥ .) Beweis. Wir behaupten, dass gilt: (j) |{j : y , z = 1}| = |{j : Anzahl der Fehler an den Positionen von Tr(y (j)) ist ungerade}|. (j) Für alle j = 1, . . . , ℓ ist y , x = 0, da y (1) , . . . , y (ℓ) ∈ C ⊥ . Sei j ∈ {1, . . . , ℓ}, u die Anzahl der Fehler von z an den Positionen von Tr(y (j)). Dann gilt: (j) y , z = y (j) , z − y (j) , x n n X X (j) (j) yi xi yi zi − = i=1 = X i∈Tr(y (j) ) = X i∈Tr(y (j) ) i=1 (j) yi (zi − xi ) ( 1 u ungerade zi − xi = 0 u gerade (Beachte, dass die Summen in Z2 gebildet werden.) Damit ist die Eingangsbehauptung bewiesen und 4.14 folgt aus 4.13. 4.15 Beispiel. Sei C der [7,3]-Simplex-Code über Z2 (der duale Code zum binären [7,4]Hamming-Code, vgl. 3.29). [Beachte: d(C) = 4, 1-Fehler-korrigierend] Erzeugermatrix von C ⊥ = Erzeugermatrix des Hamming-Codes (=Kontrollmatrix von C ) 1 1 0 1 0 0 0 0 1 1 0 1 0 0 H̃ = 1 0 1 0 0 1 0 (vgl. 3.21(a)) 1 1 1 0 0 0 1 Wähle 47 y (1) = erste Zeile von H̃ = (1101000) (2) y = dritte Zeile von H̃ = (1010010) (3) y = Summe der zweiten und vierten Zeile = (1000101) y (1) , y (2) , y (3) ∈ C ⊥ sind orthogonal bezüglich Position 1. Angenommen z = (0100110) wird empfangen, maximal 1 Fehler sei aufgetreten. hy (1) , zi = 1, hy (2) , zi = 1, hy (3) , zi = 1. Mit 4.14 folgt: Stelle z1 ist fehlerhaft. Decodierung zu x = (1100110). Tatsächlich gilt x ∈ C, da H̃x = 0. Wäre dies nicht der Fall (wenn also mehr als ein Fehler aufgetreten ist), so würde man nicht decodieren. Angenommen z̃ = (0110010) wird empfangen, maximal 1 Fehler sei aufgetreten. hy (1) , zi = 1, hy (2) , zi = 0, hy (3) , zi = 0. 4.14: z1 korrekt. (Über die übrigen Stellen lässt sich mit y (1) , y (2) , y (3) nichts aussagen!) 4.16. Prinzip der mehrstufigen Majority-Logic-Decodierung ⌋ Sei C ein [n, k]-Code über Z2 , d = d(C), t ≤ ⌊ d(C)−1 2 d(C)−1 (im besten Fall t = ⌊ 2 ⌋). Sei x ∈ C gesendet und z ∈ Zn2 empfangen worden. Es seien maximal t Fehler aufgetreten. Sei ℓ = 2t. 48 s-stufige Majority-Logic-Decodierung (der Position i) Position i in z korrekt/fehlerhaft Majoritätsentscheidung i 4.13 Anzahl Fehler von z in Tr(y (i1 ) ) gerade/ungerade Majoritätsentscheidung y (1) ... .............................. 4.13 ... 4.13 orthogonal bzgl. Tr(y (i1 ) ) ... y (i1 ,...,is−2 ) ... ... Anzahl Fehler von z in Tr(y (i1 ,...,is−1 ) ) gerade/ungerade Majoritätsentscheidung orthogonal bzgl. i ... y (i1 ,i2 ) Anzahl Fehler von z in Tr(y (i1 ,...,is−2 ) ) gerade/ungerade Majoritätsentscheidung y (ℓ) y (i1 ) y (i1 ,...,is−2 ,is−1 ) orthogonal bzgl. Tr(y (i1 ,...,is−2 ) ) 4.14 Bilinearformen mit z bilden ... ... y (i1 ,...,is−1 ,1) y (i1 ,...,is−1 ,ℓ) ∈ C ⊥ orthogonal bzgl. Tr(y (i1 ,...,is−1 ) ) Ps−1 j s −1 ℓ = ℓℓ−1 Insgesamt: maximal ℓs Berechnungen von Bilinearformen und j=0 Majoritätsbestimmungen. Dabei muss s so gewählt werden, dass man in der untersten Stufe jeweils genügend viele, nämlich ℓ, orthogonale Vektoren in C ⊥ zur Verfügung hat. [ℓ ist jeweils die Mindestanzahl der benötigten Vektoren; das Verfahren funktioniert auch, wenn in einzelnen Schritten mehr als ℓ orthogonale Vektoren verwendet werden. Das kann von Vorteil sein, wenn man gleichzeitig mehrere Positionen von z korrigieren möchte, wie man bei den Reed-Muller-Codes sehen wird.] 49 Anwendung auf Reed-Muller-Codes: 4.17 Lemma. Sei M ein p-dimensionaler Unterraum des Zm 2 , p < m. m−p Dann gibt es genau 2 − 1 (p + 1)-dimensionale Unterräume von Zm 2 , die M enthalten. Sind M1 und M2 zwei solche Unterräume, M1 6= M2 , so ist M1 ∩ M2 = M. Beweis. |M| = 2p . Für jedes v ∈ Zm 2 \ M ist hM ∪ vi ein (p + 1)-dimensionaler Unterraum, der M enthält. Er enthält 2p+1 − 2p = 2p Vektoren, die nicht in M liegen. Jeder dieser Vektoren spannt mit M also den gleichen (p + 1)dimensionalen Unterraum auf. m p = Wegen |Z2m \ M| = 2m − 2p ist die Anzahl der gesuchten Unterräume 2 2−2 p m−p 2 − 1. Die zweite Aussage folgt aus Dimensionsgründen. 4.18. Mehrstufige Majority-Logic-Decodierung für Reed-Muller-Codes Gegeben: C = RM(r, m), r < m, d(C) = 2m−r , also (2m−r−1 − 1)-Fehlerkorrigierend. m Voraussetzungen: x ∈ RM(r, m) wird gesendet, z ∈ Z22 wird empfangen, maximal t = 2m−r−1 − 1 Fehler seien aufgetreten. (Dann ist ℓ ≥ 2m−r − 2, vgl. 4.16 und Bem. nach 4.16.) 1. Schritt: m−r Sei M ein r-dimensionaler Unterraum von Zm − 1 (r + 1)2 . Dann gibt es 2 m dimensionale Unterräume von Z2 , die M enthalten (4.17). Wähle 2m−r − 2 von diesen, M1 , . . . , M2m−r −2 . Da RM(r, m)⊥ = RM(m − r − 1, m) (4.7) und m − (m − r − 1) = r + 1, ist χMj ∈ RM(r, m)⊥ nach 4.9. E D Bestimme χMj , z , j = 1, . . . , 2m−r − 2. Die χMj sind orthogonal bezüglich Tr(χM ), da Mi ∩ Mj = M. E D Stelle fest, ob die Mehrzahl der χMj , z = 1 ist oder nicht. 4.14: Es ist bekannt, ob die Anzahl der Fehler von z an den Positionen von Tr(χMj ) ungerade oder gerade ist. Führe diese Untersuchung für alle r-dimensionalen Unterräume durch. 2. Schritt: Wähle einen (r − 1)-dimensionalen Unterraum N von Zm 2 . Nach 4.17 gibt es 2m−r+1 − 1 > 2m−r − 2 r-dimensionale Unterräume, die N enthalten. Wähle 2m−r − 2 von diesen, N1 , N2 , . . . N2m−r −2 . 50 Nach dem 1. Schritt ist bekannt, ob an den Positionen von Tr(χNj ) eine ungerade oder eine gerade Anzahl von Fehlern von z vorliegt. 4.13: Stelle durch Majoritätsentscheidung fest, ob an den Positionen von Tr(χNj ) eine ungerade oder eine gerade Anzahl von Fehlern von z vorliegt. Führe dies für alle (r − 1)-dimensionalen Unterräume durch. 3. Schritt: Führe den 2. Schritt für alle (r−2), . . . , 1, 0-dimensionalen Unterräume durch. 0-dimensionaler Fall: {0} = {v0 }. (Anzahl der Fehler ungerade = z0 fehlerhaft.) Wir wissen daher, ob Position z0 fehlerhaft ist oder nicht. Da wir auch wissen, ob die Anzahl der Fehler von z an den Positionen {0, i}, i = 1, . . . , 2m − 1 gerade oder ungerade ist (denn {v0 , vi } ist 1-dimensionaler Unterraum), wissen wir auch, ob zi fehlerhaft ist oder nicht. 4.19 Beispiel (Mehrstufige Majority-Logic-Decodierung von RM(1, 4)). n = 2m = 16, k = 1 + 4 = 5, d = 23 = 8, t = ⌊ d−1 ⌋ = 3 (ℓ = 6) 2 Wir wählen folgende Bezeichnungen für die Elemente des F42 : v0 v1 v2 v3 = (0000) = (0001) = (0010) = (0011) v4 v5 v6 v7 = (0100) v8 = (0101) v9 = (0110) v10 = (0111) v11 = (1000) = (1001) = (1010) = (1011) v12 v13 v14 v15 = (1100) = (1101) = (1110) = (1111) Angenommen, ein Wort x = (x0 , . . . , x15 ) ∈ R(1, 4) wird gesendet und z = (1011010001001010) wird empfangen. Bei der Übertragung seien maximal 3 Fehler aufgetreten. Wir nehmen an, dass maximal drei Fehler aufgetreten sind und wollen z mit Multistep Majority-Logic decodieren. r = 1: Betrachte alle 1-dimensionaen Unterräume, also {v0 , vi }, i = 1, . . . , 15. (Beachte: v0 ist der Nullvektor.) Bestimme, ob die Anzahl der Fehler an den zugehörigen Positionen 0, i gerade oder ungerade ist. Beginne mit {v0 , v1 } =: M. Teste für alle 2-dimensionalen Unterräume Mj ⊇ M, ob hz, χM i gleich 0 j oder 1 ist. Es gibt sieben solcher Unterräume, nämlich M1 M2 M3 M4 = {v0 , v1 , v2 , v3 } M5 = {v0 , v1 , v10 , v11 } = {v0 , v1 , v4 , v5 } M6 = {v0 , v1 , v12 , v13 } = {v0 , v1 , v6 , v7 } M7 = {v0 , v1 , v14 , v15 } = {v0 , v1 , v8 , v9 } Für hz, χM i, i = 1, . . . , 7 gilt: 1 51 j hz, χM i j 1 2 3 4 5 6 7 1 0 1 0 1 0 0 Da die Mehrzahl der Werte von hz, χM i gleich 0 ist, hat z an den Positionen j 0,1 eine gerade Anzahl von Fehlern. Diese Rechnung haben wir jetzt für alle M = {v0 , vi } durchzuführen. Die Ergebnisse für v2 , v3 sind in folgender Tabelle zusammengefasst: M {v0 , v2 } Mj {v0 , v2 , v1 , v3 } {v0 , v2 , v4 , v6 } {v0 , v2 , v5 , v7 } {v0 , v2 , v8 , v10 } {v0 , v2 , v9 , v11 } {v0 , v2 , v12 , v14 } {v0 , v2 , v13 , v15 } {v0 , v3 } {v0 , v3 , v1 , v2 } {v0 , v3 , v4 , v7 } {v0 , v3 , v5 , v6 } {v0 , v3 , v8 , v11 } {v0 , v3 , v9 , v10 } {v0 , v3 , v12 , v15 } {v0 , v3 , v13 , v14 } hz, χM i j 1 0 1 0 1 0 0 1 0 1 0 1 1 1 Anzahl Nullen > Anzahl Einsen Daher: Anzahl der Fehler an den Positionen 0,2 gerade Anzahl Nullen < Anzahl Einsen Daher: Anzahl der Fehler an den Positionen 0,3 ungerade Analog ergeben sich die übrigen Fälle. Man erhält 52 M Position Anzahl der Fehler {v0 , v1 } 0, 1 gerade {v0 , v2 } 0, 2 gerade {v0 , v3 } 0, 3 ungerade {v0 , v4 } 0, 4 gerade {v0 , v5 } 0, 5 gerade {v0 , v6 } 0, 6 gerade {v0 , v7 } 0, 7 ungerade {v0 , v8 } 0, 8 gerade {v0 , v9 } 0, 9 gerade {v0 , v10 } 0, 10 gerade {v0 , v11 } 0, 11 ungerade {v0 , v12 } 0, 12 gerade {v0 , v13 } 0, 13 gerade {v0 , v14 } 0, 14 gerade {v0 , v15 } 0, 15 gerade Die Mehrzahl der Anzahl der Fehler ist also gerade. Daher ist Position 0 von z korrekt. Die Positionen 3,7,11 von z müssen also fehlerhaft sein. z wird daher zum Codewort x = (1010010101011010) decodiert. Bemerkung. Die erste Beschreibung der Majority-Logic-Decodierung stammt von Reed (1954). Es gibt Modifikationen und effizientere Verfahren der Majority-Logic-Decodierung. z.B. -Mehrfachnutzung der y (i1 ,...,ij ) -Weniger Stufen Chen (1971/72): RM(r, m) kann für r ≤ m2 mit 2-stufiger Majority-Logic decodiert werden: Zu jeder Position i gibt es 2m−r −2 r-dimensionale affine Unterräume M1 , . . . , M2m−r −2 mit χMj orthogonal bezüglich i. Zu jedem Mi gibt es 2m−r −2 (r +1)-dimensionale affine Unterräume Nij , j = 1, . . . , 2m−r − 2, mit χNij orthogonal bezüglich Tr(χMi ); χNij ∈ RM(r, m)⊥ . Literatur: Mac Williams, Sloane (Chap. 10) Roman (6.2) van Lint (4.5) Lin, Costello (4.3, 4.4, 8.) 53 5 Expander-Codes und LDPC-Codes 5.1. Vorüberlegung (a) Gegeben sei ein binärer symmetrischer Kanal mit Fehlerwahrscheinlichkeit p. Bei einem Code der Länge n sind dann pro Codewort n · p Fehler zu erwarten. Damit diese korrigierbar sind, sollte der Minimalabstand d des Codes die Bedingung d > 2np + 1 erfüllen. Der sogenannte relative Minimalabstand nd muss daher größer als 2p sein. Wenn man nun nicht nur einen Code betrachtet, sondern eine Familie von (linearen) Codes Ci , i ∈ N, der Länge ni mit dim(Ci+1 ) > dim(Ci ) (z.B. um eine Wahl für die Anzahl der benötigten Codewörter zu haben), so sollten die relativen Minimalabstände ndii durch eine positive Konstante nach unten beschränkt sein, so dass alle Codes für genügend kleine p die erwartete Anzahl von Fehlern pro Codewort korrigieren können. i) Gleichzeitig sollte die Rate dim(C der Codes nicht gegen Null gehen. ni Also: Konstruiere eine Familie von [ni , ki, di ]-Codes, i ∈ N, so dass Konstanten R0 > 0 und M0 > 0 existieren mit nkii ≥ R0 und ndii ≥ M0 . Solche Familien gibt es natürlich nach Shannons Satz (und er besagt sogar noch mehr), aber eine explizite Konstruktion, die nicht auf probabilistischen Argumenten beruht, wurde erst in den 70er Jahren gefunden. Diese sogenannten Expander-Codes sind spezielle LDPC-Codes (Low-Density-Parity-Check-Codes) und besitzen auch schnelle Decodierverfahren. Darauf wollen wir im Folgenden eingehen. (b) Zunächst betracheten wir uns bekannte Familien von Codes, nämlich Hamming-Codes und Reed-Muller-Codes. • Bei (binären) Hamming-Codes ist der Minimalabstand 3, Länge 2ℓ − 1, ℓ ∈ N. Der relative Minimalabstand geht also gegen Null. ℓ Die Rate 2 2−1−ℓ geht dagegen gegen 1. ℓ −1 • Bei Reed-Muller-Codes RM(r, m) ist der relative Minimalabstand 2m−r = 21r . Soll dieser nicht gegen Null gehen, darf r nicht beliebig 2m wachsen. Wir könnten alsoPein festes r wählen und m wachsen m r i=0 ( i ) . Der Zähler ist ein Polynom lassen. Dann ist die Rate 2m in m vom Grad r. Daher geht die Rate mit wachsendem m (und festem r) gegen Null. 54 5.2 Bemerkung. Ist C ein [n, k]-Code, so besitzt C eine (n − k) × n-Kontrollmatrix H vom Rang n − k. Die Zeilen sind also linear unabhängig. (H ist nicht eindeutig bestimmt.) Fügt man weitere Zeilen hinzu, die Linearkombinationen der Zeilen von H sind, so erhält man eine Matrix H̃, für die ebenfalls gilt: x ∈ C ⇔ H̃xt = 0. H̃ ist also eine Kontrollmatrix in einem allgemeineren Sinne. In diesem Kapitel werden wir auch solche allgemeinen Kontrollmatrizen betrachten, deren Rang kleiner als die Anzahl der Zeilen sein kann. Wir werden diese auch als Kontrollmatrizen von C bezeichnen. 5.3 Definition. Sei H = (hi,j )i = 1, . . . , m eine Kontrollmatrix des binären [n, k]-Codes C , also j = 1, . . . , n rg(H) = n − k, m ≥ n − k. Definiere den Tannergraphen Γ(H) zu H (manchmal Γ(C), obwohl er durch C nicht eindeutig bestimmt ist) als bipartiten Graphen mit einer (linken) Eckenmenge L = {x1 , . . . , xn } (Variablen) und einer (rechten) Eckenmenge R = {y1 , . . . , ym } (Nebenbedingungen), und den Kanten (xi , yj ) ∈ V × W , falls hj,i = 1. 5.4 Beispiel. 1 0 0 1 1 0 1 Sei C der [7, 4]-Hamming-Code, H = 0 1 0 1 0 1 1. 0 0 1 0 1 1 1 Dann ist Γ(H) der folgende Graph: 55 L x1 x2 R y1 (= x1 + x4 + x5 + x7 ) x3 Variablen y2 (= x2 + x4 + x6 + x7 ) x4 Nebenbedingungen x5 y3 (= x3 + x5 + x6 + x7 ) x6 x7 Also (x1 , . . . , x7 ) ∈ C ⇔ alle Nebenbedingungen sind 0. 5.5 Bemerkung. Jeder bipartite Graph bestimmt umgekehrt eine Matrix (nämlich seine Inzidenzmatrix, wenn die Zeilen mit R und die Spalten mit L indiziert sind), die als Kontrollmatrix einen Code bestimmt. (Hier benötigt man die allgemeine Definition der Kontrollmatrix.) Wir betracheten spezielle bipartite Graphen: 5.6 Definition. Ein bipartiter Graph mit Eckenmengen L, R heißt • links-ℓ-regulär, falls jede Ecke in L Grad ℓ hat • rechts-r-regulär, falls jede Ecke in R Grad r hat • (ℓ, r)-regulär, falls er links-ℓ-regulär und rechts-r-regulär ist. Der Graph in 5.4 ist rechts 4-regulär, aber nicht beidseitig regulär. 5.7 Bemerkung. Ist Γ ein bipartiter Graph mit |L| = n, |R| = m, so gilt: • Ist Γ links-ℓ-regulär, so ist die Anzahl der Kanten n · ℓ. 56 • Ist Γ rechts-r-regulär, so ist die Anzahl der Kanten m · r. • Ist Γ (ℓ, r)-regulär, so ist n · ℓ = m · r. Beachte: Hat man eine Familie (ℓ, r)-regulärer bipartiter Graphen (ℓ fest) mit wachsendem n (und damit auch wachsendem m), so sind die Kontrollmatrizen immer dünner besetzt: Anzahl aller Einträge: m · n; Anzahl der Einsen = Anzahl der Kanten = m · r = n · ℓ; Verhältnis: nr = mℓ → 0. 5.8 Definition. (a) Ein links-ℓ-regulärer Graph Γ mit den Eckenmengen L, R, |L| = n, |R| = m heißt ein (n, ℓ, α, δ)-Expander, wobei α, δ > 0, falls gilt: Ist ∅ 6= U ⊆ L mit |U| ≤ αn, so ist |∂U| > δ|U|. Dabei bezeichnet ∂U die Nachbarschaft von U. d.h. ∂U = {y ∈ R : ∃x ∈ U, (x, y) ist Kante in Γ}. Man nennt δ den Ausdehnungsfaktor des Expanders (bezüglich Teilmengen der Größe ≤ αn in L). (b) Ist Γ (ℓ, r)-regulär und erfüllt (a), so spricht man von einem (n, ℓ, r, α, δ)Expander. (c) Ein binärer linearer Code, der eine Kontrollmatrix besitzt, die durch einen Expander definiert wird, wird Expander-Code C(Γ) genannt. 5.9 Bemerkung. Bezeichnungen wie in 5.8(a), αn ≥ 1. (a) δ < ℓ ℓ ℓ (b) Ist 0 < ε < αn , so kann man stets δ = αn − ε wählen. (Man möchte zu gegebenem α natürlich δ möglichst groß wählen.) Beweis. (a) Ist |U| = 1, so |∂U| = ℓ, also δ < (b) Für alle U 6= ∅ ist |∂U| ≥ ℓ. | ℓ Ist also |U| ≤ αn, so |∂U ≥ αn > |U | |∂U | |U | ℓ αn = ℓ. − ε. 5.10 Beispiel. (nach Willems, Codierungstheorie und Kryptographie) Wir geben ein Beispiel für einen (9, 2, 3, 29 , δ)-Expander an, wobei man für δ jede positive reelle Zahl < 32 wählen kann. (Beachte: Es gilt dann m = n·ℓ = 9·2 = 6.) r 3 57 Γ x1 x2 y1 (= x1 + x2 + x3 ) x3 y2 (= x4 + x5 + x6 ) x4 y3 (= x7 + x8 + x9 ) x5 y4 (= x1 + x4 + x7 ) x6 y5 (= x2 + x5 + x8 ) x7 y6 (= x3 + x6 + x9 ) x8 x9 Klar: Γ ist (2, 3)-regulär. α = 29 . D.h. wir haben Eckenmengen U mit |U| = 1, 2 zu betrachten. |U| = 1 ⇒ |∂U| = 2 | = 32 . |U| = 2 ⇒ |∂U| = 3 oder 4. Also min|U |≤2 |∂U |U | ℓ Jedes 0 < δ < 23 ist also wählbar. (Beachte: αn = 1.) 5.11 Lemma. Sei Γ ein (n, ℓ, α, δ)-Expander mit δ ≥ 2ℓ . Sei ∅ 6= U ⊆ L, |U| ≤ αn. Dann existiert ein y ∈ ∂U, in dem genau eine Kante aus U endet (d.h. |∂(y) ∩ U| = 1 für ∂(y) := {x ∈ L : (x, y) ist Kante}). Beweis. In U beginnen ℓ|U| Kanten. Expander-Eigenschaft: Diese Kanten enden in |∂U| > δ|U| ≥ 2ℓ Ecken in R. In jeder dieser Ecken können nicht 2 oder mehr Kanten aus U enden, denn sonst würden die ℓ|U| Kanten aus U in höchstens 2ℓ |U| Ecken enden. Also existiert mindestens eine Ecke in ∂U, in der weniger als 2, also genau eine Kante aus U endet. 58 5.12 Satz (Sipser, Spielman; 1996). (a) Sei Γ ein (n, ℓ, α, δ)-Expander mit δ ≥ 2ℓ . Dann hat der zugehörige Expander-Code C(Γ) Minimalabstand d > αn. (Also relativen Minimalabstand > α) (b) Ist Γ ein (n, ℓ, r, α, δ)-Expander, so hat C(Γ) Rate R ≥ 1 − rℓ . Beweis. (a) Angenommen d = d(C(Γ)) ≤ αn. Dann existiert ein 0 6= v ∈ C(Γ) mit wt(v) ≤ αn. Sei U die Menge der xi , die in v mit dem Wert 1 vorkommen (entspricht Tr(v)). Dann ist |U| = wt(v) ≤ αn. Nach 5.11 existiert eine Nebenbedingung in ∂U, die mit genau einer Variablen aus U verbunden ist. Für diese Nebenbedingung hat v den Wert 1, also v ∈ / C(Γ). Widerspruch. Gleichungen beschrieben, d.h. der Rang n − k (b) C(Γ) wird durch m = n·ℓ r der Kontrollmatrix ist höchstens n·ℓ , also k ≥ n − n·ℓ (k = dim(C(Γ))). r r k ℓ Dann R = n ≥ 1 − r 5.13 Beispiel. Wir betrachten wieder das Beispiel 5.10. Aus 5.12 folgt, dass die Rate von C(Γ) ≥ 1 − 23 = 13 ist. Also ist dim(C(Γ)) ≥ 3. Außerdem besagt 5.12, dass der Minimalabstand > αn = 2 ist, also d(C(Γ)) ≥ 3. Man kann nachrechnen, dass die Kontrollmatrix zu Γ Rang 5 hat, also dim(C(Γ)) = 9 − 5 = 4. Ferner kann man zeigen, dass d(C(Γ)) = 4 gilt. 5.14. Iterative Decodierung (Flipping Algorithmus, Gallager, 1962) Sei C = C(Γ) ein Expander-Code zum (n, ℓ, α, δ)-Expander Γ. Ist z = (z1 , . . . , zn ) ∈ Zn2 , so sagen wir, dass eine Nebenbedingung für z erfüllt ist, falls sie für z den Wert 0 hat. Ansonsten nennen wir sie inkorrekt. Algorithmus: Sei z ∈ Zn2 das empfangene Wort. Schritt 1: Berechne alle Nebenbedingungen für z. Schritt 2: Suche eine Variable xi , die in mehr inkorrekten Nebenbedingungen vorkommt als in korrekten. Gibt es keine solche Variable, so stop. Schritt 3: Ändere den Wert dieser Variablen in z. Schritt 4: Gehe zu Schritt 1. 59 5.15 Beispiel. Betrachte den Expander-Code C aus Beispiel 5.10. Sei z = (110111011) empfangen worden. Nebenbedingungen für z: y1 y2 y3 y4 y5 y6 =0 =1 =0 =0 =1 =0 x5 kommt nur in inkorrekten Nebenbedingungen vor, nicht in korrekten. Ändere x5 von 1 zu 0. Das liefert das Wort (110101011). Jetzt sind alle Nebenbedingungen = 0. Das Wort liegt also in C . Da C 1-Fehler-korrigierend ist (5.13), wurde korrekt decodiert, falls genau ein Fehler aufgetreten ist. Frage: Wann decodiert der Flipping-Algorithmus korrekt? 5.16 Satz (Sipser, Spielman; 1996). Sei C(Γ) ein Expander-Code zum (n, ℓ, α, δ)-Expander Γ. Ist δ ≥ 43 ℓ, so decodiert der Flipping-Algorithmus 5.14 korrekt, falls maximal ⌊ αn ⌋ Fehler aufgetreten sind. 2 Beweis. ⌋ Stellen Sei z = (z1 , . . . , zn ) ∈ Zn2 ein Wort, welches sich an höchstens ⌊ αn 2 von einem x ∈ C unterscheidet (beachte: x ist nach 5.12 eindeutig bestimmt, da d(C) > αn). Wir nennen die Variablen, in denen sich z von x unterscheidet schlecht, die anderen gut. Zu Beginn der i-ten Iteration, i = 1, 2, . . ., sei ti fi ki = = = Anzahl der schlechten Variablen Anzahl der inkorrekten Nebenbedingungen Anzahl der korrekten Nebenbedingungen, in denen schlechte Variablen vorkommen. Beachte: t1 ≤ ⌊ αn ⌋. 2 Ist t1 = 0, so ist z korrekt und der Algorithmus terminiert. Angenommen, zu Beginn der i-ten Iteration ist ti ≤ αn = α|L| und ti 6= 0. Die Menge Ui 6= ∅ der schlechten Variablen hat mehr als δti Nachbarn (Expandereigenschaft, ti ≤ αn). 60 Jede dieser Nebenbedingungen ist entweder inkorrekt oder korrekt mit schlechten Variablen. Also: 3 ℓti ≤ δti < |∂Ui | = fi + ki . (1) 4 In einer korrekten Nebenbedingung, die schlechte Variablen enthält, müssen mindestens 2 schlechte Variablen vorkommen, in einer inkorrekten Nebenbedingung mindestens eine. Also: ℓti ≥ fi + 2ki. (2) ∂Ui Ui fi + ki ti In jeder korrekten Nebenbedingung in ∂Ui enden mindestens zwei Kanten; in jeder inkorrekten mindestens eine. ℓti Kanten (1) und (2) liefern: 3 1 1 (1) ℓti ≥ fi + ki + ki > ℓti + ki ⇒ ki < ℓti ⇒ fi > ℓti 4 4 2 (3) Dies besagt, dass eine schlechte Variable existiert, für die mehr als die Hälfte der Kanten in inkorrekten Nebenbedingungen landet. In Schritt 2 des Algorithmus wird also eine Variable gefunden (nicht notwendig eine schlechte), die in mehr inkorrekten als korrekten Nebenbedingungen auftritt. Flippen dieser Variablen verringert den Wert von fi , d.h. fi+1 < fi . Wir zeigen jetzt, dass auch weiterhin ti+1 ≤ αn gilt. Beachte: ti+1 = ti ± 1 (Nur eine Stelle wird verändert). Ist ti+1 = t1 − 1, so ist ti+1 ≤ αn erfüllt. Sei also ti+1 = t1 + 1. Angenommen, ti + 1 > αn ≥ ti , d.h. ⌊αn⌋ = ti . (∗) (2) V or. (∗) (3) = ℓt2i < fi . Widerspruch. ⌋ ≤ ℓ ⌊αn⌋ Beachte: fi ≤ f1 ≤ ℓt1 ≤ ℓ⌊ αn 2 2 Also gilt auch ti+1 ≤ αn. Da fi+1 < fi für alle i, terminiert der Algorithmus (und zwar in einem Codewort). 61 5.17 Bemerkung. (a) Der Algorithmus in 5.14 erfordert maximal m Iterationsschritte, da f1 ≤ m und fi+1 < fi für alle i. Zu jedem Iterationsschritt werden m Bilinearformen (Nebenbedingungen) berechnet und maximal n · m Vergleiche durchgeführt. (b) Das iterative Decodierverfahren aus 5.14 ist ein BDD (vergleiche 2.18 ⌋ (b)) nach 5.16. Er decodiert garantiert korrekt, wenn maximal ⌊ αn 2 d−1 Fehler aufgetreten sind. Diese Zahl kann kleiner als ⌊ 2 ⌋ sein (vergleiche Beispiel 5.13, dort αn = 2, d = 4; dennoch gilt hier ⌊ αn ⌋ = ⌊ d−1 ⌋= 2 2 1.) (c) Die Bedingung δ ≥ 43 ℓ aus 5.14 ist bei unserem Beispiel 5.15 (Code aus 5.10) nicht erfüllt. Dort ist δ < 23 = 34 · 2. Dennoch wird in 5.15 korrekt decodiert. (d) Die Bedingung in Schritt 2 des Algorithmus 5.14, wann zi geändert wird, ist äquivalent zu der Bedingung wt H(z + ei )t < wt Hz t | {z } | {z } Anzahl der inkorrekten Nebenbed. in z + ei Anzahl der inkorrekten Nebenbed. in z (e) Der Algorithmus 5.14 ist ein Spezialfall von Verfahren, die man BeliefPropagation-Algorithmus nennt (sie spielen auch in KI und anderen Bereichen eine wichtige Rolle): In jedem Iterationsschritt wird derjenige Eintrag geändert, von dem man am stärksten glaubt, dass er falsch ist. 5.18 Bemerkung. (a) Nach 5.12 und 5.14 benötigt man Familien von Expander-Codes mit großem δ (δ ≥ 34 ℓ), damit das Decodierverfahren funktioniert, und nicht zu kleinem α, damit möglichst viele Fehler korrigiert werden können. Es gibt Möglichkeiten solche Codes mit nach unten beschränktem α und wachsendem n zu konstruieren. Sie stammen z.B. von Margulis (1982), Lubotzky, Phillips, Sarnak (1988), u.a. Die Beschreibung ist relativ einfach, aber der Nachweis der ExpanderEigenschaft kompliziert. (b) Der Decodier-Algorithmus 5.14 ist umso schneller, je kleiner ℓ ist, denn dann hat man nur zu kontrollieren, ob eine der in den inkorrekten Nebenbedingungen auftretenden Variablen dort mehr als 2ℓ mal auftaucht. 62 Also sind Familien von Expander-Codes mit wachsendem n und konstantem ℓ gut. Das ist bei obiger Familie der Fall. Dann: Das Verhältnis von Einsen in der Konrollmatrix zu allen Einträgen n·ℓ = nℓ geht für n → ∞ gegen 0. n2 Dünn besetzte Kontrollmatrix: LDPC-Codes. Dies ist ein echter Hinweis auf die Nützlichkeit von LDPC-Codes für die Decodiergeschwindigkeit. Gallager (1962) hat dies als erster entdeckt; auf ihn gehen MessagePassing-Algorithmen für LDPC-Codes zurück, die wir aber hier nicht behandeln werden. Literatur: Lin, Costello, Error Control Coding (Kap. 17) (LDPC) Willems, Codierungstheorie und Kryptographie (Kap. 4) T. Richardson, R. Urbanke, Modern Coding Theory (Kap. 8) (viel über LDPC-Codes) Übersichtsartikel über Expander-Graphen: S. Hoory, N. Linial, A. Wigderson, Bulletin American Math. Society 43, 2006, 439-561 63 6 Zyklische Codes 6.1 Definition. Ein linearer Code C der Länge n über einem endlichen Körper K heißt zyklisch, falls gilt: (c0 , . . . , cn−1 ) ∈ C ⇒ σ(c0 , . . . , cn−1 ) := (cn−1 , c0 , c1 , . . . , cn−2 ) ∈ C. (Dann auch σ i (c0 , . . . , cn−1 ) = (cn−i , . . . , cn−1 , c0 , . . . , cn−1−i) ∈ C.) 6.2 Beispiele. (a) Sei C der 1 H= 0 0 1 0 G= 1 1 [7, 4]-Hamming-Codes über Z2 mit der Kontrollmatrix 0 0 1 0 1 1 1 0 1 1 0 1 und der Erzeugermatrix 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 0 . 0 1 0 0 1 0 1 1 0 0 0 1 C ist nicht zyklisch: (0110100) ∈ C (2. Zeile von G). Angenommen, x = (0011010) ∈ C. y = (1010010) ∈ C (3. Zeile von G). Aber: d(x, y) = 2. Das steht im Widerspruch zu d(C) = 3. (b) Man nennt zwei binäre Codes C1 , C2 äquivalent, wenn C2 aus C1 durch eine Permutation der Positionen hervorgeht (entspricht einer Permutation der Spalten der Erzeugermatrix). [Alle Parameter eines Codes bleiben bei Äquivalenz erhalten.] Tatsächlich gibt es zu jedem binären Hamming-Code einen äquivalenten Code, der zyklisch ist. Im obigen Beispiel: 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 0 H̃ = 0 1 0 1 1 1 0 G̃ = 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 Zyklische Zyklische Zyklische Zyklische Vertauschung Vertauschung Vertauschung Vertauschung von von von von Zeile Zeile Zeile Zeile 64 1 2 3 4 von von von von G̃ G̃ G̃ G̃ = = = = Zeile Zeile Zeile Zeile 2 1 + Zeile 4 1 1 + Zeile 3 (Das gilt für jeden Hamming-Code; bei |K| > 2 muss der Äquivalenzbegriff erweitert werden: Die Spalten der Erzeugermatrix dürfen auch mit Skalaren 6= 0 multipliziert werden.) Erste gute Eigenschaft zyklischer Codes: 6.3 Bemerkung. Sei C ein zyklischer Code. (a) C ⊥ ist zyklisch. (b) Sind y (1) , . . . , y (ℓ) ∈ C ⊥ orthogonal bezüglich Position i, so sind σ(y (1) ), . . . , σ(y (ℓ) ) ∈ C ⊥ orthogonal bezüglich i + 1 (mod n). (Positionen 0, . . . , n − 1) Beweis. (a) y = (y0 , . . . , yn−1 ) ∈ C ⊥ , (c0 , . . . , cn−1) ∈ C. Dann σ n−1 (c) = (c1 , . . . , cn−1 , c0 ) ∈ C. 0 = hσ n−1 (c), yi = c1 y0 + . . . + cn−1 yn−2 + c0 yn−1 = hc, σ(y)i ⇒ σ(y) ∈ C ⊥ . (b) folgt aus (a). Zyklische Codes lassen sich besonders gut beschreiben, wenn man Polynomdarstellung verwendet. Betrachte dazu den Vektorraumisomorphismus K n → K[x]n = {f ∈ K[x] : grad(f ) < n} n−1 X ai xi . a = (a0 , . . . , an−1 ) 7→ a(x) = i=0 6.4 Bemerkung. (a) Zur Erinnerung: In K[x] hat man Division mit Rest. Seien f, g ∈ K[x], g 6= 0. Dann gibt es eindeutig bestimmte r, h ∈ K[x] mit grad(r) < grad(g) so dass f = h · g + r gilt. Schreibe dann r = f mod g. Beispiel: K = Z2 . Bestimme x4 + x3 + 1 mod x2 + 1. 65 x4 + x3 + 1 : x2 + 1 = x2 + x + 1 x4 + x2 x3 + x2 + 1 x3 + x x2 + x + 1 x2 + 1 x Daher ist x4 + x3 + 1 mod x2 + 1 = x. Es gilt: f1 +· f2 mod g = (f1 mod g +· f2 mod g) mod g. Pn−1 (b) a = (a0 , . . . , an−1 ) ∈ K n ↔ a(x) = i=0 ai xi Dann: σ(a) = (an−1 , a0 , . . . , an−2 ) ↔ x · a(x) mod xn − 1. Beweis. x·a(x) = a0 x+. . .+an−1 xn = an−1 +a0 x+. . .+an−2 xn−1 +an−1 (xn −1) Also: x · a(x) mod xn − 1 = an−1 + a0 x + . . . + an−2 xn−1 ↔ σ(a). (modulo xn − 1 Rechnen bedeutet: Ersetze xn durch 1.) 6.5 Satz. Sei C ein Code der Länge n über K. Sei C˜ = {c(x) : c ∈ C} ⊆ K[x]n (entsprechend obiger Bemerkung). Dann gilt: ˜ C ist zyklisch ⇔ f (x)c(x) mod xn − 1 ∈ C˜ für alle f (x) ∈ K[x], c(x) ∈ C. Beweis. ⇐“: ” ˜ Daher gilt σ(c) ∈ C Insbesondere gilt x·c(x) mod xn −1 ∈ C˜ für alle c(x) ∈ C. für alle c ∈ C nach 6.4.(b). C ist also zyklisch. ⇒“: ” 6.4(b): x · c(x) mod xn − 1 ∈ C˜ für alle c(x) ∈ C˜ ⇒ xi · c(x) mod xn − 1 ∈ C˜ für alle c(x) ∈ C˜ ⇒ Behauptung, da C linear. Sei C = 6 {0} ein zyklischer Code der Länge n. Wähle in C˜ ein normiertes Polynom g(x) 6= 0 von minimalem Grad. Angenommen es gibt ein weiteres normiertes g1 (x) ∈ C˜ mit grad(g1 ) = ˜ grad(g − g1 ) < grad(g), also g − g1 = 0, grad(g). Dann ist g(x) − g1 (x) ∈ C, g = g1 . g ist also eindeutig bestimmt. Wir behaupten, dass g ein Teiler von xn − 1 ist. xn − 1 = h(x)g(x) + r(x), grad(r(x)) < grad(g(x)) 66 h(x)g(x) mod xn − 1 = −r(x) mod (xn − 1) = −r(x) ˜ Ist r(x) 6= 0, so ergibt sich ein Widerspruch zur Nach 6.5 folgt r(x) ∈ C. Wahl von g. Also: xn − 1 = g(x)h(x). h(x) ist normiert und eindeutig bestimmt. Damit haben wir die ersten beiden Teile des folgenden Satzes bewiesen: 6.6 Satz. Sei C ein zyklischer Code der Länge n über K. Sei 0 6= g(x) ∈ C˜ normiert ˜ Sei grad(g(x)) = ℓ (also ℓ < n). und von minimalem Grad in C. (a) g(x) ist eindeutig bestimmt (b) xn −1 = g(x)h(x), h(x) ist normiert und eindeutig bestimmt, grad(h(x)) = n−ℓ (c) C˜ = {f (x)g(x) : f (x) ∈ K[x], grad(f (x)) < n − ℓ} ˜ = n − ℓ, d.h. grad (g(x)) = n − k, k = dim(C). (d) dim(C) = dim(C) (e) c(x) ∈ Ce ⇔ c(x) · h(x) = 0 mod xn − 1 Beweis. (a),(b) siehe oben (c) Nach 6.5 gilt ⊇“, da grad(f (x) · g(x)) < n. ” ˜ Division mit Rest: c(x) = k(x) · g(x) + r(x), Sei 0 6= c(x) ∈ C. grad(r(x)) < grad(g(x)) = ℓ. r(x) = c(x) − k(x) · g(x) ∈ C˜ =⇒ r(x) = 0. | {z } Wahl von g grad(c(x)) ≤ n − 1, also ∈ C̃ nach 6.5 grad(k(x))+grad(g(x)) = grad(c(x)) ≤ n−1 ⇒ grad(k(x)) ≤ n−ℓ−1. Also gilt auch ⊆“. ” ˜ Die (d) Wegen (c) ist g(x), x · g(x), . . . , xn−ℓ−1 · g(x) eine Basis von C. Behauptung folgt. (e) Folgt aus xn − 1 = g(x) · h(x) und c(x) ∈ C ⇔ g(x)|c(x). 6.7 Definition. Sei C = 6 {0} ein zyklischer Code. Dann heißen die eindeutig bestimmten normierten Polynome g(x), h(x) aus 6.6 Erzeugerpolynom (Generatorpolynom) bzw. Kontrollpolynom von C . 67 6.8 Satz. Pn−k gi xi das ErzeugerpolySei C = 6 {0} ein zyklischer [n, k]-Code, g(x) = i=0 Pk nom und h(x) = i=0 hi xi das Kontrollpolynom von C . (a) Die k × n-Matrix g0 g1 . . . gn−k 0 g0 . . . . . . gn−k 0 G = .. .. .. . . . 0 ... 0 g0 . . . . . . gn−k ist eine Erzeugermatrix von C . (gn−k = 1) (b) Die (n − k) × n-Matrix hk hk−1 . . . h0 0 hk . . . . . . h0 0 H = .. .. .. . . . 0 ... 0 hk . . . . . . h0 ist eine Kontrollmatrix von C . (hk = 1) Beweis. (a) folgt aus 6.6 (d). Pn Pn−k i (b) x − 1 = g(x) · h(x) = i=0 j=0 gi hi−j x (alle nicht definierten Koeffizienten gleich 0 setzen) Koeffizientenvergleich liefert: Pn−k (∗) j=0 gi hi−j = 0 für i = 1, . . . , n − 1 n (∗∗) g0 h0 = −1 (∗) bedeutet gerade GH t = 0. Wegen (∗∗) ist rg(H) = n − k. Also ist H Kontrollmatrix von C . 68 6.9 Bemerkung. Sei C = 6 {0} ein zyklischer [n, k]-Code über K. Nach 3.28 (c) ist H aus 6.8 (b) eine Erzeugermatrix von C ⊥ , C ⊥ ist zyklisch nach 6.3 (a). Dann ist auch h−1 0 H ⊥ ⊥ eine Erzeugermatrix von C und das Erzeugerpolynom von C ist gerade h1 k−1 hk−1 hk 1 k −1 k . x + x + ...+ x+ = h0 x h h0 h0 h0 x | {z } =: duales Poynom zu h 6.10 Korollar. Es gibt genauso viele zyklische Codes der Länge n über K wie es (normierte) Teiler von xn − 1 gibt. Beweis. Ist C zyklisch, so gehört zu C nach 6.6 ein eindeutig bestimmtes Erzeugerpolynom g(x), g(x)|xn − 1. Umgekehrt kann man zu jedem Teiler g(x) von xn − 1 den Code Ce = {f (x) · g(x) : f (x) ∈ K[x], grad(f (x)) < n − grad(g(x))} bilden. Dies ist ein zyklischer Code mit Erzeugerpolynom g(x). (Ist C = {0}, so ist g(x) = xn − 1.) 6.11 Beispiel. n = 4, K = Z2 . Es gibt die folgenden zyklischen Codes der Länge 4 über Z2 : Teiler von x4 − 1 = (x − 1)4 in K[x] zugehöriger zyklischer Code 1 C1 = Z42 1 1 0 0 Erzeugermatrix 0 1 1 0, 0 0 1 1 dim C2 = 3 (Parity-Check-Code) (x − 1) 2 2 (x − 1) = x − 1 Erzeugermatrix dim C3 = 2 1 0 1 0 , 0 1 0 1 (x − 1)3 = x3 + x2 + x + 1 Erzeugermatrix (1111), dim C4 = 1 (x − 1)4 = x4 − 1 C5 = {0} 69 6.12 Definition. (a) Ein Vektor v = (0, . . . , 0, vi , . . . , vi+b−1 , 0, . . . , 0) ∈ K n mit vi 6= 0, vi+b−1 6= 0 heißt Bündel der Länge b. (Beachte: Nicht alle vj , 2 ≤ j ≤ i + b − 2, müssen 6= 0 sein.) (b) Sei C ein Code über K, x ∈ C gesendet und z ∈ K n empfangen. Sei z = x+f , wobei f ein Bündel der Länge b ist (Fehlerbündel), so spricht man von einem Bündelfehler der Länge b. (Beachte: Bei einem Bündelfehler der Länge b können auch weniger als b Fehler aufgetreten sein.) 6.13 Satz. Sei C ein zyklischer [n, k]-Code. Dann enthält C keine Bündel der Länge ≤ n − k. Insbesondere entdeckt ein zyklischer [n, k]-Code Fehlerbündel der Länge ≤ n − k. Beweis. Angenommen (0, . . . , 0, vi, . . . , vi+b−1 , 0, . . . , 0) ∈ C, vi , vi+b−1 6= 0, b ≤ n − k. Dann ist auch v = (vi , . . . , vi+b−1 , 0, . . . , 0) ∈ C. | {z } ≥k Die b-te Zeile der Kontrollmatrix aus 6.8 (b) ist h = (0, . . . , 0, hk , . . . , h0 , 0, . . . , 0) (b − 1 + (k + 1) ≤ n) | {z } | {z } b−1 k+1 hv t = hk · vi+b−1 6= 0, also Hv t 6= 0. Widerspruch. Ist z = x + f , f Fehlerbündel der Länge ≤ n − k, so gilt Hz t = Hf t 6= 0, da f∈ / C. 6.14 Bemerkung. Für einen linearen [n, k, d]-Code gilt nach 3.14 (Singleton-Schranke) d − 1 ≤ n − k. Also kann ein linearer Code maximal n − k Fehler erkennen (Schranke wird für MDS-Codes angenommen). Demgegenüber erkennt jeder zyklische Code Fehlerbündel der Länge n − k, gleichgültig, wie groß d ist. 70 Die Erzeugermatrix G aus 6.8 (b) ist nicht in Standardform. Bildet man Codewörter durch uG, u ∈ K k , so lässt sich u aus uG nicht direkt ablesen. Es gibt eine andere Form der Codierung bei zyklischen Codes, wo das möglich ist. 6.15. CRC-Codierung (CRC=Cyclic Redundancy Check) Sei C ein zyklischer [n, k]-Code über K mit Erzeugerpolynom vom Grad n−k. Infoblöcke der Länge k (über K) werden als Polynome vom Grad ≤ k − 1 geschrieben: k−1 X m = m0 . . . mk−1 ↔ m(x) = mi xi i=0 xn−k m(x) ↔ (0, . . . , 0, m0 , . . . , mk−1 ) | {z } n−k Codiere m(x) in c(x) = xn−k m(x) − xn−k m(x) mod g(x) (das ist ein Vielfaches von g(x)). Also: c(x) ∈ C nach 6.6 (c). Ist xn−k m(x) mod g(x) = b0 + b1 x + . . . + bn−k−1 xn−k−1 , so c(x) ↔ (−b0 , −b1 , . . . , −bn−k−1 , m0 , . . . , mk ). | {z } | {z } Infosymbole Kontrollsymbole Beispiel: n = 4, k = 3, g(x) = x + 1 m = (m0 , m1 , m2 ) = (1, 1, 1) ↔ m(x) = x2 + x + 1 xm(x) = x3 + x2 + x x3 + x2 + x : x + 1 = x2 + 1 x3 + x2 x x+1 1 xm(x) mod g(x) = 1 c(x) = 1 + x + x2 + x3 ↔ (1, 1, 1, 1) 1 1 0 0 Beachte: Erzeugermatrix nach 6.8 (b): G = 0 1 1 0, mG = (1001). 0 0 1 1 Erhält der Empfänger das Wort v bzw. v(x) mit g(x) ∤ v(x), so sind nach 6.6 (c) Fehler aufgetreten. Ist kein Fehler aufgetreten, so kann er die Nachricht direkt an den letzten k Symbolen ablesen. Die Berechnung von xn−k m(x) mod g(x) geht sehr schnell, z.B. mit linearen Schieberegistern. 71 CRC-Codierung wird in Computer-Netzen verwendet, wenn es nur auf Fehlererkennung ankommt (ARQ-Verfahren). Dort werden häufig Polynome der Form g(x) = (x + 1)p(x), p(x) 6= x irreduzibel, verwendet. Z.B. g(x) = x16 + x12 + x5 + 1 oder g(x) = x16 + x15 + x2 + 1 | {z } {z } | CRC−CCIT T −P olynom CRC−16−P olynom (CCITT=Comité Consultativ International de Télégraphique et Téléphonique; Vorläufer von ITU) Mit solchen Erzeugerpolynomen werden neben Fehlerbündeln der Länge ≤ grad(g(x)) (6.13) auch eine ungerade Anzahl von Fehlern erkannt und häufig auch 2 Fehler. 72 7 Reed-Solomon-Codes 7.1 Definition (Allgemeine Reed-Solomon-Codes). Sei K ein Körper, |K| = q, 1 ≤ d ≤ n ≤ q. Wähle M = {a1 , . . . , an } ⊆ K, |M| = n (d.h. ai 6= aj für i 6= j). Setze C = CM = {f (a1 ), . . . , f (an ) : f ∈ K[x]n−d+1 } ⊆ K n , wobei K[x]n−d+1 = {g ∈ K[x] : grad(g) ≤ n − d}. C heißt Allgemeiner Reed-Solomon-Code. (C ist ein Auswertungscode.) 7.2 Satz. Verwende die Bezeichnungen aus 7.1 und setze k = n − d + 1. (a) C ist ein [n, k]-Code mit d(C) = d, also ein MDS-Code. 1 ... 1 a1 . . . an (b) G = .. .. ist Erzeugermatrix von C. . . k−1 k−1 a1 . . . an Beweis. ( K[x] → C . (a) Sei α : f 7→ (f (a1 ), . . . , f (an )) α ist eine surjektive K-lineare Abbildung. Angenommen f ∈ Kern(α), d.h. f (a1 ) = . . . = f (an ) = 0. Da grad(f ) ≤ k − 1 < n, kann f aber nicht n verschiedene Nullstellen haben, falls f 6= 0. Damit ist f = 0. Also ist f bijektiv. Daher gilt dim C = dim K[x]k = k. Jedes f 6= 0, f ∈ K[X]k , hat höchstens k − 1 Nullstellen in K, also sind in jedem Codewort 6= 0 mindestens n − (k − 1) = d Einträge 6= 0. Nach der Singleton-Schranke (3.14): d(C) ≤ n − k + 1 = d. Es gilt also Gleichheit. (b) 1, x, . . . , xk−1 ist eine Basis von K[x]k . Daher ist α(1) , . . . , α(xk−1) | {z } |{z} 1. Zeile von G eine Basis von C. Wir betrachten nun einen Spezialfall von 7.1. Dazu: 73 k. Zeile von G 7.3 Bemerkung. Sei K ein endlicher Körper, |K| = q. Dann ist die multiplikative Gruppe K ∗ = K \ {0} zyklisch, d,h, es existiert ein α ∈ K ∗ mit K ∗ = {α0 = 1, α1 , α2 , . . . , αq−2} (αq−1 = 1). Die Potenzen von α werden durch die Multiplikation in K gebildet. 7.4 Definition. Sei K ein endlicher Körper, |K| = q, q ≥ 3, n = q − 1. Sei d ∈ N mit 2 ≤ d ≤ n − 1. Setze M = K ∗ = {α0 , α1, . . . , αq−2 } (geordnet). Dann heißt CM = { f (α0 ), . . . , f (αq−2) : f ∈ K[x]n−d+1 = K[x]q−d } Reed-Solomon-Code RSq (d). (d = 1, d = n liefern triviale Codes; daher werden sie hier ausgeschlossen.) 7.5 Satz. C = RSq (d) ist ein zyklischer [n, n − d + 1]-Code mit d(C) = d. g(x) = (x − α) Q · . . . · (x − αd−1 ) ist das Erzeugerpolynom und n−1 (x − αj ) ist das Kontrollpolynom von C. h(x) = (x − 1) j=d 1 α α2 ... αn−1 1 α2 α4 ... α(n−1)·2 6 (n−1)·3 1 α3 α . . . α H = ist eine Kontrollmatrix von C. .. .. .. .. . . . . d−1 2(d−1) (n−1)·(d−1) 1 α α ... α (Das ist nicht die Kontrollmatrix zu h(x) aus 6.8 (b).) Beweis. Dass C ein [n, n−d+1, d]-Code ist, folgt aus 7.2 (setze k = n−d+1 = dim(C)). Sei f ∈ K[x]k . Dann ist (f (α0 ), . . . , f (αq−2)) ∈ C. (f (αq−2 ), f (α0), . . . , f (αq−3)) = (h(α0 ), . . . , h(αq−2 )) mit h(x) = f (α−1x) ∈ K[x]k (α−1 = αq−2 ). Also ist C zyklisch. Allgemein gilt: n q−1 x −1 =x q−2 Y (x − αj ). −1= (∗) j=0 q−1 j (Denn jedes αj ist wegen (αj ) = (αq−1 ) = 1 eine Nullstelle von xq−1 − 1.) Sei Ce ein zyklischer Code mit Erzeugerpolynom g(x). Beachte: g(x)|xn − 1. 74 ˜ = n − (d − 1) = k = dim(C). Grad g(x) = d − 1, also dim(C) Pn−1 i j e Nun gilt c(x) = i=0 ci x ∈ C ⇔ g(x)|c(x) ⇔ x − α |c(x) für alle j = i j j(n−1) 1, . . . , d−1 ⇔ c(α ) = c0 +c1 α +. . .+cn−1 = 0 für alle j = 1, . . . , d−1. α 2 n−1 1 α α ... α 1 α2 α4 . . . α(n−1)·2 ˜ Also ist H = .. .. .. .. eine Kontrollmatrix von C. . . . . 1 α2 α4 . . . α(n−1)·2 Wir zeigen nun: H ist auch eine Kontrollmatrix von C. Dann ist nämlich Ce = C und wir sind fertig. Pn−d Sei c = (f (1), f (α), . . . , f (αn−1)) ∈ C (n − 1 = q − 2) für f (x) = j=0 aj xj . Multipliziere die i-te Zeile von H mit ct . Das liefert: n−1 X s f (α )α is = s=0 n−d X j=0 = n−d X aj + n−d X aj α j+i + j=0 n−d X j=0 aj α 2(j+i) + ...+ n−d X aj α(n−1)(j+i) j=0 aj [1 + αj+i + α2(j+i) + . . . + α(n−1)(j+i) )] j=0 Nun ist αj+i 6= 1, da 0 ≤ j ≤ n − d und 1 ≤ i ≤ d − 1, also 1 ≤ j + i ≤ n − 1 = q − 2. q−1 j+1 (αj+1 ) = (αq−1 ) = 1. Also ist αj+i eine Nullstelle des Polynoms xq−1 − 1 ∈ K[x]. xq−1 − 1 = (x − 1)(xq−2 + xq−3 + . . . + 1) = (x − 1)(xn−1 + xn−2 + . . . + 1). Wegen αj+i 6= 1, muss αj+i eine Nullstelle von (xn−1 + xn−2 + . . . + 1) sein, d.h. 1 + αj+i + α2(j+1) + . . . + α(n−1)(j+i) = 0. Damit gilt H · ct = 0. Qn−1 (x − αi ) (vgl. (∗)) folgt aus Wegen xn − 1 = g(x)h(x) und xn − 1 = i=0 xn −1 h(x) = g(x) die Behauptung über h(x). 7.6 Beispiel. Sei q = 5, also n = 4 und d = 3. Dann ist k = 2. Z∗5 = {1, 2, 3, 4}; α = 2 oder α = 3 sind möglich. Wähle α = 2. 2 Erzeugerpolynom von RS5 (3) nach 7.5: g(x) = (x − 2)(x − 4) = x + 4x + 3 3 4 1 0 Erzeugermatrix nach 6.8: G = 0 3 4 1 1 2 4 3 Kontrollmatrix nach 7.5: H = 1 4 1 4 Kontrollpolynom nach 7.5: h(x) = (x − 1)(x − 3) = x2 + x + 3 75 e= Kontrollmatrix nach 6.8: H Beachte: |RS5 (3)| = 25. 1 1 3 0 0 1 1 3 7.7 Bemerkung. Reed-Muller-Codes werden häufig eingesetzt. (a) Z.B. Deep Space Missions, etwa Voyager zu Jupiter (1979), Saturn (1981), Uranus und Neptun (Start 1977). (Mehr unter http://www.nasa.gov/) Hier wurde zur Übertragung ein RS28 (223) eingesetzt (in Kombination mit einem Faltungscode; die Konstruktion beruht auf einem Produktcode. Auf Faltungscodes und Produktcodes werden wir später genauer eingehen). (b) Auch für die Audio-CD- oder DVD-Codierung werden Reed-SolomonCodes verwendet. Wir werden hier nur die Grundidee skizzieren. (Einzelheiten s. Skript WS 05/06) Ein wesentlicher Fehlertyp bei CD’s und DVD’s sind Bündelfehler ( bursts“), ” die auch Auslöschungen beinhalten können (d.h. es ist an der betreffenden Stelle kein Bit mehr zu identifizieren). Es ist nicht schwer zu zeigen: Ein [n, k, d]-Code kann bis zu d − 1 Auslöschungen korrigieren, wenn keine weiteren Fehler aufgetreten sind. Die Technik zur Korrektur solcher Bündelfehler ist das sogenannte Interleaving (Spreizung) in der Form von Produktcodes. Wie funktioniert das? Gegeben seien zwei Codes C1 und C2 vom Typ [ni , ki ], i = 1, 2, mit Erzeugermatrizen in Standardform. Die Originaldaten werden mit dem sogenannten äußeren Code C2 codiert. Dann werden k1 aufeinander folgende Codewörter c1 , . . . , ck1 ∈ C2 ⊆ K n2 gesammelt. Schreibe sie spaltenweise: c11 .. . cn 2 1 c12 . . . .. . cn 2 2 . . . c1k1 .. . . cn 2 k 1 (Die Originaldaten stehen jeweils an den Positionen c1i , . . . , ck2 i , i = 1, . . . , k1 .) Codiere die Zeilen mit der Erzeugermatrix (Ek1 , A) von C1 zu Codewörtern von C1 (dem inneren Code). 76 Originaldaten տ c11 .. . ck 2 1 . .. cn 2 1 | {z } ∈ C2 c12 .. . ... ∗ .. . ∈ C1 . . . ∗ ∈ C1 .. . ∈ C1 c1k1 .. . ∗ ... .. . ck 2 2 . . . ck 2 k 1 ∗ .. .. .. . . . ∗ ... ∗ cn 2 2 . . . cn 2 k 1 | {z } | {z } | {z } | {z } ∈ C2 ∈ C2 ∈ C2 ∈ C2 c11 .. (Wegen der Multiplikation von . ... c1k1 .. mit (E , A) sind die letzk1 . cn 2 1 . . . cn 2 k 1 ten n1 − k1 Spalten Linearkombinationen der ersten k1 Spalten, liegen also auch in C2 .) Jetzt liest man zeilenweise aus. (Produktcode, Crossinterleaving) Angenommen ein Bündelfehler von Auslöschungen der Länge b entsteht, b ≤ (d2 − 1)n1 . (d2 = d (C2 )) n1 C1 erkennt, dass Fehler in der Zeile aufgetreten sind. In jeder Spalte sind dann maximal d2 − 1 Auslöschungen aufgetreten, die von C2 korrigiert werden können. (Bei auftretenden Einzelfehlern in einer Zeile korrigiert C1 selbst, ansonsten wird die gesamte Zeile als gelöscht markiert, und dann von C2 wieder korrigiert.) Nachteil: Man muss immer erst eine gesamte Matrix aufbauen, bevor man auslesen kann (entsprechend bei Decodierung). Daher werden andere Auslesetechniken verwendet mit denen die Spreizung der Fehler in den Codewörtern aus C2 sogar noch größer werden kann. Damit kann man Burst-Auslöschungen der Länge (d2 − 1) · t · n1 (t ∈ N fest, frei wählbar) korrigieren. Bei CD’s wird t = 4 gewählt. 77 Bei Audio-CD-Codierung wird als Ausgangscode RS28 (5) gewählt, der dann um 233 bzw. 227 Stellen verkürzt wird. Das liefert MDS-Codes C1 vom Typ [32, 28, 5] und C2 vom Typ [28, 24, 5] die als innere bzw. äußere Codes verwendet werden. bi , wobei (Verkürzung eines Codes C an der Stelle i liefert den Code C bi := {(c1 , . . . , ci−1 , ci+1 , . . . , cn ) : (c1 , . . . , ci−1 , 0, ci+1 , . . . , cn ) ∈ C}.) C (CIRC: Cross-Interleaved-Reed-Solomon-Codes) Mit zusätzlichen Techniken, Interpolationen, etc. lassen sich dann Bursts bis zu 7 mm Länge korrigieren. Einzelheiten: Skript Codierungstheorie WS 05/06 oder Willems, Codierungstheorie DVD’s werden mit Produktcodes aus C1 und C2 codiert, wobei C1 ein [172, 162, 11] und C2 ein [208, 192, 17]-Code über F28 ist. Sie entstehen durch Verkürzung aus RS28 (11) und RS28 (17). 7.8 Bemerkung. Für Reed-Solomon-Codes (oder allgemeiner für sogenannte BCH-Codes, Bose, Ray-Chandhuri (1960), Hocquenghem (1959)) gibt es mehrere schnelle Decodierungsverfahren, z.B. beruhend auf dem Euklidischen Algorithmus in K[x]. Wir können hierauf hier nicht eingehen und verweisen auf das oben zitierte Buch von Willems, Kapitel 9. 78 8 Faltungcodes Faltungscodes (Convolutional Codes): D. Elias, 1955 Vorteil: Soft-Decision-Decoding Nach der Codierung wird das diskrete Signal durch einen Modulator in ein kontinuierliches Signal umgewandelt (Aufprägung auf Welle). Der Demodulator kann nach Störung im Kanal oft nur mit einer gewissen Wahrscheinlichkeit sagen, welches Bit (oder welche Folge von Bits, die einem Inputsymbol entspricht) er empfangen hat. Hard-Decision: Soft-Decision: Der Demodulator muss eine Entscheidung treffen. Dann wird decodiert. Der Demodulator kann dem Decodierer zusätzliche Informationen geben, z.B. mit welcher Wahrscheinlichkeit 0 oder 1 empfangen wurde. Z.B. 3-Bit-Quantifizierung: Inputalphabet {0, 1}, Outputalphabet {0, 1, ?}. Bei Faltungscodes wird der Datenstrom (über Z2 ) in kleine Infoblöcke unterteilt, diese werden codiert, wobei die Codierung von den vorangegangenen Infoblöcken abhängt. 8.1 Definition. Sei K = Z2 . Ein Faltungscode der Rate nk wird durch einen Codierer mit Gedächtnis beschrieben: Ein Datenstrom wird in Infoblöcke der Länge k unterteilt: u0 , u1 , u2 , . . .. Jeder Infoblock wird in ein Codewort der Länge n codiert: c0 , c1 , c2 , . . .. Dabei existieren k × n-Matrizen G0 , . . . , Gm über Z2 mit cr = ur G0 + ur−1 G1 + . . . + ur−m Gm für alle r = 0, 1, 2, . . . (u−1 = . . . = u−m = 0) (d.h. die Codierung ist linear.) m heißt Gedächtnislänge, m + 1 Einflusslänge des Faltungscodes (m = 0: normale Blockcodierung). Üblicherweise sind k und n klein, z.B. k = 1 und n = 2 oder 3. Besonders wichtig sind n1 -Faltungscodes. Hier gilt G0 = (g10 , . . . , gn0) , . . . , Gm = (g1m , . . . , gnm ) . Seien die Bits ur , . . . , ur−m gegeben. Dann wird das Bit ur zu cr = (cr1 , . . . , crn ) codiert, wobei cri = gi0 ur + gi1 ur−1 + . . . + gim ur−m (i = 1, . . . , n). 79 Das ist eine Faltung. G0 .. (Setzt man G = . , so ist cr = (ur , . . . , ur−m ) · G.) Gm (m+1)×n Voraussetzung: Gm 6= (0, . . . , 0) (sonst ist die Gedächtnislänge m de facto kleiner) und G0 6= (0, . . . , 0) (sonst hängt die Codierung von ur nicht von ur ab) 8.2 Beispiele. 1 -Faltungscode mit m = 2: 2 cr,1 = ur + ur−1 + ur−2 cr,2 = ur + ur−2 1 1 d.h. G = 1 0 1 1 Die Codierung ist durch das folgende lineare Schieberegister (LSR) realisierbar: ⊕ ⊕ ur ur−1 ur−2 cr,2 ⊕ cr,2 Im nächsten Takt werden die Registerinhalte nach rechts verschoben, ur−2 fällt raus, statt ur wird ur+1 in das linke Register geladen. 11 |{z} 01 |{z} 01 |{z} 00 |{z} 10 0 0 1 1 0 1 0 → |{z} u−2 u−1 u0 u1 u2 u3 u4 c0 c1 c2 c3 c4 Bei Faltungscodes ist die Codiervorschrift einfach zu verstehen. Dagegen ist die Menge aller erzeugten Codebitfolgen in der Regel schwer zu bestimmen. (Unterschied zu Blockcodes: Algebraische Beschreibung der Codewörter zuerst; dann Codierer!) 80 Wir betrachten ab jetzt nur n1 -Faltungscodes. Aus c0 , c1 , . . . lassen sich die u0 , u1 , . . . wie folgt zurückgewinnen: Da G0 6= (0, . . . , 0), existiert ein i mit gi0 6= 0, d.h. gi0 = 1. Also ur = cri − gi1 ur−1 − . . . − gim ur−m . Faltungscodes können beliebig lange Infobitfolgen codieren. Zur Verhinderung von Fehlerfortpflanzungen bei der Decodierung werden häufig sogenannte terminierte Faltungscodes eingesetzt: 8.3 Definition. Bei einem terminierten Faltungscode mit Gedächtnislänge m werden nach jeweils L Infobits m Nullen in den Datenstrom eingefügt (tail bits). Nach Verarbeitung dieser L + m Bits sind wieder alle Register mit Null besetzt, wie zu Beginn. Das entspricht einem Blockcode, der L Infobits auf (L + m) · n Codebits L abbildet, er hat also Rate L+m · n1 (< n1 ). Für große L ist der Verlust in der Rate vernachlässigbar. Wir geben jetzt eine Beschreibung von Faltungscodes an, die sich für die Decodierung als vorteilhaft erweisen wird: Trellisdiagramme (trellis = Spalier), Fornay, 1973. 8.4 Definition. Das Trellisdiagramm eines gendermaßen erstellt: 1 -Faltungscodes n mit Gedächtnislänge wird fol- (a) Jedes binäre m-Tupel (ur−1, . . . , ur−m ) wird als Zustand bezeichnet. Die 2m möglichen Zustände werden mit ξ1 , . . . , ξ2m bezeichnet (Anordnung siehe (b)), ξ1 = (0, . . . , 0) ist der Nullzustand. Zum Zeitpunkt r befindet sich im LSR im linken Register das momentane Infobit ur , und die übrigen Register bilden einen Zustand (ur−1 , . . . , ur−m) = zr ∈ {ξ1 , . . . , ξ2m }. Für r = 0 ist z0 = ξ1 . (b) Ein (vollständiges) Trellissegment besteht aus zwei vertikal angeordneten Punktreihen, jeweils mit 2m Punkten, die allen möglichen Zuständen entsprechen. Sie werden von oben nach unten in der lexikographischen Ordnung (0 < 1) angeordnet, aber von rechts nach links gelesen. (m = 2: (0, 0) < (1, 0) < (0, 1) < (1, 1)) Also steht (0, ur−2, . . . , ur−m) immer oberhalb von (1, ur−2, . . . , ur−m ). Von jedem Zustand (ur−1, . . . , ur−m ) der ersten vertikalen Punktreihe gehen immer 2 Kanten zu den Zuständen (0, ur−1, . . . , ur−m−1 ) und 81 (1, ur−1, . . . , ur−m−1 ). Diese Kanten sind beschriftet mit dem Codewort, das sich ergibt, wenn die letzten m Infobits gerade ur−1 , . . . , ur−m waren und dann ur = 0 bzw. ur = 1 das nächste Infobit ist. Die Kante mit ur = 0 geht also immer zu einem höheren Punkt als die mit ur = 1. (Das Trellissegment beschreibt den Übergang von Zeitpunkt r zu Zeitpunkt r + 1). (c) Das Trellisdiagramm ist die Hintereinanderreihung der Trellissegmente zu den Zeitpunkten r = 0, 1, . . .. Zu Beginn hat man noch keine vollständigen Trellissegmente, da die ersten Kanten nur vom Nullzustand ausgehen. Bei terminierten Faltungscodes gibt es einen entsprechenden Endeffekt, da die Kanten wieder auf den Nullzustand zurückgehen. (d) Im Trellisdiagramm enden (außer im Anfangsbereich und bei terminierten Faltungscodes im Endbereich) bei jedem Zustand je zwei Kanten: In (ur , ur−1 , . . . , ur−m−1 ) kommen Kanten von (ur−1 , . . . , ur−m−1 , 0) und (ur−1 , . . . , ur−m−1, 1). Jeder Pfad im Trellisdiagramm entspricht einer Inputfolge (obere Kante 0, untere Kante 1) und der zugehörigen Codewortfolge (ablesbar an den Kanten). Trellissegmente außerhalb der Anfangs- und Endbereiche sind identisch. 82 (0,0) u1 z1 u2 z2 00 00 00 11 11 11 (1,0) 10 u3 z3 00 11 11 z6 00 11 11 10 u6 z7 00 11 10 11 10 00 00 u5 z5 00 11 10 u4 z4 00 (0,1) 01 01 01 01 83 01 01 01 01 (1,1) r=0 r=1 10 10 Ab r=2 r=3 10 r=4 identisch Eb r=5 r=6 r=7 8.5 Beispiel. Trellisdiagramm für das Beispiel 8.2. zi = Zustand zur Zeit i. u0 z0 8.6. Viterbi-Decodierung (Viterbi, 1967) Gegeben sei ein n1 -Faltungscode. (a) Der Viterbi-Algorithmus ist ein Maximum-Likelihood-Decodierer, das heißt zu einem empfangenen Wort v = (v0 , . . . , vt ), vi ∈ Zn2 , wird eine Codewortfolge c = (c0 , . . . , ct ), ci ∈ Zn2 , bestimmt, so dass p(v|c) maximal wird. (vgl. 2.17 ML-Decodierung) (Mit c ist dann die Infobitfolge eindeutig bestimmt.) [Falls alle Quellensymbole gleich wahrscheinlich sind, minimiert MLDecodierung die Wahrscheinlichkeit, in eine falsche Codewortfolge zu codieren. Anderer Ansatz: Minimiere die Bit-Fehlerwahrscheinlichkeit in der InfobitFolge z.B. mit dem BCJR-Algorithmus (Bahl, Cocke, Jelinek, Raviv); vgl. z.B. Lin, Costello, Error Control Coding] Ist vi = (vi1 , . . . vin ), ci = (ci1 , . . . , cin ), so ist p(v|c) = t Y i=0 p(vi |ci ) = t Y n Y i=0 j=1 p(vij |cij ) | {z } W-keit, dass vij empfangen wird, falls cij gesendet wird (Übergangswahrscheinlichkeiten des Kanals) (Diskreter gedächtnisloser Kanal) Häufig arbeitet man mit log p(v|c) anstelle von p(v|c) (sogenannte Maximum-Log-Likelihood-Decodierung). Da log eine monoton wachsende Funktion ist, ist dies äquivalent zur Max-LikelihoodDecodierung und bedeutet die Maximierung von log p(v|c) | {z } =:M (v|c) Metrik zur Codewortfolge c (Pfad in Trellisdiagramm) Viterbi-Metrik = t X i=0 log p(vi |ci) | {z } = i=0 j=1 =:M (vi |ci ) Kantenmetrik, denn entspr. Kante in Trellisdiagramm t X n X ci log p(vij |cij ) | {z } =:M (vij |cij ) Bitmetrik Kennt man die Übergangswahrscheinlichkeiten des Kanals, so kann man für jeden Weg über t + 1 Segmente des Trellisdiagramms, also für jede Codewortfolge c, M(v|c) bestimmen. Derjenige mit maximaler Metrik wird dann zur Decodierung verwendet. 84 Bei einem binär symmetrischen Kanal kann man zeigen: M(v|c) maximal ⇔ t X n X i=0 j=1 vij · cij =: v · c ∈ N0 maximal (Summieren in Z, nicht in Z2 .) Also wählt man dort als Metrik gerade v · c. ML-Decodierung bedeutet dann d(v, c) zu minimieren (wie bei Blockcodes). (b) Der Viterbi-Algorithmus vereinfacht nun die Bestimmung von c in der Weise, dass nicht mehr für alle Pfade im Trellis-Diagramm M(v|c) zu bestimmen ist. Deren Anzahl ist exponentiell in t (Verdoppelung nach jedem Segment). Im Viterbi-Algorithmus ist der Aufwand linear in t, da nur bestimmte Pfade betrachtet werden müssen. Viterbi-Algorithmus für terminierte Faltungscodes 1. Starte bei s = m. Für jeden Zustand (in der vertikalen Reihe m im Trellis-Diagramm) berechne die Metrik aller eintreffenden Pfade. 2. s := s + 1 Für jeden Zustand ξk (in der vertikalen Reihe s des Trellis-Diagramms) wird folgende Berechnung durchgefhrt: Bei ξk enden 2 Kanten von Zuständen ξk1 , ξk2 der vorangegangenen Reihe. Berechne: Metrik Survivor-Pfad bei ξki + Kantenξ k1 metrik ξki ξk , i = 1, 2. Speichere die größere der ξk beiden Summen und den entsprechenden Pfad als Survivor-Pfad (bei Mehrdeutigkeiten wähle einen der ξ k2 beiden aus). 3. Falls s < L + m wiederhole 2., sonst stop. 8.7 Satz. Der letzte Survivor-Pfad (entsprechend c = (c0 , . . . , cL+m−1 )) des ViterbiAlgorithmus für terminierte Faltungscodes ist der Maximum-Likelihood-Pfad (ML-Pfad), das heißt M(v|c) ≥ M(v|c′ ) für alle Pfade c′ = (c′0 , . . . , c′L+m−1 ). 85 Beweis. Angenommen der ML-Pfad wurde zum Zeitpunkt s < L + m eliminiert. ML−Pfad ML−Pfad ξ0 P1 ξk Survivor−Pfad P2 Dann: Metrik von P1 + Metrik von P1 ξk < Metrik von P2 + Metrik von P2 ξk (nach Vorgehen Viterbi). Also: Metrik ML-Pfad < Metrik Survivor-Pfad. Das ist ein Widerspruch. 86 00 (0, 0) ξ1 00 0 0 11 11 (1, 0) ξ2 z3 00 4 11 2 0 z4 00 11 2 10 11 87 Empfangene Folge v Surviviorpfad c Infofolge u 8 z7 8 11 10 6 01 01 3 10 11 10 01 01 2 10 00 00 4 3 01 5 10 01 (1, 1) ξ4 11 5 00 10 2 5 z6 00 11 00 (0, 1) ξ3 4 11 z5 00 8.8 Beispiel. z2 z1 z0 6 01 01 3 5 10 11 00 11 01 10 11 00 11 10 11 11 10 11 00 1 0 0 1 0 0 0 Viterbi−Decodierung für den Code aus Beispiel 8.2. d(v, c) = 2 8.9 Bemerkung. (a) Der Viterbi-Algorithmus verwendet Technik des dynamischen Programmierens (b) Er kann auch für Soft-Decoding verwendet werden, d.h. die vi sind aus einem größeren Alphabet als die ci (siehe Skript WS 05/06). (c) Er kann auch für nicht-terminierte Faltungscodes verwendet werden (siehe Skript WS 05/06). 88