15.09.2013 Aufrufe

Codierungstheorie - Diskrete Mathematik - Universität Tübingen

Codierungstheorie - Diskrete Mathematik - Universität Tübingen

Codierungstheorie - Diskrete Mathematik - Universität Tübingen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Codierungstheorie</strong><br />

Skript zur Vorlesung im SS 2004<br />

Prof. Peter Hauck<br />

Arbeitsbereich <strong>Diskrete</strong> <strong>Mathematik</strong><br />

<strong>Universität</strong> <strong>Tübingen</strong><br />

L ATEX-Fassung von Anja Korsten


INHALTSVERZEICHNIS 1<br />

Inhaltsverzeichnis<br />

1 Codes - Grundbegriffe und Beispiele 4<br />

2 Hamming-Schranke und perfekte Codes 14<br />

3 Lineare Codes 18<br />

4 Allgemeine Konstruktionsprinzipien 34<br />

5 Reed-Muller-Codes und<br />

Majority-Logic-Decodierung 47<br />

6 Polynomcodierung und zyklische Codes 65


INHALTSVERZEICHNIS 2<br />

Einführung<br />

Codierung: Sicherung von Daten und Nachrichten gegen zufällige Fehler<br />

bei der Übertragung oder Speicherung.<br />

Situation:<br />

Quelle Kanalcodierer Kanal<br />

Decodierer<br />

Empfänger<br />

Nachricht codiert Nachricht<br />

Störungen! Nachricht wird<br />

(Folge von Symbolen in Wort über<br />

rekonstruiert<br />

aus Alphabet B)<br />

Alphabet A<br />

Ziele bei der Codierung:<br />

Abbildung 1: Schema der Kanalcodierung<br />

1. Möglichst viele bei der Übertragung (oder Speicherung) aufgetretene<br />

(zufällige) Fehler sollen bei der Decodierung erkannt werden und evtl.<br />

sogar korrigiert werden.<br />

2. Der Aufwand zur Codierung und Decodierung soll nicht zu groß sein.<br />

Verwandte Gebiete: Neben dieser sog. Kanalcodierung, die gegen zufällig<br />

auftretende Fehler schützen soll, gibt es noch zwei weitere Codierungsbzw.<br />

Verschlüsselungsbereiche:<br />

1. Quellencodierung: Nachricht wird so codiert, dass häufig auftretende<br />

Strings in kurzer Form codiert werden und seltenere in längerer Form;<br />

Datenkompression<br />

2. Kryptographie: Sicherung von Nachrichten/Daten gegen Abhören<br />

oder Änderungen durch unbefugte Dritte; Datenverschlüsselung<br />

In der Praxis kann eine Kombination aller drei Verfahren vorkommen:<br />

Zunächst wird eine Nachricht komprimiert (z.B. *.zip), dann verschlüsselt<br />

und an- schließend codiert. In dieser Vorlesung werden Datenkompression<br />

und Kryptographie nicht behandelt, sondern nur die Kanalcodierung.<br />

Grundprinzip der Kanalcodierung: Füge der zu übertragenen Nachricht<br />

Redundanz zu, so dass auftretende Fehler (häufig) erkannt werden<br />

können.


INHALTSVERZEICHNIS 3<br />

Drei Hauptaufgaben:<br />

1. Konstruktion geeigneter Codes zur Fehlererkennung und ggf. -korrektur<br />

2. Konstruktion von Codierern<br />

3. Konstruktion von Decodierern<br />

Anforderungen:<br />

1. Schnelle Codierer und Decodierer<br />

2. Große Fehlererkennungs- bzw. korrektursicherheit des Codes mit möglichst<br />

wenig zusätzlicher Redundanz.


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 4<br />

1 Codes - Grundbegriffe und Beispiele<br />

Zunächst wird in einigen Beispielen beschrieben, wie die in der Einleitung<br />

beschriebene Kanalcodierung erfolgen kann.<br />

1.1 Beispiele.<br />

(a) Parity-Check Code<br />

Nachrichten und Codewörter sind aus demselben Alphabet A = B =<br />

{0,1}. Die Nachrichten sind 00, 01, 10, 11 und werden auf folgende<br />

Weise codiert:<br />

00 → 000<br />

01 → 011<br />

10 → 101<br />

11 → 110<br />

Es gibt acht 0-1-Wörter der Länge 3, von denen nur die mit einer<br />

geraden Anzahl von Einsen tatsächlich Codewörter sind. Entsteht bei<br />

der Übertragung eines Codewortes genau ein Fehler, so ist die Anzahl<br />

der Einsen ungerade und der Fehler wird entdeckt. Man hat jedoch<br />

keinen Anhaltspunkt, in welcher Koordinate der Fehler entstanden ist.<br />

Damit ist eine Decodierung nicht eindeutig möglich. Zwei Fehler in<br />

einem übertragenen Codewort werden nicht entdeckt.<br />

Der ASCII-Code ist von diesem Typ: 128 Zeichen werden mit 8 Bits<br />

codiert, wobei das achte Bit ein Parity-Check-Bit ist.<br />

(b) Wiederholungscode<br />

Nachrichten und Codewörter sind aus demselben Alphabet A = B =<br />

{0,1}. Die Nachrichten sind 00, 01, 10, 11 und werden auf folgende<br />

Weise codiert:<br />

00 → 000000<br />

01 → 010101<br />

10 → 101010<br />

11 → 111111<br />

Dies ist ein Code mir relativ hoher Redundanz. Die Länge einer Nachricht<br />

wird bei der Codierung verdreifacht.


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 5<br />

Je zwei Codewörter unterscheiden sich an mindestens 3 Stellen. Ein Decodierer<br />

könnte dasjenige Codewort suchen, zu welchem er die wenigsten<br />

Bits am empfangenen Wort ändern muss. Dann wird zum Beispiel<br />

das empfangene Wort 101011 zu 101010 decodiert.<br />

Wird nur ein Bit bei der Übertragung geändert, so wird der Fehler<br />

erkannt und (mit obiger Methode) richtig korrigiert. Treten zwei Fehler<br />

auf, so wird erkannt, dass Fehler aufgetreten sind, aber nicht korrekt<br />

decodiert.<br />

(c) Nachrichten und Codewörter sind aus demselben Alphabet A = B =<br />

{0,1}. Die Nachrichten sind 00, 01, 10, 11 und werden auf folgende<br />

Weise codiert:<br />

00 → 00000<br />

01 → 01101<br />

10 → 10110<br />

11 → 11011<br />

Dies ist ein Code mir geringerer Redundanz als im vorigen Beispiel. Es<br />

unterscheiden sich auch je zwei Codewörter an mindestens drei Stellen.<br />

Und auch hier werden maximal zwei Fehler erkannt und ein Fehler<br />

korrekt decodiert.<br />

ÜA: Ist ein Codierung mit denselben Eigenschaften, wie in den beiden<br />

vorigen Beispielen, in Codewörter der Länge vier möglich?<br />

(d) Prüfziffern-Code (1): EAN-13<br />

Die Europäische Artikelnummer ist ein 13-stelliger Code, der sich auf<br />

vielen Produktverpackungen befindet.<br />

Nachrichten und Codewörter sind aus dem Alphabet A = B = {0, . . . ,<br />

9}. Die gültigen Codewörter sind aus der folgenden Menge:<br />

C = {c1 . . . c13 ; ci ∈ A, c1 +3c2 +c3 +3c4 +. . .+3c12 +c13 ≡ 0 mod 10}<br />

Die eigentliche Information steckt in den zwölf Ziffern c1, . . . , c12, von<br />

denen die ersten beiden das Herstellungsland angeben (40-43 Deutschland).<br />

Die Ziffern c3 bis c12 sind für die Herstellungsfirma reserviert (in<br />

der Regel geben c3 bis c7 den Hersteller und c8 bis c12 das Produkt an).<br />

Zur Codierung wird eine 13te Ziffer angehängt. Diese wird eindeutig so<br />

gewählt, dass sich ein gültiges Codewort ergibt.<br />

Beim Lesen oder Abtippen einer Zahlenfolge ist mit 80% der am häufigsten<br />

auftretende Fehler eine veränderte Ziffer. EAN-13 erkennt einen


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 6<br />

solchen Fehler, da x → 3x mod 10 eine Permutation auf A ist. Der<br />

Zahlendreher - die Vertauschung zweier benachbarter Ziffern - ist der<br />

am zweit häufigsten auftretende Fehler. Jedoch werden Vertauschungen<br />

von zwei Ziffern ci und cj in folgenden Fällen nicht erkannt:<br />

1. Der Abstand der Indizes i und j ist gerade.<br />

2. Ist i gerade und j ungerade, so wird eine Vertauschung nicht erkannt<br />

falls: | ci − cj |= 5<br />

Die Erkennung eines Zahlendrehers ist damit nur gesichert, falls je zwei<br />

benachbarte Zahlen einen Abstand ungleich 5 haben. So werden über<br />

90% aller Abtipp- oder Lesefehler erkannt.<br />

Der EAN-13 Code wird in einen Barcode/Strichcode übersetzt, der<br />

optisch-elektronisch mit einem Scanner gelesen werden kann. Jedes der<br />

c2, . . . , c13 wird zunächst in einen 7-Bit-String codiert. Dabei werden<br />

die vier Codes A, B, C und D aus Tabelle 1 verwendet. Die Ziffer c1<br />

gibt anhand von Code D an, in welcher Folge Code A und Code B<br />

angewendet werden müssen, um c2 bis c7 zu codieren. Da Code A und<br />

Code B disjunkt sind, wird beim Dekodieren erkannt, wie c2 bis c7<br />

codiert worden sind. So kann wieder auf c1 geschlossen werden.<br />

Ziffern Ziffern bestimmt<br />

c2 − c7 c8 − c13 durch c1<br />

Zeichen Code A Code B Code C Code D<br />

0 0001101 0100111 1110010 AAAAAA<br />

1 0011001 0110011 1100110 AABABB<br />

2 0010011 0011011 1101100 AABBAB<br />

3 0111101 0100001 1000010 AABBBA<br />

4 0100011 0011101 1011100 ABAABB<br />

5 0110001 0111001 1001110 ABBAAB<br />

6 0101111 0000101 1010000 ABBBAA<br />

7 0111011 0010001 1000100 ABABAB<br />

8 0110111 0001001 1001000 ABABBA<br />

9 0001011 0010111 1110100 ABBABA<br />

Tabelle 1: Die vier Codes des EAN-13<br />

Die entstandene Bitfolge wird nun in einen Strichcode übersetzt. Dabei<br />

wird jede 1 in einen schwarzen Balken und jede 0 in einen weißen Balken<br />

codiert. Die ersten drei Codes sind so gewählt, dass das gleiche Bit


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 7<br />

höchstens viermal nacheinander auftaucht. So treten nur Balken der<br />

Breite 1 bis 4 auf.<br />

Abbildung 2: Beispiel eines EAN-13 Codewortes<br />

Bemerkungen:<br />

• Der EAN-13 Strichcode besteht also aus 2 aufeinanderfolgenden<br />

Codierungen.<br />

• Der 12-stellige amerikanische UPC-Code codiert nur anhand von<br />

Code A und Code C. Damit ist er vollständig kompatibel zum<br />

EAN-13 Code mit führender ”0”.<br />

• In Europa wird auch der 8-stellige EAN-8 benutzt.<br />

• Weitere Informationen finden sich im Internet unter anderem auf<br />

den folgenden zwei Webseiten:<br />

http://www.barcodeisland.com/ean13.phtml<br />

http://www.adams1.com/infos/barcode.htm<br />

(e) Prüfziffern-Code (2): ISBN<br />

Die International Standard Book Number ist ein 10-stelliger Code, der<br />

jedes Buch international erkennbar macht. Die ersten 9 Ziffern kennzeichnen<br />

Erscheinungsland, Verlag und Buch; an diese wird eine zehnte<br />

Prüfziffer angehängt.<br />

Kennzeichnung des<br />

Erscheinungslandes<br />

3 − 11 − 015873 − 6<br />

Verlagsnummer Verlagsinterne Nummer<br />

für das spez. Buch<br />

Abbildung 3: Beispiel einer ISBN-Nummer<br />

Prüfziffer<br />

Uncodierte Wörter sind aus dem Alphabet B = {0, . . . , 9} und<br />

Codewörter sind aus dem Alphabet A = {0, 1, . . . , 9, X}. Das


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 8<br />

Anhängen der Prüfziffer geschieht nach folgender Regel: Stellen die<br />

Ziffern z10z9 . . . z2z1 in dieser Reihenfolge eine ISBN-Nummer dar, so<br />

wurde die Prüfziffer z1 so gewählt, dass für die gewichtete Quersumme<br />

gilt:<br />

10<br />

kzk ≡ 0 mod 11<br />

k=1<br />

Ist dabei z1 = 10, so wird z1 = X gesetzt; (Im obigen Beispiel: 10 · 3 +<br />

9 · 1 + 8 · 1 + 7 · 0 + 6 · 1 + 5 · 5 + 4 · 8 + 3 · 7 + 2 · 3 + 1 · 6 = 143 ≡ 0<br />

mod 11). Die Redundanz ist bei dieser Codierung sehr gering und dazu<br />

werden die zwei häufigsten Fehlertypen entdeckt (wenn nur einer der<br />

beiden auftritt):<br />

1. Vertauschung zweier Ziffern: Werden zi und zj vertauscht (1 ≤<br />

i, j ≤ 10), so ist<br />

<br />

kzk + izj + jzi =<br />

k=i,j<br />

10<br />

k=1<br />

kzk + (j − i)(zi − zj)<br />

<br />

≡ 0 mod 11<br />

≡ 0 mod 11<br />

Denn für zi = zj gilt: 1 ≤ |zi − zj| ≤ 10 und 1 ≤ |i − j| ≤ 10.<br />

Damit ist die Quersumme nicht mehr durch 11 teilbar und die<br />

Vertauschung wird erkannt.<br />

2. Austausch einer Ziffer gegen eine andere: Wird zi durch xi ersetzt,<br />

so gilt für die Quersumme:<br />

<br />

kzk + ixi =<br />

k=i<br />

10<br />

k=1<br />

kzk − i (zi − xi)<br />

<br />

≡ 0 mod 11<br />

Dies folgt, da wiederum 1 ≤ |zi − xi| ≤ 10.<br />

≡ 0 mod 11<br />

Bemerkung: Die Beispiele (a), (d) und (e) nennt man auch Kontrollcodes<br />

oder Prüfziffersysteme.<br />

Das Wesentliche an den vorangegangenen Beispielen ist die Tatsache,<br />

dass nach der Codierung Wörter von fester Länge über einem Alphabet<br />

übermittelt werden, wobei nur gewisse aller möglichen Wörter dieser einen<br />

Länge tatsäch- lich Codeworte sind. Diese Tatsache lässt sich wie gesehen,<br />

zum Entdecken und ggf. Korrigieren von Fehlern ausnutzen.<br />

Im Folgenden werden wir uns, wie im Beispiel, vor allem solche Codes ansehen,<br />

für welche die codierte Information in Blöcke von je n Symbolen (für<br />

festes n) unterteilt werden kann, wobei jeder Block unabhängig von den anderen<br />

decodiert werden kann.


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 9<br />

1.2 Definition (Blockcode). Es sei A eine endliche Menge (Alphabet)<br />

und n ∈ N. Ein Blockcode C (einfacher: Code) der Länge n über A ist eine<br />

Teilmenge von A n = A × . . . × A. Die Elemente von C heißen Codewörter. Ist<br />

|A| = 2, so heißt C binärer Blockcode (i.Allg. A = {0, 1}).<br />

1.3 Definition (Hamming-Abstand). Sei A ein endliches Alphabet, n ∈<br />

N. Zu a = (a1, . . . , an), b = (b1, . . . , bn) ∈ A n heißt<br />

der Hamming-Abstand von a und b.<br />

d(a, b) = #{i : 1 ≤ i ≤ n, ai = bi}<br />

1.4 Satz. Für den Hamming-Abstand gilt:<br />

(a) 0 ≤ d(a, b) ≤ n ∀ a, b ∈ A n<br />

(b) d(a, b) = 0 ⇔ a = b<br />

(c) d(a, b) = d(b, a) ∀ a, b ∈ A n<br />

(d) d(a, b) ≤ d(a, c) + d(c, b) ∀ a, b, c ∈ A n (Dreiecks-Ungleichung)<br />

Damit ist d : A n × A n −→ {0, . . . , n} eine Metrik.<br />

Ist A eine Gruppe mit Verknüpfung +, so gilt zusätzlich:<br />

(e) d(a + c, b + c) = d(a, b) ∀ a, b, c ∈ A n (Translations-Invarianz)<br />

Beweis. (a), (b), (c) klar. (d) Ist ai = bi, so ist ai = ci oder bi = ci. Daraus<br />

folgt die Behauptung. (e) Da A eine Gruppe ist, gibt es zu ci aus A immer das<br />

Inverse bzgl. der Addition −ci in A. Damit gilt: ai+ci = bi+ci ⇔ ai = bi.<br />

Bemerkung. Wird ein Wort x aus einem Code C ⊆ A n gesendet und ein<br />

Wort y aus A n empfangen mit d(x, y) = k, so sind während der Übertragung<br />

k Fehler aufgetreten.<br />

1.5 Definition (Hamming-Decodierung und Minimalabstand). Sei C<br />

ein Blockcode aus A n .<br />

(a) Hamming-Decodierung (Maximum-Likelihood-Decodierung): Wird ein<br />

Wort y ∈ A n empfangen, so wird y als ein x ′ decodiert mit<br />

d(x ′ , y) = min d(x, y).<br />

x∈C<br />

(x ′ muss nicht eindeutig bestimmt sein!) Diese Decodierung ist sinnvoll,<br />

wenn jedes Symbol in einem Codewort mit gleicher Wahrscheinlichkeit<br />

gestört werden kann.


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 10<br />

(b) Der Minimalabstand von C ist:<br />

d(C) = min<br />

x,x ′ ∈C, x=x ′ d(x, x′ )<br />

(c) Ein Blockcode C heißt t-Fehler-korrigierend, falls<br />

d(C) ≥ 2t + 1.<br />

Ein Blockcode C heißt t-Fehler-erkennend, falls<br />

d(C) ≥ t + 1.<br />

Zur Bezeichnung in 1.5.(c): Ist d(C) ≥ 2t + 1 und ist x ∈ C, so liegt in der<br />

’Kugel’<br />

Kt(x) = {y ∈ A n : d(x, y) ≤ t}<br />

genau ein Codewort - nämlich x. Treten also bei der Übermittlung eines<br />

Codewortes höchstens t Fehler auf, so wird mit der Hamming-Decodierung<br />

korrekt decodiert.<br />

t<br />

x1<br />

Kt(x1)<br />

d(C)<br />

t<br />

x2<br />

Kt(x2)<br />

Abbildung 4: Abstand zweier Codewörter<br />

Ist d(C) ≥ t + 1 und treten bei der Übermittlung eines Codewortes maximal<br />

t Fehler auf, wird entweder das ursprüngliche Codewort empfangen (kein<br />

Fehler), oder ein Wort, das kein Codewort ist. Es wird dann erkannt, dass<br />

Fehler aufgetreten sind. Die Hamming-Decodierung kann jedoch inkorrekt<br />

⌋ Fehler aufgetreten sind.<br />

sein, falls mehr als ⌊ t<br />

2<br />

1.6 Beispiele.<br />

(a) m-facher Wiederholungscode aus Beispiel 1.1.(b): ein Block der Länge k<br />

wird m-fach gesendet (Codewörter haben Länge m · k). In diesem Fall<br />

ist d(C) = m und C ist ⌊ m−1⌋-Fehler-korrigierend<br />

und (m-1)-Fehler-<br />

2<br />

erkennend.


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 11<br />

(b) Code aus Beispiel 1.1.(c): Die Blocklänge beträgt n = 5 und d(C) = 3.<br />

C ist 1-Fehler-korrigierend und 2-Fehler-erkennend.<br />

Ziele: Die vorangegangenen Definitionen führen zu den folgenden Zielen.<br />

- Konstruktion von Codes mit möglichst großem Minimalabstand d(C),<br />

und damit einer geringeren Decodierfehlerwahrscheinlichkeit.<br />

- Zur Codierung eines Bits sollten nicht zu viele weitere Bits benötigt<br />

werden. Daher wird folgendes definiert:<br />

1.7 Definition (Informationsrate). Sei C ein Blockcode in A n , |A| = q.<br />

R = 1<br />

n logq|C|<br />

heißt Informationsrate (kurz: Rate) von C; 1 − R wird Redundanz von C<br />

genannt.<br />

Anschaulich: Die Informationsrate gibt an, wie groß der Anteil an reiner Information<br />

in einem Codewort ist. Oder: 1 ist der Faktor, der den Mehraufwand<br />

R<br />

bei Codierung angibt.<br />

1.8 Beispiele. (a) m-facher Wiederholungscode: R = 1<br />

m<br />

(b) Code aus Beispiel 1.1.(c) : R = 2<br />

5<br />

(c) ASCII-Code: R = 7<br />

8<br />

Umformulierung der Ziele: Finde Codes mit geringer Decodierfehlerwahrscheinlichkeit<br />

(bzgl. der Hamming-Decodierung) und hoher Informationsrate.<br />

Im Prinzip sind diese Ziele erreichbar, wie ein wichtiger Satz von Shannon<br />

besagt. Dazu wird ein Kanal betrachtet, für den die Wahrscheinlichkeit einer<br />

Störung von Zeichen aus einem Alphabet A für jedes Zeichen und zu jedem<br />

Zeitpunkt gleich ist, etwa p. Ist |A| = 2, so handelt es sich um einen binären<br />

symmetrischen Kanal. Die Kapazität eines solchen Kanals gibt an, welcher<br />

Anteil der Information korrekt übermittelt werden kann, und ist definiert als<br />

C = C(p) = 1 + p log2p + (1 − p) log2(1 − p).


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 12<br />

C(p)<br />

1<br />

0.5<br />

0<br />

0.5 1<br />

Abbildung 5: Kapazität eines binären symmetrischen Kanals<br />

Ist p = 0 oder p = 1, so ist C maximal, da man die Nachricht nach der<br />

Übertragung vollständig rekonstruieren kann. Ist p = 1<br />

, so ist C = 0 mi-<br />

2<br />

nimal. Durch einen solchen Kanal wird aus jeder Folge mit gleicher Wahrscheinlichkeit<br />

jede andere Folge erzeugt; nichts ist rekonstruierbar. In der<br />

Regel ist p klein und C nahe bei 1.<br />

1.9 Satz (Shannons Hauptsatz der Kanalcodierung (1948) 1 ).<br />

Ist ein binärer symmetrischer Kanal mit Kapazität C und Fehlerwahrscheinlichkeit<br />

p gegeben und r ∈ R, r < C, so existiert ein Blockcode mit Informationsrate<br />

> r und beliebig kleiner Decodierfehlerwahrscheinlichkeit (bzgl. der<br />

Hamming-Decodierung).<br />

Dabei muss die Blocklänge n jedoch genügend groß gewählt werden. Der Beweis<br />

ist wahrscheinlichkeitstheoretisch und nicht konstruktiv; siehe [HQ83],<br />

[Rom92] und [vL99]. Ein kombinatorischer Beweis findet sich in [Her81].<br />

Das Ziel der sogenannten algebraischen <strong>Codierungstheorie</strong>, mit der sich diese<br />

Vorlesung haupsächlich befassen wird, lässt sich folgendermaßen beschreiben:<br />

- Explizite Konstruktion von Codes mit möglichst großer Rate und<br />

großem Minimalabstand.<br />

- Gleichzeitig soll die Blocklänge n nicht zu groß sein (damit nicht zu<br />

lange gewartet werden muss, bis genug Nachrichten vorhanden sind,<br />

die in einen Block der Länge n codiert werden können).<br />

- Um Codierung und Decodierung zu vereinfachen, sollte der Code eine<br />

mathematisch einfache Struktur haben. Dies wird ermöglicht, wenn<br />

man das Alphabet A als Gruppe oder Körper wählt. Im letzten Fall ist<br />

dann A n ein Vektorraum, und Codes werden oft als Unterräume von<br />

1 siehe [Sha48]<br />

p


1 CODES - GRUNDBEGRIFFE UND BEISPIELE 13<br />

A n gewählt (lineare Codes). Dies vereinfacht in der Regel vor allem die<br />

Codierung.<br />

Dieser Ansatz - möglichst gute Codes explizit zu konstruieren - geht auf<br />

Hamming zurück, dessen erste grundlegende Arbeit wie die von Shannon in<br />

den späten 40er Jahren des letzten Jahrhunderts entstand; siehe [Ham50].<br />

Die beiden Arbeiten von Shannon und Hamming sind die Grundpfeiler der<br />

<strong>Codierungstheorie</strong>.


2 HAMMING-SCHRANKE UND PERFEKTE CODES 14<br />

2 Hamming-Schranke und perfekte Codes<br />

Hat ein Blockcode der Länge n über A den Minimalabstand d, so sind die<br />

Kugeln vom Radius ⌊ d−1⌋<br />

um die Codewörter disjunkt. Liegt jedes Element<br />

2<br />

aus An in einer dieser Kugeln, so kann jedes Wort in An bzgl. der Hamming-<br />

Decodierung eindeutig decodiert werden. Daher wird definiert:<br />

2.1 Definition (perfekter Code). Sei C ein Code der Länge n über A. C<br />

heißt perfekt, falls ein e ∈ N existiert mit:<br />

1. Ke(x) ∩ Ke(x ′ ) = ∅ ∀ x, x ′ ∈ C, x = x ′<br />

2. A n = <br />

x∈C Ke(x).<br />

2.2 Satz. Sei C ein perfekter Code mit |C| > 1 und e wie in 2.1. Dann gilt<br />

d(C) = 2e + 1.<br />

Perfekte Codes haben also ungeraden Minimalabstand.<br />

Beweis. klar: d(C) > e, da |C| > 1.<br />

1. Angenommen: d(C) ≤ 2e. Dann existieren x, x ′ ∈ C, x = x ′ mit<br />

d(x, x ′ ) ≤ 2e. Ändere x an e Positionen, an denen sich x von x ′ unterscheidet,<br />

auf solche Weise, dass die betreffenden Einträge danach mit denen von<br />

x ′ übereinstimmen. Sei y ∈ A n das dadurch entstandene Wort. Dann ist<br />

d(x, y) = e. Da d(x, x ′ ) ≤ 2e, folgt d(x ′ , y) ≤ e. Damit ist y ∈ Ke(x)∩Ke(x ′ ).<br />

Widerspruch zu Eigenschaft 1 eines perfekten Codes. Daher ist d(C) ≥ 2e+1.<br />

2. Wähle ein x ∈ C und ändere es an e + 1 Stellen zu z ∈ A n ab. Dann gilt<br />

d(x, z) = e+1 und z /∈ Ke(x). Da der Code perfekt ist, existiert x ′ ∈ C, x = x ′<br />

mit z ∈ Ke(x ′ ). Es gilt dann: d(C) ≤ d(x, x ′ ) ≤ d(x, z)+d(z, x ′ ) ≤ (e+1)+e =<br />

2e + 1.<br />

Insgesamt ist somit d(C) = 2e + 1.<br />

2.3 Lemma. Sei |A| = q, y ∈ A n und e ∈ N0 (e ≤ n). Dann ist<br />

|Ke(y)| =<br />

e<br />

j=0<br />

<br />

n<br />

(q − 1)<br />

j<br />

j<br />

Beweis. In Ke(y) liegen alle Elemente aus An , die Abstand 0, 1, . . . , e von y<br />

haben. Sei 0 ≤ j ≤ e. Dann gibt es n<br />

Möglichkeiten j Positionen aus den<br />

j<br />

n Positionen des Wortes y auszuwählen. Für jede Auswahl gibt es (q − 1) j<br />

Möglichkeiten, ein Element aus A n zu bilden, welches sich von y an genau<br />

diesen j Positionen unterscheidet. Das heisst:<br />

Daraus folgt die Behauptung.<br />

|{y ′ ∈ A n : d(y, y ′ ) = j}| =<br />

<br />

n<br />

(q − 1)<br />

j<br />

j .


2 HAMMING-SCHRANKE UND PERFEKTE CODES 15<br />

2.4 Satz. Sei C ein Code der Länge n über A, |A| = q. Es sei d(C) ≥ 2e + 1<br />

mit e ∈ N0.<br />

(a) (Hamming-Schranke, Kugelpackungsschranke) Es gilt:<br />

|C| ≤<br />

e<br />

j=0<br />

qn <br />

(q − 1) j<br />

(b) C ist genau dann ein perfekter Code, wenn in (a) die Gleichheit gilt.<br />

(Dann ist d(C) = 2e + 1).<br />

Beweis. Wegen d(C) ≥ 2e + 1 ist Ke(x) ∩ Ke(x ′ ) = ∅ für x, x ′ ∈ C, x = x ′ .<br />

Also: A n ⊇ ˙<br />

x∈C Ke(x)<br />

(a) Mit 2.3 folgt:<br />

q n = |A n | ≥ | ˙<br />

Dies liefert die Behauptung.<br />

n<br />

j<br />

x∈C Ke(x)| = <br />

|Ke(x)| = |C|<br />

(b) C ist perfekt ⇔ A n = ˙<br />

x∈C Ke(x) ⇔ Gleichheit in (a).<br />

x∈C<br />

e<br />

j=0<br />

<br />

n<br />

(q − 1)<br />

j<br />

j<br />

Beispiel: Für einen Code der Länge 5 über einem Alphabet der Größe 2 mit<br />

d(C) ≥ 3 gilt: |C| ≤ ⌊ 25<br />

⌋ = 5.<br />

1 + 5<br />

ÜA: Gibt es einen Code C der Länge 5 über einem Alphabet der Größe 2<br />

mit d(C) = 3 und |C| = 5? (In Beispiel 1.1.c ist |C| = 4).<br />

Bemerkung. Die folgenden Codes werden triviale perfekte Codes genannt:<br />

• einelementige Codes<br />

• C = A n und e = 0<br />

• n-fache Wiederholungscodes C = {(1, . . . , 1) , (0, . . . , 0) }, n = 2e + 1.<br />

<br />

2e+1 2e+1


2 HAMMING-SCHRANKE UND PERFEKTE CODES 16<br />

2.5 Beispiel (binärer Hamming-Code der Länge 7). Sei A = {0, 1} =<br />

F2. C sei der Code der Länge 7 über F2 (d.h. C ⊆ F7 2 ) gegeben durch<br />

C = {(c1 . . . c7) : ci ∈ F2, c1 + c4 + c6 + c7 = 0,<br />

c2 + c4 + c5 + c7 = 0,<br />

c3 + c5 + c6 + c7 = 0}.<br />

C ist ein linearer Unterraum von F 7 2 . Werden c4, . . . , c7 frei gewählt, so sind<br />

c1, c2, c3 eindeutig bestimmt und es ist dim (C) = 4 und |C| = 2 4 = 16.<br />

Anhand der definierenden Gleichungen ergibt sich:<br />

C = < (1101000), (0110100), (1010010), (1110001) ><br />

Da C ein linearer Raum ist, gilt mit der Translationsinvarianz des Hammingabstandes:<br />

d(C) = min d(0, x)<br />

x∈C,x=0<br />

und es folgt, dass d(C) die Minimalanzahl von Einsen in einem nichttrivialen<br />

Codewort ist. Anhand der Basis erkennt man, dass d(C) ≥ 3 sein muss. Jedes<br />

nichttriviale Codewort enthält jedoch mindestens drei Einsen ( Setze c7 = 1.<br />

Nach Addition der drei Gleichungen ergibt sich c1 + c2 + c3 = c7 = 1. Dann<br />

ist entweder c1 = c2 = c3 = 1 oder c1 = 1 und c2 = c3 = 0 und aus der<br />

zweiten Gleichung (c4 + c5 = 1) folgt c4 = 1 oder c5 = 1 (c7 = 0 ähnlich)).<br />

Also gilt d(C) = 3 = 2 · 1 + 1 und der Code ist 1-Fehler-korrigierend. Aus der<br />

Gleichheit:<br />

| ˙<br />

folgt, dass C perfekt ist.<br />

x∈C K1(x)| = 16 · (1 + 7) = 16 · 8 = 2 7 = |F 7 2|<br />

Bemerkung. (a) C heißt binärer Hamming-Code der Länge 7 (Shannon,<br />

Golay, Hamming, 1948 - 1950). Dieser ist ein Beispiel aus einer Serie<br />

perfekter Codes (Hamming-Codes). Für jede Primzahlpotenz q und<br />

jede natürliche Zahl k ≥ 2 existiert ein perfekter linearer Code über<br />

Fq der Länge qk − 1<br />

q − 1 und der Dimension qk − 1<br />

− k mit d(C) = 3 (1q<br />

− 1<br />

Fehler-korrigierend). Wir werden diese Codes in Kapitel 3 behandeln.<br />

(b) Es gibt zwei weitere Beispiele perfekter linearer Codes mit Minimalabstand<br />

größer als 3:<br />

Der binäre Golay-Code G23 über F2 hat die Länge 23 und Dimension<br />

12 mit Minimalabstand d(C) = 7 (3-Fehler-korrigierend).


2 HAMMING-SCHRANKE UND PERFEKTE CODES 17<br />

Der ternäre Golay-Code G11 über F3 hat die Länge 11 und Dimension<br />

6 (d.h. |C| = 3 6 ) mit Minimalabstand d(C) = 5 (2-Fehlerkorrigierend).<br />

(c) Die Hamming- und die Golay-Codes sind die einzigen nicht-trivialen<br />

perfekten linearen Codes (bis auf Äquivalenz); bewiesen von van Lint<br />

(1971), siehe [vL99], und Tietäväinen (1973).<br />

(d) Es gibt nicht-lineare perfekte Codes, die die gleichen Parameter haben<br />

wie die Hamming-Codes (Vasilev, 1962)<br />

(e) Die Golay-Codes sind die einzigen perfekten Codes über Alphabeten<br />

von Primzahlpotenzordnung, deren Minimalabstand d(C) größer gleich<br />

5 ist (van Lint, Tietäväinen).<br />

(f) Der binäre Golay-Code ist der einzige perfekte Code mit d(C) ≥ 7 (Best<br />

1978, Hong 1984).


3 LINEARE CODES 18<br />

3 Lineare Codes<br />

3.1 Definition. Sei K ein endlicher Körper und n ∈ N. Ein linearer Code C<br />

ist ein Unterraum des K-Vektorraums K n .<br />

Ist dim(C) = k (≤ n) und d(C) = d, so heißt C ein [n, k]-Code oder [n, k, d]-<br />

Code über K. n, k, d, q sind die Parameter des Codes. (Für |K| = q gibt es<br />

auch die Schreibweise [n, k, d]q-Code).<br />

Beispiel: Der binäre Hamming-Code der Länge 7 aus (2.5) ist ein [7, 4, 3]2-<br />

Code.<br />

3.2 Exkurs (Endliche Körper).<br />

(a) Für jede Primzahl p gibt es einen endlichen Körper Fp = {0, 1, . . . , p −<br />

1}. Addition und Multiplikation in Fp entsprechen der Addition und<br />

Multiplikation in Z reduziert modulo p.<br />

(b) Ist K ein endlicher Körper, so existiert eine Primzahl p und ein n ∈ N,<br />

so dass |K| = p n .<br />

(c) Zu jeder Primzahl p und jedem n ∈ N existiert ein Körper K mit<br />

|K| = p n . (Konstruktion: Wähle ein irreduzibles Polynom f vom Grad<br />

n aus Fp[X] und setze K = {g ∈ Fp[X] : grad(g) < n}. Definiere die<br />

Addition in K analog zur der in Fp[X]. Multiplikation in K entspricht<br />

der Multiplikation in Fp[X] reduziert modulo f.)<br />

Beispiel: Gesucht ist ein Körper der Größe 4 = 2 2 . Das Polynom f =<br />

X 2 + X + 1 aus F2[X] ist irreduzibel, da es keine Nullstellen in F2 hat.<br />

Es ist K = {0, 1, X, X + 1} und es gilt zum Beispiel: X · (X + 1) ≡<br />

X 2 + X ≡ 1 · f + 1 ≡ 1 mod f, d.h. X(X + 1) = 1 in K.<br />

(d) Sind K, L endliche Körper, die die gleiche Anzahl von Elementen enthalten,<br />

dann ist K isomorph zu L.<br />

Für die Beweise siehe [Wil99] Abschnitt 2.2.<br />

3.3 Definition (Minimalgewicht).<br />

(a) Sei K ein endlicher Körper, x ∈ K n . Dann heißt<br />

das Gewicht von x.<br />

wt(x) := d(x, 0) = #{i : xi = 0}


3 LINEARE CODES 19<br />

(b) Ist {0} = C ⊆ K n , so heißt<br />

das Minimalgewicht von C.<br />

wt(C) = min<br />

x∈C,x=0 wt(x)<br />

3.4 Satz. Sei C = {0} ein linearer Code. Dann gilt:<br />

d(C) = wt(C)<br />

Beweis. Da C linear ist (x, x ′ ∈ C ⇒ x − x ′ ∈ C) und der Hamming-Abstand<br />

translationsinvariant ist, gilt:<br />

d(C) = min{d(x, x ′ ) : x, x ′ ∈ C, x = x ′ }<br />

= min{d(x − x ′ , 0) : x, x ′ ∈ C, x = x ′ }<br />

= min{d(y, 0) : y ∈ C, y = 0}<br />

= wt(C)<br />

3.5 Definition (Erzeugermatrix). Sei C ein [n, k]-Code über Fq<br />

g1, . . . , gk eine Basis von C (gi = (gi1, . . . , gin)). Dann heißt<br />

und<br />

⎛ ⎞ ⎛<br />

⎞<br />

G =<br />

⎜<br />

⎝<br />

eine Erzeugermatrix für C.<br />

g1<br />

.<br />

gk<br />

⎟ ⎜<br />

⎠ = ⎝<br />

g11 · · · g1n<br />

.<br />

gk1 · · · gkn<br />

.<br />

⎟<br />

⎠ ∈ F k×n<br />

q<br />

3.6 Satz. Sei C ein linearer [n, k]-Code über Fq. Eine k × n-Matrix G über<br />

Fq ist genau dann eine Erzeugermatrix für C, wenn gilt:<br />

C = {uG : u ∈ F k q }<br />

Beweis. 1. Sei g1, . . . , gk eine Basis für C und G die entsprechende Erzeugermatrix.<br />

Für jedes u = (u1, . . . , uk) ∈ F k q gilt uG = u1g1 + . . . + ukgk ∈ C. Sei<br />

nun x ∈ C. Dann existieren u1, . . . , uk ∈ Fq, so dass x = u1g1+. . .+ukgk = uG<br />

mit u = (u1, . . . , uk).<br />

2. Sei C = {uG : u ∈ F k q}. Dann gilt (1, 0, . . . , 0)G = g1, . . . , (0, . . . , 0, 1)G =<br />

gk ∈ C. C wird als Vektorraum aufgespannt von g1, . . . , gk. Da dim(C) = k,<br />

ist g1, . . . , gk eine Basis von C. Und somit ist G Erzeugermatrix für C.


3 LINEARE CODES 20<br />

Beispiel. (a) Der ASCII-Code ist ein binärer [8, 7]-Code mit Erzeugermatrix:<br />

⎛<br />

1<br />

⎜<br />

G = ⎝<br />

.. .<br />

0<br />

⎞<br />

1<br />

⎟<br />

. ⎠<br />

0 1 1<br />

(b) Für den [7, 4]-Hamming Code über F2 ist eine Erzeugermatrix:<br />

⎛<br />

1<br />

⎜<br />

G = ⎜0<br />

⎝1<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

0<br />

1<br />

⎞<br />

0<br />

0 ⎟<br />

0⎠<br />

1 1 1 0 0 0 1<br />

3.7 Satz (Kontrollmatrix). Sei C ein [n, k]-Code über Fn q . Dann existiert<br />

eine (n − k) × n-Matrix H, so dass gilt:<br />

x ∈ F n q : x ∈ C ⇔ Hx t = 0<br />

H heißt Kontrollmatrix von C.<br />

Es gilt: HG t = 0 für jede Erzeugermatrix G des Codes C.<br />

Damit liefert die Kontrollmatrix eine schnelle Art der Fehlererkennung.<br />

⎛ ⎞<br />

Beweis. Sei g1, . . . , gk eine Basis von C und G =<br />

Gleichungssystem mit der Koeffizientenmatrix G:<br />

⎜<br />

⎝<br />

t1g11 + . . . + tng1n = 0<br />

t1gk1 + . . . + tngkn = 0<br />

.<br />

g1<br />

.<br />

gk<br />

⎟<br />

⎠. Betrachte das lineare<br />

Da G den Rang k hat, ist die Dimension des Lösungsraumes ⎛n<br />

− k. ⎞Sei<br />

h1, . . . , hn−k ∈ F n q eine Basis des Lösungsraumes. Setze H =<br />

F (n−k)×n<br />

q . Dann gilt Hg t i<br />

⎜<br />

⎝<br />

h1<br />

.<br />

hn−k<br />

⎟<br />

⎠ ∈<br />

= 0 für alle i = 1, . . . , k. Ist also x ∈ C, so gilt<br />

Hx t = 0. Das heißt C ⊆ ker H. Die Dimension des Kerns von H ist jedoch<br />

k, da Rang(H) = n − k; also dim (ker H) = k = dim C. Daraus folgt, dass<br />

C = ker H. Das bedeutet: Hx t = 0 ⇔ x ∈ C.


3 LINEARE CODES 21<br />

Rezept: Um die Kontrollmatrix eines Codes mit Erzeugermatrix G zu bestimmen,<br />

wird ein homogenes lineares Gleichungssystem mit G als Koeffizientenmatrix<br />

aufgestellt. Die Basis des Lösungsraumes wird bestimmt und<br />

deren Elemente bilden die Zeilen der Kontrollmatrix.<br />

Beispiel. item Für den binären [7, 4]-Hamming-Code ist eine Kontrollmatrix:<br />

⎛<br />

1 0 0 1 0 1<br />

⎞<br />

1<br />

H = ⎝0<br />

1 0 1 1 0 1⎠<br />

0 0 1 0 1 1 1<br />

(So war der binäre [7, 4]-Hamming-Code in 2.5 definiert.)<br />

Sei <br />

1<br />

0<br />

C<br />

1<br />

1<br />

ein binärer<br />

[4, 2]-Code mit der Erzeugermatrix G =<br />

0 1<br />

. Das lineare Gleichungssystem mit der Koeffizientenma-<br />

0 1<br />

trix G hat die Form:<br />

t1 + t2 + t4 = 0<br />

t2 + t4 = 0<br />

Werden t3 und t4 frei gewählt, so sind t1 und t2 festgelegt. Damit bilden<br />

(0101) und (0010) eine<br />

Basis und es ergibt sich folgende Kontrollmatrix:<br />

0 1 0 1<br />

H =<br />

.<br />

0 0 1 0<br />

(b) (a) Die Kontrollmatrix für den ASCII-Code ist (1 1 1 1 1 1 1 1).<br />

Für den ISBN-Code (betrachtet als linearer Code über F11) gilt:<br />

H = (10 9 8 7 6 5 4 3 2 1).<br />

3.8 Satz. Sei C ein nicht-trivialer [n, k]-Code über F n q (d.h. C = {0}, Fq) mit<br />

Kontrollmatrix H. Dann gilt:<br />

d(C) = wt(C)<br />

= min{r ∈ N : es gibt r linear abhängige Spalten in H }<br />

= max{r ∈ N : je r − 1 Spalten in H sind linear unabhängig}<br />

(insbesondere d(C) ≤ rg(H) + 1).<br />

Beweis. Seien h1, . . . , hn die Spalten von H. Da C nicht-trivial ist, existiert<br />

0 = x ∈ C, x = (x1, . . . , xn) mit h1x1 + . . . + hnxn = Hx t = 0. Das heißt,<br />

dass h1, . . . , hn linear abhängig sind.


3 LINEARE CODES 22<br />

Sei w ∈ N minimal, so dass es w linear abhängige Spalten gibt, etwa<br />

hi1, . . . , hiw. Damit existieren cj ∈ Fq mit n j=1 cjhj = 0 und cj = 0 genau<br />

für j = i1, . . . , iw.<br />

Für c = (c1, . . . , cn) ergibt sich Hct = 0, also c ∈ C mit wt(c) = w. Daraus<br />

folgt wt(C) ≤ w. Angenommen es gebe 0 = c ∈ C mit w = wt(c) < w. Dann<br />

folgt aus Hct = 0, dass es w linear abhängige Spalten in H gibt. Dies ist ein<br />

Widerspruch zur Wahl von w. Also wt(C) = w.<br />

Beispiel. Sei C ein [7, 3]-Code über F2 mit Erzeugermatrix<br />

⎛<br />

0 0 1 1 0 1<br />

⎞<br />

1<br />

G = ⎝1<br />

1 0 1 1 0 1⎠<br />

0 1 0 1 0 0 1<br />

Um den Minimalabstand zu erhalten, wird die Kontrollmatrix berechnet.<br />

Zunächst werden die Zeilen in G vertauscht:<br />

⎛<br />

1 1 0 1 1 0<br />

⎞<br />

1<br />

G ∼ ⎝0<br />

1 0 1 0 0 1⎠<br />

0 0 1 1 0 1 1<br />

Daran lässt sich die Kontrollmatrix ablesen:<br />

⎛<br />

0 1 1 0 0<br />

⎜<br />

H = ⎜0<br />

0 1 0 0<br />

⎝1<br />

0 0 0 1<br />

0<br />

1<br />

0<br />

⎞<br />

1<br />

0 ⎟<br />

0⎠<br />

0 1 1 1 0 0 0<br />

Da die erste und die fünfte Spalte linear abhängig sind und es keine Nullspalte<br />

gibt, gilt d(C) = 2.<br />

Nun kann die schon vorher angesprochene Familie der Hamming-Codes definiert<br />

werden:<br />

3.9 Hamming-Codes.<br />

Sei q eine Primzahlpotenz, l ∈ N, n = ql−1 . Dann existiert ein perfekter<br />

q−1<br />

[n, n − l]-Code über Fq mit d(C) = 3, der Hamming-Code.<br />

Konstruktion. F l q enthält ql − 1 viele von 0 verschiedene Vektoren. Je q − 1<br />

von diesen erzeugen den gleichen 1-dimensionalen Unterraum. Also hat F l q<br />

genau n = ql −1<br />

q−1<br />

viele 1-dimensionale Unterräume. Wähle aus jedem einen von<br />

0 verschiedenen Vektor und bilde aus diesen n Spaltenvektoren die (l × n)-<br />

Matrix H. Sei C der Code mit der Kontrollmatrix H:<br />

C = {x ∈ F n q ; Hxt = 0}(Hamming − Code)


3 LINEARE CODES 23<br />

Der Rang von H ist l, da H l linear unabhängige Spalten enthält (Basis von<br />

Fl q ), und größer kann der Rang nicht werden. Daher ist dim C = n − l, d.h.<br />

|C| = qn−l . Je zwei Spalten in H sind linear unabhängig, aber es gibt drei<br />

linear abhängige Spalten. Aus (3.8) folgt d(C) = wt(C) = 3 und somit e = 1.<br />

Es gilt:<br />

1<br />

j=0<br />

Daraus folgt:<br />

<br />

n<br />

(q − 1)<br />

j<br />

j = 1 + n(q − 1) = 1 + ql − 1<br />

(q − 1) = ql<br />

q − 1<br />

q n<br />

q l = qn−l = |C|<br />

und C ist nach 2.4.b) perfekt.<br />

Es gibt jeweils mehrere Möglichkeiten für einen [n, k]-Hamming-Code, da die<br />

Spaltenvektoren von H nicht eindeutig gewählt werden (vgl. aber 3.15.c) ).<br />

Beispiel. (a) Seien q = 2 und l = 3 gegeben. Dann ist n = 23−1 = 7 und<br />

2−1<br />

die Matrix<br />

⎛<br />

⎞<br />

1 0 0 1 0 1 1<br />

H = ⎝0<br />

1 0 1 1 0 1⎠<br />

0 0 1 0 1 1 1<br />

ist Kontrollmatrix des [7, 4]-Hamming-Codes aus 2.5 .<br />

(b) Seien q = 2 und l = 4 gegeben. Dann ist n = 24 −1<br />

2−1<br />

⎛<br />

⎞<br />

1 0 0 0 1 1 1 0 0 0 1 1 1 0 1<br />

⎜<br />

H = ⎜0<br />

1 0 0 1 0 0 1 1 0 1 1 0 1 1 ⎟<br />

⎝0<br />

0 1 0 0 1 0 1 0 1 1 0 1 1 1⎠<br />

0 0 0 1 0 0 1 0 1 1 0 1 1 1 1<br />

= 15 und die Matrix<br />

ist Kontrollmatrix eines [15, 11]-Hamming-Codes, denn n − l = 11.<br />

Decodierung:<br />

Angenommen es wurde der Vektor y = (101101001111010) ∈ F15 2 empfangen.<br />

Mit Hilfe der Kontrollmatrix wird überprüft, ob y ein gültiges<br />

Codewort ist:<br />

Hy t ⎛ ⎞<br />

0<br />

⎜<br />

= ⎜0<br />

⎟<br />

⎝1⎠<br />

1


3 LINEARE CODES 24<br />

Da das Ergebnis nicht der Nullvektor ist, ist y /∈ C. Daher wird ein<br />

x ∈ C gesucht mit d(x, y) minimal. Da C ein 1-Fehler-korrigierender<br />

und perfekter Code ist, existiert genau ein Codewort x mit d(x, y) = 1.<br />

Wie sieht x aus? y unterscheidet sich von x an genau einer Stelle i<br />

(1 ≤ i ≤ 15). Statt yi steht in x an der Stelle i der Eintrag yi + 1, so<br />

dass Hx t = 0 ist. Damit dies erfüllt ist, muss gelten:<br />

Daraus folgt: ⎛<br />

h1i(yi + 1) = h1iyi<br />

h2i(yi + 1) = h2iyi<br />

h3i(yi + 1) = h3iyi + 1<br />

h4i(yi + 1) = h4iyi + 1<br />

⎜<br />

⎝<br />

h1i<br />

h2i<br />

h3i<br />

h4i<br />

⎞<br />

⎟<br />

⎠ =<br />

⎛ ⎞<br />

0<br />

⎜<br />

⎜0<br />

⎟<br />

⎝1⎠<br />

= Hyt<br />

1<br />

Suche also in H die Spalte, die mit (0, 0, 1, 1) t übereinstimmt und<br />

ändere beim Index dieser Spalte den entsprechenden Eintrag von y.<br />

Hier ist i = 10. Damit wird y10 = 1 zu 0 geändert und y wird zu<br />

x = (101101001ˇ011010) ∈ C decodiert. Diese Decodierung ist genau<br />

dann korrekt, wenn in y nur ein Fehler aufgetreten ist.<br />

Allgemeine Decodierung binärer Hamming-Codes: Angenommen es<br />

wurde y empfangen:<br />

1. Fall: Hyt = 0: Decodierung y −→ y.<br />

2. Fall: Hy t = 0: Suche in H diejenige Spalte, die mit Hy t übereinstimmt.<br />

Ist dies die i-te Spalte, so ändere die i-te Komponente von y. Dies liefert<br />

ein x ∈ C. Decodierung: y −→ x.<br />

Wie decodiert man beliebige lineare [n, k]q-Codes? Wurde y empfangen, so<br />

wird dies zu x decodiert mit d(x, y) minimal. Man kann alle qk Codewörter auf<br />

den Abstand zu y testen und von den Codewörtern mit minimalem Abstand<br />

eines zur Decodierung auswählen. Dies ist im Allgemeinen nicht eindeutig.<br />

Bei großen Codes (2k > n) gibt es ein effizienteres Verfahren, die Syndrom-<br />

Decodierung.<br />

Exkurs (Nebenklassen von Unterräumen in Vektorräumen).<br />

Sei C ein Unterraum eines Vekorraums V . Dann heißt für jedes v ∈ V<br />

v + C := {v + x : x ∈ C}<br />

die Nebenklasse von C zu v.


3 LINEARE CODES 25<br />

(a) Für v1, v2 ∈ V gilt entweder v1 +C = v2 +C oder (v1 +C)∩(v2 +C) = ∅.<br />

Beweis: Sei (v1+C)∩(v2+C) = ∅. Dann gibt es ein y ∈ (v1+C)∩(v2+C)<br />

mit y = v1 + x1 = v2 + x2 für x1, x2 ∈ C. Daraus folgt: v1 = v2 + (x2 −<br />

x1) ∈ v2 + C. Für beliebiges x ∈ C ist auch v1 + x = v2 + (x2 − x1) + x ∈<br />

v2 + C. Also ist v1 + C ⊆ v2 + C. Dasselbe Argument, aber mit 1 und 2<br />

getauscht, ergibt v2 + C ⊆ v1 + C. Insgesamt somit v1 + C = v2 + C.<br />

(b) v1 + C = v2 + C ⇔ v1 − v2 ∈ C<br />

Beweis: 1. v1+C = v2+C ⇒ v1 = v1 +0 ∈ v1 +C = v2+C ⇒ v1 = v2 +x<br />

für ein x ∈ C ⇒ v1 −v2 = x ∈ C. 2. Sei v1 −v2 = x ∈ C ⇒ v1 = v2 +x ∈<br />

(v1 + C) ∩ (v2 + C) (a)<br />

⇒ v1 + C = v2 + C.<br />

(c) Für alle v ∈ v1 + C gilt v + C = v1 + C.<br />

(d) Wähle aus jeder Nebenklasse von C einen Vertreter vi:<br />

V = ˙<br />

i vi + C<br />

(e) Sei V ein Vektorraum über einem endlichen Körper Fq. Dann gilt |C| =<br />

|v + C| für alle v ∈ V (da x ↦→ v + x bijektiv ist).<br />

(f) Aus (d) und (e) folgt: Ist C ein [n, k]-Code über Fq, so hat C genau q n−k<br />

viele verschiedene Nebenklassen.<br />

3.10 Syndrom-Decodierung linearer Codes.<br />

Sei C ein [n, k]-Code über Fq mit (n − k) × n-Kontrollmatrix H. Zu y ∈ Fn q<br />

heißt Hyt ∈ Fn−k q das Syndrom von y (bzgl. C und H).<br />

(a) y ∈ C ⇔ Hy t = 0 ⇔ x hat Syndrom 0 (kein ”Krankheitsbild”).<br />

(b) y1 + C = y2 + C ⇔ Hy t 1 = Hyt 2 , d.h. y1, y2 ∈ Fn q liegen genau dann in<br />

der gleichen Nebenklasse bzgl. C , wenn sie das gleiche Syndrom haben.<br />

(y1 + C = y2 + C ⇔ y1 − y2 ∈ C (a)<br />

⇔ 0 = H(y1 − y2) t = Hy t 1 − Hyt 2 ⇔<br />

Hy t 1 = Hy t 2)<br />

(c) Jedes z ∈ F n−k<br />

q<br />

tritt als Syndrom auf.<br />

Daher: Wird x ∈ C gesendet und als y = x + f empfangen (f Fehlervektor),<br />

so haben y und f das gleiche Sydrom (Hy t = Hx t + Hf t = 0 + Hf t ). Damit<br />

liegt f in y + C.<br />

Syndrom-Decodierung: Bestimme in jeder Nebenklasse von C einen Vektor<br />

f von minimalem Gewicht (= Nebenklassenführer (i.A. nicht eindeutig)).


3 LINEARE CODES 26<br />

Stelle eine Liste der Nebenklassenführer von C mit zugehörigem Syndrom auf.<br />

Dafür sind insgesamt (n − k)q n−k + nq n−k Elemente aus Fq zu vergleichen.<br />

(Es gibt q n−k Nebenklassen, die Nebenklassenführer haben n Komponenten<br />

aus Fq und die Syndrome n − k Komponenten aus Fq). Zu empfangenem y<br />

wird das Syndrom Hy t berechnet und der Nebenklassenführer mit gleichem<br />

Syndrom gesucht. Decodierung: y → y − f.<br />

Ist 2k > n, so ist q n−k < q k ; d.h. es sind weniger Vergleiche durchzuführen,<br />

als bei dem vor 3.10 beschriebenen Verfahren.<br />

Beispiel. Sei C ein [5, 3]-Code über F2 mit Kontrollmatrix:<br />

<br />

0 1 0 0 1<br />

H =<br />

.<br />

1 0 1 1 0<br />

Damit gilt (x1, x2, x3, x4, x5) ∈ C, falls die beiden folgenden Gleichungen<br />

erfüllt sind:<br />

x2 + x5 = 0<br />

x1 + x3 + x4 = 0<br />

Und man erhält die Erzeugermatrix:<br />

⎛<br />

0 1 0 0<br />

⎞<br />

1<br />

G = ⎝1<br />

0 0 1 0⎠<br />

.<br />

1 0 1 0 0<br />

Der Code C hat 2 3 = 8 Elemente und 2 n−k = 2 2 = 4 Nebenklassen, die<br />

wie folgt angegeben werden können (die möglichen Nebenklassenführer sind<br />

unterstrichen):<br />

1. (00000) + C = C = {(00000), (01001), (10010), (10100),<br />

(11011), (11101), (00110), (01111)}<br />

2. (10000) + C = {(10000), (11001), (00010), (00100),<br />

(01011), (01101), (10110), (11111)}<br />

3. (01000) + C = {(01000), (00001), (11010), (11100),<br />

(10011), (10101), (01110), (00111)}<br />

4. (11000) + C = {(11000), (01001), (01010), (01100),<br />

(00011), (00101), (11110), (10111)}<br />

Eine mögliche Liste von Nebenklassenführern und zugehörigen Syndromen<br />

kann folgende sein:<br />

Nkl-führer f1 = (00000) f2 = (10000) f3 = (01000) f4 = (11000)<br />

Syndrom Hf t<br />

<br />

0<br />

0<br />

1<br />

1<br />

0<br />

1<br />

0<br />

1


3 LINEARE CODES 27<br />

Wurde zum Beispiel y = (10011) empfangen mit Hy t = 1<br />

, so wird y zu<br />

0<br />

y − f3 = (11011) decodiert.<br />

Die Syndromdecodierung kann bei großen Codes immer noch sehr aufwändig<br />

sein. Zum Beispiel hat ein [70, 50]-Code C über F2 einen Speicherplatzbedarf<br />

für Nebenklassenführer und Syndrome von ca. 11 Megabyte: C hat 2 20<br />

viele Nebenklassen. Jeder Nebenklassenführer besteht aus 70 Bits und die<br />

Syndrome jedes Nebenklassenführers bestehen aus 20 Bits. Man erhält einen<br />

Speicherplatzbedarf von 70·2 20 +20·2 20 = 90·2 20 Bits ≈ 11 Megabyte. (Hätte<br />

man alle 2 50 Codewörter speichern müssen, so läge der Speicherplatzbedarf<br />

bei 70 · 2 50 Bits ≈ 10000 Terabyte).<br />

Der Speicherplatzbedarf lässt sich noch reduzieren, wenn man die Nebenklassenführer<br />

in lexikographischer Ordnung ihrer Syndrome speichert. Dann<br />

müssen die Syndrome nicht mehr gespeichert werden. Bei solchen Größenordnungen<br />

ist eine andere Methode praktischer:<br />

3.11 Schrittweise Decodierung (Step-by-Step-Decodierung).<br />

Bei diesem Verfahren müssen nur die Syndrome der Nebenklassenführer und<br />

deren Gewicht gespeichert werden. Es wird nur der Fall binärer Codes betrachtet:<br />

Sei y ∈ F2 n das empfangene Wort und seien e1, . . . , en die kanonischen Einheitsvektoren<br />

in Fn 2 . Die Decodierung geschieht nach folgendem Algorithmus:<br />

(1) i = 1<br />

(2) Berechne Hy t und stelle das Gewicht w des Nebenklassenführers mit<br />

gleichem Syndrom fest.<br />

(3) Ist w = 0, so gebe y als Decodierung aus. stop.<br />

(4) Hat H(y+ei) t kleineres zugeordnetes Gewicht, so ersetze y durch y+ei.<br />

(5) Setze i := i + 1. goto (2).<br />

Warum terminiert der Algorithmus und liefert ein Codewort? Dazu wird die<br />

lexikographische Ordnung auf F2 definiert durch:<br />

(a1, . . . , an) < (b1, . . . , bn) ⇔ ∃k : ai = bi für i ≤ k, ak+1 = 1, bk+1 = 0<br />

(z.B. ist (01011) < (01001) )<br />

Satz: Schrittweise Decodierung entspricht der Syndrom-Decodierung, wenn<br />

aus jeder Nebenklasse unter den Vertretern mit minimalem Gewicht der lexikographisch<br />

erste als Nebenklassenführer ausgewählt wird.


3 LINEARE CODES 28<br />

Beweis. Der Abstand von y zum nächsten Codewort sei m. Dann hat y + C<br />

einen Nebenklassenführer f von Gewicht m. Sei i die Stelle, an der y zum<br />

ersten Mal geändert wurde, so dass das Gewicht des Nebenklassenführers ˜ f<br />

von (y+ei)+C kleiner als das von y ist. Der Abstand von y+ei zum nächsten<br />

Codewort ist mindestens m − 1. Da (y + ei) + ˜ f ∈ C ist und wt( ˜ f) < wt(f),<br />

folgt wt( ˜ f) = m − 1.<br />

Angenommen man kann y+ei an einer Stelle j ändern, j < i, so dass y+ei+ej<br />

einen Abstand < m − 1 von C hat. Dann hätte y + ej einen Abstand ≤ m − 1<br />

von C, und der Nebenklassenführer zu (y + ej) + C hätte Gewicht ≤ m − 1;<br />

Widerspruch zur Wahl von i.<br />

Somit kann y +ei nur an Stellen j > i geändert werden, um den Abstand von<br />

C zu verringern. Durch Induktion folgt nun, dass der Algorithmus terminiert.<br />

Man sieht sofort, dass y zu y+f decodiert wurde, wobei f ∈ y+C von minimalem<br />

Gewicht und lexikographisch der erste unter allen Nebenklassenführern<br />

ist.<br />

Beispiel. Wir betrachten das Beispiel aus 3.10 :<br />

Nkl-führer f1 = (00000) f2 = (10000) f3 = (01000) f4 = (11000)<br />

Syndrom Hf t<br />

<br />

0<br />

0<br />

1<br />

1<br />

0<br />

1<br />

0<br />

1<br />

Bei der schrittweisen Decodierung würde nur gespeichert werden:<br />

Syndrom<br />

Gewicht Nkl-führer<br />

0<br />

0<br />

0<br />

1<br />

1<br />

0<br />

1<br />

1<br />

1<br />

2<br />

Wurde zum Beispiel y = (10011) empfangen, so werden die folgenden Schritte<br />

zur Decodierung durchlaufen:<br />

y = (10011) : Hy t = 1<br />

wt = 1<br />

0<br />

y + e1 = (00011) : Hy t = 1<br />

wt = 2 (y lassen)<br />

1<br />

y + e2 = (11011) : Hy t = 0<br />

wt = 0 (y so decodieren)<br />

0<br />

y → (11011) = y + f3 ∈ C<br />

Es ist ein schwieriges Problem, allgemeine Aussagen über die Gewichte von<br />

Nebenklassenführern zu machen. Betrachten wir zum Beispiel den oben angesprochenen<br />

[70, 50]-Code. Angenommen die Nebenklassenführer haben alle<br />

Gewicht ≤ 12. Dann benötigt man maximal 4 Bits zur Auflistung der Gewichte<br />

der Nebenklassenführer. Zusammen mit den Syndromen liefert dies<br />

einen Speicherplatzaufwand von 20 · 2 20 + 4 · 2 20 = 24 · 2 20 Bits, eine Reduk-<br />

tion auf ca. 1<br />

4<br />

des Aufwandes für die Syndromdecodierung.


3 LINEARE CODES 29<br />

Allerdings sind hier maximal n = 70 Syndrom-Berechnungen und Gewichtsfeststellungen<br />

in der Liste notwendig - gegenüber einer einzigen bei der Syndromdecodierung.<br />

(Time-Space-Trade-Off!)<br />

Zur Definition der Äquivalenz von Codes wird der Begriff der Isometrie<br />

benötigt:<br />

3.12 Definition (Isometrie). Eine invertierbare n × n-Matrix A über Fq<br />

heißt Isometrie (bzgl. der Hamming-Metrik) von F n q , falls für alle u, v ∈ Fn q<br />

gilt:<br />

(∗) d(uA, vA) = d(u, v)<br />

Wegen d(uA, vA) = d(uA − vA, 0) = d((u − v)A, 0) = wt((u − v)A) ist (∗)<br />

äquivalent zu<br />

(∗∗) wt(uA) = wt(u) für alle u ∈ F n q<br />

Bemerkung. Die Isometrien von Fn q bilden bezüglich der Multiplikation eine<br />

Gruppe.<br />

Beispiele von Isometrien.<br />

(a) Sei Sn die Menge aller Permutationen auf {1, . . . , n} und π eine Permutation<br />

von {1, . . . , n} (also π ∈ Sn). Definiere zu π eine Permutationsmatrix<br />

P (π) = (Pij)i,j=1,...,n durch:<br />

<br />

1 : i = π(j)<br />

Pij =<br />

0 : sonst<br />

Zum Beispiel ist für die Permutation π =<br />

⎛<br />

0 0<br />

⎞<br />

1<br />

⎝1<br />

0 0⎠.<br />

0 1 0<br />

<br />

1 2 3<br />

: P (π) =<br />

2 3 1<br />

Für eine Permutationmatrix P (π) und einen Vektor u ∈ F n q gilt:<br />

(u1, . . . , un)P (π) = (uπ(1), . . . , uπ(n))<br />

Die Permutationsmatrizen bilden eine Untergruppe der Isometrien,<br />

denn<br />

1. wt(u) = wt(uP (π)), d.h. jede Permutationsmatrix ist eine Isometrie<br />

2. P (π) · P (π ′ ) = P (π ◦ π ′ )


3 LINEARE CODES 30<br />

3. P (π) −1 = P (π −1 )<br />

4. In = P (id)<br />

(b) Für ai ∈ Fq\{0} sei D die folgende invertierbare Diagonalmatrix:<br />

⎛<br />

a1<br />

⎜<br />

D = ⎝<br />

. ..<br />

⎞<br />

0<br />

⎟<br />

⎠<br />

0 an<br />

Dann ist für u ∈ F n q : (u1, . . . , un)D = (a1u1, . . . , anun) und wt(u) =<br />

wt(uD). Also sind invertierbare Diagonalmatrizen Isometrien - und sie<br />

bilden auch eine Untergruppe der Isometrien.<br />

(c) Eine Matrix M = D · P (π) aus einer invertierbaren Diagonalmatrix D<br />

und für π ∈ Sn heißt monomiale Matrix. Sie ist eine Isometrie. Und es<br />

gilt:<br />

M monomial ⇔ M hat in jeder Zeile und in jeder Spalte<br />

genau einen Eintrag = 0<br />

Es gilt im Allgemeinen nicht: D · P (π) = P (π) · D, sondern:<br />

⎛ ⎞<br />

⎛<br />

⎞<br />

⎜<br />

⎝<br />

a1<br />

. ..<br />

an<br />

⎟<br />

⎜<br />

⎠ · P (π) = P (π) · ⎝<br />

aπ(1)<br />

. ..<br />

aπ(n)<br />

⎟<br />

⎠ .<br />

Die monomialen Matrizen bilden die sogenannte monomiale Gruppe<br />

M(n, Fq)<br />

3.13 Satz. Die Gruppe der Isometrien stimmt mit der Gruppe der monomialen<br />

Matrizen M(n, Fq) überein.<br />

Beweis. Es ist zu zeigen, dass jede Isometrie eine monomiale Matrix ist. Sei<br />

also A eine Isometrie und ei der i-te Einheitsvektor. Dann ist wt(eiA) =<br />

wt(ei) = 1, d.h. ei und damit auch eiA hat nur einen von 0 verschiedenen<br />

Eintrag. Es existiert also ein i ′ ∈ {1, . . . , n} und ai ∈ Fq\{0}, so dass eiA =<br />

aiei ′.<br />

Da die ei eine Basis bilden, ist die Zuordnung i → i ′ eine Permutation π.<br />

Also:<br />

⎛ ⎞<br />

A =<br />

⎜<br />

⎝<br />

a1<br />

. ..<br />

an<br />

⎟<br />

⎠ · P (π −1 ) monomial.


3 LINEARE CODES 31<br />

3.14 Definition (Äquivalenz von Codes). Zwei Codes C, C ′ ⊆ F n q heißen<br />

äquivalent (C ≈ C ′ ), falls ein A ∈ M(n, Fq) (also eine Isometrie von F n q )<br />

existiert mit:<br />

CA = C ′ .<br />

(d.h. {xA : x ∈ C} = C ′ )<br />

3.15 Bemerkung. (a) Äquivalente Codes haben die gleichen Parameter<br />

(d.h. gleiche Länge, gleiche Anzahl von Elementen und gleichen Minimalabstand).<br />

(b) Seien C und C ′ äquivalente lineare Codes mit CA = C ′ für ein A ∈<br />

M(n, Fq). Dann gilt:<br />

G Erzeugermatrix für C ⇒ GA Erzeugermatrix für C ′<br />

H Kontrollmatrix für C ⇒ H(A t ) −1 Kontrollmatrix für C ′<br />

(GA Erzeugermatrix für C ′ ist klar. xA ∈ C ′ ⇔ x ∈ C ⇔ Hx t = 0 ⇔<br />

H(A t ) −1 A t x t = 0 ⇔ H(A t ) −1 (xA) t = 0).<br />

(c) Elementare Zeilenumformungen an einer Erzeugermatrix bzw. an einer<br />

Kontrollmatrix eines linearen Codes ändern den Code nicht. Spaltenvertauschungen<br />

und Multiplikation von Spalten mit Skalaren = 0<br />

(bei der Erzeuger- oder Kontrollmatrix) ändern den Code zu einem<br />

äquivalenten Code.<br />

Insbesondere: Verschiedene Auswahlen und Anordnungen von Vektoren<br />

= 0 aus sämtlichen 1-dimensionalen Unterräumen von Fk q bei der<br />

Bildung der Kontrollmatrix der Hamming-Codes führt zu äquivalenten<br />

Codes.<br />

(d) Seien C und C ′ lineare Codes der Dimension k über Fn q . Angenommen, es<br />

existiert eine Fq-lineare Abbildung ϕ : C −→ C ′ mit wt(c) = wt(ϕ(c))<br />

für alle c ∈ C. Dann ist C ≈ C ′ , d.h. es existiert eine Isometrie A von Fn q<br />

mit CA = C ′ . (Beachte: Umkehrung ist trivial). Dies ist ein Satz von<br />

MacWilliams; vgl. [MS77], Satz 4.1.2 .<br />

3.16 Satz. Sei C ein [n, k]-Code über Fq. Dann existiert ein zu C äquivalenter<br />

Code C ′ , dessen Erzeugermatrix von folgender Form ist:<br />

G ′ ⎛<br />

1<br />

⎜<br />

= (Ik | B) = ⎝<br />

. ..<br />

0 ∗ . . .<br />

⎞<br />

∗<br />

⎟<br />

⎠<br />

0 1 ∗ . . . ∗<br />

Eine solche Erzeugermatrix ist von Standardform.


3 LINEARE CODES 32<br />

Beweis. Sei G die Erzeugermatrix von C. Die k Zeilen von G sind linear unabhängig.<br />

,,Zeilenrang = Spaltenrang”⇒ G hat k linear unabhängige Spalten.<br />

Durch geeignete Spaltenvertauschung erhält man eine Matrix ˜ G in der die ersten<br />

k Spalten linear unabhängig sind. Durch elementare Zeilenumformungen<br />

kann man ˜ G auf die Form G ′ = (Ik | B) bringen.<br />

Nach 3.15 c) erzeugen G und ˜ G äquivalente Codes und ˜ G und G ′ den gleichen<br />

Code.<br />

Beispiel. Die folgende Matrix sei die Erzeugermatrix eines [5, 3]-Codes<br />

Cüber F2:<br />

⎛<br />

1 1 0 1<br />

⎞<br />

1<br />

G = ⎝1<br />

1 1 1 0⎠<br />

1 1 0 0 1<br />

C hat keine Matrix in Standardform, denn jedes Element in C hat an den<br />

ersten beiden Stellen den gleichen Eintrag. Vertausche zuerst die 2te und 4te<br />

Spalte und wende elementare Zeilenumformungen an:<br />

⎛<br />

1 1 0 1<br />

⎞<br />

1<br />

⎛<br />

1 1 0 1<br />

⎞<br />

1<br />

⎛<br />

1 0 0 1<br />

⎞<br />

1<br />

⎝1<br />

1 1 1 0⎠<br />

⎝0<br />

0 1 0 1⎠<br />

⎝0<br />

1 0 0 0⎠<br />

= G<br />

1 0 0 1 1 0 1 0 0 0 0 0 1 0 1<br />

′<br />

G ′ ist in Standardform und erzeugt einen zu C äquivalenten Code C’.<br />

3.17 Bemerkung. Sei C ein [n, k]-Code über Fq mit Erzeugermatrix G.<br />

Dann kann man qk-viele Originalzeichen codieren. Üblicherweise ordnet man<br />

jedem Originalzeichen genau ein Element (x1, . . . , xk) ∈ Fk q zu. Dieses wird<br />

dann codiert in (x1, . . . , xk)G ∈ C (C = {xG : x ∈ F k q }).<br />

Ist G = (Ik | B) in Standardform, so bleiben bei der Codierung die ersten k<br />

Elemente gleich:<br />

(x1, . . . , xk) ↦−→ (x1, . . . , xk, ∗, . . . , ∗).<br />

Man kann also die Originalnachricht an den ersten k Stellen des Codewortes<br />

ablesen.<br />

Beispiel. Es sei C der [5, 3]-Code über Fq mit der Erzeugermatrix<br />

⎛<br />

1 1 0 1<br />

⎞<br />

1<br />

G = ⎝1<br />

1 1 1 0⎠<br />

1 0 0 1 1<br />

(Dies ist gerade die Matrix aus dem Beispiel 3.16, wenn dort die zweite<br />

und vierte Spalte vertauscht werden.) Die Originalnachrichten sind aus F 3 2 .


3 LINEARE CODES 33<br />

Der Vektor (101) wird zunächst mit G codiert zu (101)G = (01000); oder<br />

allgemeiner:<br />

(a1, a2, a3) ↦−→ (a1 + a2 + a3, a1 + a2, a2, a1 + a2 + a3, a1 + a3)<br />

Nach dem Beispiel in 3.16 hat C eine Erzeugermatrix<br />

G ′ ⎛<br />

1 0 0 1<br />

⎞<br />

1<br />

= ⎝0<br />

1 0 0 0⎠<br />

0 0 1 0 1<br />

in Standardform. Es ist (101)G ′ = (10110) und allgemein:<br />

(a1, a2, a3) ↦−→ (a1, a2, a3, a1, a1 + a3)<br />

Es gilt F 3 2 G = F3 2 G′ = C, aber die Codierung eines Elementes aus F 3 2 ist<br />

unterschiedlich.


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 34<br />

4 Allgemeine Konstruktionsprinzipien<br />

4.1 Definition. Für u, v ∈ F n q , u = (u1, . . . , un), v = (v1, . . . , vn) sei<br />

< u, v >:=<br />

n<br />

uivi = uv t .<br />

i=1<br />

(Für q = 2 gilt: < v, v >= 0 ⇔ wt(v) gerade).<br />

4.2 Bemerkung (Eigenschaften von < ·, · >). Seien u, v, w ∈ F n q und<br />

λ ∈ Fq.<br />

(a) < u + v, w > = < u, w > + < v, w ><br />

(b) < λu, v > = λ < u, v ><br />

(c) < u, v > = < v, u ><br />

Diese Eigenschaften machen < ·, · > zu einer symmetrischen Bilinearform.<br />

(d) < 0, v > = < v, 0 > = 0<br />

(e) Ist u ∈ F n q mit < u, v >= 0 ∀v ∈ F n q , so ist u = 0.<br />

< ·, · > ist somit eine nicht-ausgeartete symmetrische Bilinearform.<br />

Beweis. a) - d) sind leicht.<br />

e) Sei u = (u1, . . . , un) ∈ F n q mit < u, v > = 0 für alle v ∈ F n q ; und sei ei<br />

der i-te Einheitsvektor. Dann gilt ui = < u, ei > = 0 für i = 1, . . . , n. Somit<br />

u = (0, . . . , 0).<br />

4.3 Definition (Dualer Code). Sei C ⊆ Fn q (C braucht kein Unterraum zu<br />

sein). Dann heißt<br />

C ⊥ = {y ∈ F n q<br />

: < y, x > = 0 ∀x ∈ C}<br />

der duale Code zu C. C ⊥ ist immer ein Unterraum, also ein linearer Code.<br />

4.4 Satz. Sei C ein [n, k]-Code über Fq. Dann gilt:<br />

(a) C ⊥ ist ein [n, n − k]-Code über Fq.<br />

(b) (C ⊥ ) ⊥ = C<br />

(c) G ist Erzeugermatrix für C ⇔ G ist Kontrollmatrix für C ⊥<br />

H ist Kontrollmatrix für C ⇔ H ist Erzeugermatrix für C ⊥


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 35<br />

(d) Ist (Ik | A) eine Erzeugermatrix von C (in Standardform), so ist<br />

(−A t | In−k) eine Erzeugermatrix von C ⊥ , also Kontrollmatrix von C.<br />

Beweis. (a) Sei G Erzeugermatrix von C, y ∈ F n q . Dann gilt:<br />

y ∈ C ⊥ ⇔ < x, y > = 0 ∀ x ∈ C<br />

⇔ < xi, y > = 0 für eine Basis x1, . . . , xk von C<br />

⇔ Gy t = 0 (Zeilen von G bilden Basis)<br />

Damit ist G Kontrollmatrix von C ⊥ mit dim(C ⊥ ) = n - rg(G) = n − k.<br />

(b) Klar, dass C ⊆ (C ⊥ ) ⊥ . Für die Dimensionen gilt:<br />

Also gilt die Gleichheit.<br />

dim(C ⊥ ⊥ (a)<br />

) = n − (n − k) = dim C.<br />

(c) Die erste Äquivalenz folgt aus dem Beweis von (a). Mit (b) folgt die<br />

zweite Äquivalenz aus der ersten.<br />

(d) Es gilt:<br />

(−A t | In−k)(Ik | A) t = (−A t | In−k)<br />

<br />

Ik<br />

At <br />

= −A t Ik + In−kA t = 0<br />

Daraus folgt, dass (−A t | In−k) eine Kontrollmatrix von C ist und nach<br />

(c) somit eine Erzeugermatrix für C ⊥ .<br />

4.5 Beispiel (Simplex-Codes).<br />

Für n = qk−1 sind die Hamming-Codes [n, n − k]-Codes über Fq.<br />

q−1<br />

Kontrollmatrix H: Wähle für jede Spalte aus jedem 1-dimensionalen Unterraum<br />

Fk q einen von 0 verschiedenen Vektor.<br />

Sei C der duale Code zum Hamming-Code. Nach 4.4.c) ist H eine Erzeugermatrix<br />

von C. C ist ein [n, k]-Code über Fq und heißt Simplex-Code.<br />

Jedes Codewort = 0 in C hat Gewicht qk−1 , d.h. der Abstand zwischen je<br />

zwei verschiedenen Codeworten ist immer konstant qk−1 , insbesondere d(C)<br />

= qk−1 :<br />

Seien z1, . . . , zk die Zeilen von H, 0 = x = (x1, . . . , xn) ∈ C. Da die Zeilen<br />

von H eine Basis von C bilden, gibt es ai ∈ Fq mit x = a1z1 + . . . + akzk =<br />

k i=1 ai(zi1, . . . , zin). Setze a = (a1, . . . , ak) ∈ Fk q und U = < a > ⊥ = {b ∈<br />

Fk q : abt = 0}. Es ist dim U = dim Fk q − dim < a > = k − 1. Die Anzahl


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 36<br />

der Elemente von U entspricht qk−1−1 vielen Spalten von H. Es gilt xj =<br />

q−1<br />

0 ⇔ k i=1 aizij = 0 ⇔ (z1j . . . zkj) t ∈ U. Damit sind in x genau qk−1−1 viele<br />

q−1<br />

Komponenten xj = 0. Und für das Gewicht gilt:<br />

wt(x) = n − qk−1 − 1<br />

q − 1 = qk−1 (q − 1)<br />

= q<br />

q − 1<br />

k−1 .<br />

Der Simplex-Code ist nicht perfekt, von kleiner Dimension, hat aber großen<br />

Minimalabstand d(C) = q k−1 .<br />

Speziell: Der Simplex-Code C zum [7, 4]-Hamming-Code hat die Erzeugermatrix:<br />

⎛<br />

1 0 0 1 1 0<br />

⎞<br />

1<br />

H = ⎝0<br />

1 0 1 0 1 1⎠<br />

0 0 1 0 1 1 1<br />

C ist ein [7, 3]-Code mit Minimalabstand d(C) = 2 2 = 4 und<br />

C = {(0000000), (1001101), (0101011), (0010111),<br />

(1100110), (0111100), (1011010), (1110001)}<br />

(Andere Anordnungen der Spalten in H führen zu äquivalentem Code.)<br />

Beispiel. (Codierung und Decodierung mit Simplex-Code)<br />

Identifiziere die Buchstaben des Alphabets (I=J) mit den 25 Elementen von<br />

F 2 5 :<br />

A = 00 F = 10 L = 20 Q = 30 V = 40<br />

B = 01 G = 11 M = 21 R = 31 W = 41<br />

C = 02 H = 12 N = 22 S = 32 X = 42<br />

D = 03 I=J=13 O = 23 T = 33 Y = 43<br />

E = 04 K=14 P = 24 U = 34 Z = 44<br />

Der Simplex-Code der Dimension 2 über F5 hat die Länge 52−1 5−1<br />

Erzeugermatrix in Standardform ist:<br />

<br />

1<br />

H =<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

2<br />

1<br />

3<br />

<br />

1<br />

4<br />

= 6, und eine<br />

Ein Element (x, y) ∈ F 2 5 wird mit der Erzeugermatrix des Simplex-Codes<br />

codiert zu:<br />

(x, y)H = (x, y, x + y, x + 2y, x + 3y, x + 4y)<br />

Dieser Simplex-Code hat 5 4 = 625 Nebenklassen in F 6 5 . Daher ist es sinnvoller<br />

anstatt durch Syndrom-Decodierung zu decodieren, die empfangenen Wörter<br />

mit der Liste der 25 Codewörter des [6, 2]-Simplex-Codes zu vergleichen:


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 37<br />

Angenommen, man empfängt:<br />

000000 101111 202222 303333 404444<br />

011234 112340 213401 314012 410123<br />

022413 123024 224130 320241 421302<br />

033142 134203 230314 331420 432031<br />

044321 140432 241043 342104 443210<br />

341243 | 040300 | 342104 | 330241 | 004320<br />

Das erste, zweite, vierte und fünfte Wort ist jeweils kein Codewort. (Eine<br />

Decodierung anhand der jeweils ersten zwei Zeichen ergibt auch keinen Sinn:<br />

34,04,34,33,00 = UEUTA).<br />

Der Minimalabstand des [6, 2]-Simplex-Codes beträgt 5 2−1 = 5. Er ist also 2-<br />

Fehler-korrigierend. Unter der Annahmen, dass in jedem empfangenen Wort<br />

höchstens zwei Fehler aufgetreten sind, wird korrigiert zu:<br />

241043 | 000000 | 342104 | 320241 | 044320<br />

Dies wird decodiert zu 24,00,34,32,04 = PAUSE.<br />

4.6 Satz (Plotkin-Konstruktion). Für i = 1, 2 seien Ci [n, ki]-Codes mit<br />

d(Ci) = di. Dann ist<br />

C1 ∝ C2 := {(x1, x1 + x2) : xi ∈ Ci} ⊆ F 2n<br />

q<br />

ein [2n, k1 + k2]-Code über Fq mit d(C) = min{2d1, d2}.<br />

Beweis. i) Klar, dass C ⊆ F2n q . D.h. C ist von der Länge 2n.<br />

ii) Betrachte die Abbildung:<br />

α : C1 ⊕ C2 = {(x1, x2) : xi ∈ Ci} −→ C<br />

(x1, x2) ↦−→ (x1, x1 + x2)<br />

Die Abbildung α ist linear, injektiv und surjektiv, also ein Vektorraumisomorphismus.<br />

Damit gilt für die Dimension:<br />

dim C = dim C1 ⊕ C2 = k1 + k2.<br />

iii) Was ist d(C)? Ist C = {0}, so ist d1 = d2 = 0. Sei also C = 0 und<br />

0 = x = (x1, x1 + x2) ∈ C. Definiere für z = (z1, . . . , zn) ∈ F n q<br />

als den Träger von z.<br />

T r(z) := {j : zj = 0}


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 38<br />

Ist x2 = 0, so gilt: wt(x) = 2wt(x1) ≥ 2d1 (da x1 = 0).<br />

Ist x2 = 0, so gilt:<br />

wt(x) = wt(x1) + wt(x1 + x2)<br />

≥ wt(x1) + wt(x1) + wt(x2) − 2|T r(x1) ∩ T r(x2)|<br />

≥ wt(x2) = d2<br />

( wt(x1) ≥ |T r(x1) ∩ T r(x2)| )<br />

Also: d(C) ≥ min{2d1, d2}. Mit x1 = 0 und x2 von minimalem Gewicht in C2<br />

oder x2 = 0 und x1 von minimalem Gewicht in C1 wird das Minimum auch<br />

angenommen.<br />

4.7 Beispiel (Binäre Reed-Muller-Codes). (Reed, Muller; 1954)<br />

Seien r, m ∈ N0 mit 0 ≤ r ≤ m gegeben und K = F2. Konstruiere binäre<br />

lineare [2m , r <br />

m−r<br />

i=0 ]-Codes C = RM(r, m) mit d(C) = 2 . Setze<br />

m<br />

i<br />

RM(0, m) = {(0 . . . 0), (1 . . . 1)}, der [2 m , 1]-Wiederholungscode mit<br />

Minimalabstand 2 m .<br />

RM(m, m) = K2m , der [2m , 2m ]-Code mit Minimalabstand 1.<br />

Damit ist der Code für r = 0, r = m und m = 1 schon definiert. Für die<br />

Fälle m > 1 und 1 < r < m wird rekursiv definiert:<br />

Nach 4.6 gilt:<br />

RM(r, m) = RM(r, m − 1) ∝ RM(r − 1, m − 1)<br />

Länge von RM(r, m) ist 2 · 2 m−1 = 2 m<br />

Minimalabstand: d(RM(r, m)) = min{2 · 2 m−1−r , 2 m−1−(r−1) } = 2 m−r<br />

Dimension ist<br />

dim(RM(r, m)) = dim(RM(r, m − 1)) + dim(RM(r − 1, m − 1))<br />

r<br />

<br />

m − 1 r−1<br />

<br />

m − 1<br />

=<br />

+<br />

i<br />

i<br />

i=0<br />

i=0<br />

r−1<br />

<br />

m − 1 m − 1<br />

= 1 +<br />

+<br />

i + 1 i<br />

i=0<br />

r−1<br />

r<br />

<br />

m m<br />

= 1 +<br />

= .<br />

i + 1 i<br />

i=0<br />

i=0


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 39<br />

RM(r, m) heißen binäre Reed-Muller-Codes r-ter Ordnung.<br />

Beispiel. (a) C = RM(1, 2) ist ein binärer [4, 3]-Code mit d(C) = 2 und<br />

C = RM(1, 1) ∝ RM(0, 1)<br />

= {(00), (11), (10), (01)} ∝ {(00), (11)}<br />

= {(0000), (0011), (1111), (1100),<br />

(0101), (0110), (1010), (1001)}<br />

(b) C = RM(1, 3) ist ein binärer [8, 4]-Code bestehend aus |C| = 16<br />

Wörtern mit d(C) = 4 und<br />

C = RM(1, 2) ∝ RM(0, 2)<br />

(c) C = RM(1, 5) ist ein binärer [32, 6]-Code mit d(C) = 16<br />

RM(1, 5) wurde bei den Mariner Expeditionen 6, 7 und 9 zum Mars in<br />

den Jahren 1969 - 1972 eingesetzt, um Bilder zur Erde zu übertragen.<br />

Jedes der 26 = 64 Codewörter entsprach jeweils einer Graustufe. Ein<br />

Bild wurde in ein 600 × 600 Gitter zerlegt und jeder der 360.000 Bildpunkte<br />

in ein Codewort codiert. Wegen 7 ≤ d(C)−1 15 = konnten bis zu<br />

2 2<br />

7 Fehler in einem Codewort (der Länge 32) korrigiert werden. 2<br />

4.8 Satz.<br />

(a) RM(r − 1, m) ⊆ RM(r, m) ∀r ≤ m ∈ N0<br />

(b) (1, . . . , 1) ∈ RM(r, m) ∀r ≤ m ∈ N0<br />

(c) x ∈ RM(1, m), x = (0, . . . , 0), (1, . . . , 1) ⇒ wt(x) = 2 m−1<br />

(vgl. Simplex-Codes)<br />

(d) RM(m−1, m) besteht aus allen Worten des F 2m<br />

2 von geradem Gewicht.<br />

Beweis. (a) Induktion nach m. m = 1 : RM(0, 1) ⊆ RM(1, 1) klar.<br />

m − 1 → m:<br />

(i) r = m : RM(m − 1, m) ⊆ K2m = RM(m, m)<br />

(ii) r < m:<br />

RM(r − 1, m) = RM(r − 1, m − 1) ∝ RM(r − 2, m − 1)<br />

2 vgl. http://spacelink.nasa.gov<br />

IV<br />

⊆ RM(r, m − 1) ∝ RM(r − 1, m − 1)<br />

= RM(r, m).


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 40<br />

(b) Folgt aus (a), da RM(0, m) ⊆ RM(r, m).<br />

(c) Induktion nach m. m = 1 : RM(1, 1) = {(00), (01), (10), (11)} und<br />

wt(01) = wt(10) = 1 = 2 1−1<br />

m > 1 : RM(1, m) = {(x1, x1 + x2) : x1 ∈ RM(1, m − 1), x2 =<br />

(0, . . . , 0), (1, . . . , 1)} = {(x, x), (x, x) : x ∈ RM(1, m − 1)}, wobei x<br />

aus x durch Vertauschen von Nullen und Einsen entsteht.<br />

(i) x = (0, . . . , 0), (1, . . . , 1): wt(x, x) = 2 m−1 .<br />

(ii) x = (0, . . . , 0), (1, . . . , 1):<br />

IV<br />

⇒ wt(x) = wt(x) = 2 m−2<br />

⇒ wt(x, x) = wt(x, x) = 2 m−1 .<br />

(d) Induktion nach m. m = 1 : RM(0, 1) = {(00), (11)} klar.<br />

m − 1 → m:<br />

RM(m − 1, m) = RM(m − 1, m − 1) ∝ RM(m − 2, m − 1)<br />

Ind.<br />

= {(x, x + y) : x ∈ F 2 m−1<br />

Sei c = |T r(x) ∩ T r(y)|. Dann ist<br />

wt(x + y) = wt(x) + wt(y) − 2c.<br />

2<br />

, y ∈ F 2m−1<br />

2 , wt(y) gerade}<br />

Damit ist wt(x, x + y) = wt(x) + wt(x + y) = 2wt(x) + wt(y) − 2c<br />

gerade; und es ist<br />

Und 2 2m −1 = 1<br />

2 22m<br />

dim RM(m − 1, m) =<br />

m−1 <br />

i=0<br />

<br />

m<br />

= 2<br />

i<br />

m − 1.<br />

viele Elemente des F 2m<br />

2 haben gerades Gewicht.<br />

Wir werden uns später noch eingehender mit den Reed-Muller-Codes, vor<br />

allem ihrer Decodierung, befassen. Aufgrund eines einfachen Decodierverfahrens<br />

sind die Reed-Muller-Codes von praktischem Wert.<br />

Als nächstes werden drei weitere Konstruktionsverfahren für Codes vom Typ<br />

”aus alt mach neu” beschrieben.


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 41<br />

4.9 Definition. Sei C ein [n, k]-Code über Fq. Dann heißt<br />

C := {(c1, . . . , cn, cn+1) : ci ∈ Fq, (c1, . . . , cn) ∈ C,<br />

die Erweiterung von C (durch ein parity-check-Symbol).<br />

4.10 Satz. (a) C ist ein linearer [n + 1, k]-Code über Fq mit<br />

(b) Ist C binär (q = 2), dann gilt<br />

d(C) ≤ d( C) ≤ d(C) + 1<br />

d( C) = d(C) + 1 ⇔ d(C) ungerade.<br />

(c) Ist H Kontrollmatrix von C, so ist<br />

⎛<br />

1<br />

⎜<br />

H<br />

⎜<br />

= ⎜<br />

⎝<br />

. . .<br />

H<br />

1<br />

⎞<br />

1<br />

0 ⎟<br />

. ⎠<br />

0<br />

eine Kontrollmatrix von C.<br />

n+1<br />

ci = 0}<br />

Beweis. (a) Klar, dass C ein linearer Code der Länge n + 1 ist. Da | C| =<br />

|C| = q k , folgt dim C = k. Die Aussage über die Minimaldistanz folgt<br />

aus<br />

wt(x) = wt(x1, . . . , xn) + wt(xn+1)<br />

für x = (x1, . . . , xn, xn+1) ∈ C.<br />

(b) ⇐: Sei 0 = ˆx = (c1, . . . , cn+1) ∈ C, so dass wt(ˆx) = d( C). Setze x =<br />

(c1, . . . , cn):<br />

1. cn+1 = 0 ⇒ wt(ˆx) = wt(x) ist gerade. Da d(C) ungerade ist,<br />

existiert ein 0 = y = (d1, . . . , dn) ∈ C mit d(C) = wt(y) < wt(x).<br />

Dann ist ˆy = (d1, . . . , dn, 1) ∈ C mit wt(ˆy) = wt(y) + 1 ≤ wt(x) =<br />

wt(ˆx) = d( C). Also d( C) = wt(ˆy) = wt(y) + 1 = d(C) + 1.<br />

2. cn+1 = 0 ⇒ wt(x) < wt(ˆx) = d( C). Damit ist nach (a) d(C) =<br />

d( C) + 1.<br />

i=1


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 42<br />

⇒: Sei x ∈ C mit wt(x) = d(C). Angenommen d(C) wäre gerade. Dann<br />

wäre ˆx = (c1, . . . , cn, 0) ∈ C. Daraus folgt: d( C) ≤ wt(ˆx) = wt(x) =<br />

d(C) und mit (a) d( C) = d(C). Widerspruch.<br />

(c) (c1, . . . , cn, cn+1) ∈ C ⇔ H(c1, . . . , cn) t = 0 und n+1 i=1 ci = 0<br />

⎛ ⎞ ⎛ ⎞<br />

1<br />

⇔ ⎝<br />

. . .<br />

H<br />

1<br />

0⎠<br />

⎜<br />

⎝<br />

0<br />

c1<br />

.<br />

cn+1<br />

⎟<br />

⎠ = 0.<br />

4.11 Beispiel (erweiterter Hamming-Code). Sei C der [7, 4]-Hamming-<br />

Code über F2; dann ist d(C) = 3. Nach 4.10.b) ist C ein binärer [8, 4]-Code<br />

mit d( C) = 4 und Erzeugermatrix:<br />

⎛<br />

1<br />

⎜<br />

ˆG = ⎜0<br />

⎝1<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

0<br />

⎞<br />

1<br />

1 ⎟<br />

1⎠<br />

1 1 1 0 0 0 1 0<br />

Da C Codewörter der Länge 8 Bit = 1 Byte hat, wird er häufig verwendet.<br />

4.12 Definition. Sei C ein [n, k]-Code über Fq, n ≥ 2 und 1 ≤ i ≤ n.<br />

(a) Č = Či = {(c1, . . . , ci−1, ci+1, . . . , cn) : (c1, . . . , ci−1, 0, ci+1, . . . , cn) ∈ C}<br />

heißt die Verkürzung von C an der Stelle i.<br />

(b) ◦<br />

C = ◦<br />

Ci = {(c1, . . . , ci−1, ci+1, . . . , cn) : ∃ci ∈ Fq mit (c1, . . . , ci, . . . , cn) ∈<br />

C} heißt die Punktierung von C an der Stelle i.<br />

4.13 Satz. Sei C ein [n, k]-Code, n ≥ 2, k ≥ 1.<br />

(a) Či und ◦<br />

Ci sind lineare Codes der Länge n − 1,<br />

Či ⊆ ◦<br />

Ci,<br />

k − 1 ≤ dim Či ≤ dim ◦<br />

Ci≤ k,<br />

d( Či) ≥ d( ◦<br />

Ci) (falls Či = {0}).<br />

(b) dim Či = k − 1 ⇔ ∃(c1, . . . , ci, . . . , cn) ∈ C mit ci = 0.<br />

(c) dim ◦<br />

Ci = k − 1 ⇔ ∃(0, . . . , 0, ci, 0, . . . , 0) ∈ C mit ci = 0.<br />

(Insbesondere dim ◦<br />

Ci = k, falls d(C) ≥ 2).


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 43<br />

(d) Či = ◦<br />

Ci ⇔ (i) ∃(0, . . . , 0, ci, 0, . . . , 0) ∈ C mit ci = 0 oder<br />

(ii) ∀(c1, . . . , cn) ∈ C : ci = 0.<br />

(e) Ist Či = {0}, so ist d( Či) ≥ d(C).<br />

(f) Ist dim ◦<br />

Ci = k (z.B. falls d(C) ≥ 2), so ist d(C) − 1 ≤ d( ◦<br />

Ci) ≤ d(C).<br />

Beweis. (a) Klar bis auf die Dimensionsaussage: Weglassen der i-ten Komponente<br />

der Basisvektoren in C ergibt: dim ◦<br />

Ci ≤ k.<br />

(i) Ist ci = 0 für alle (c1, . . . , cn) ∈ C, so ist dim Či = dim ◦<br />

Ci = k.<br />

(ii) Sei x = (c1, . . . , cn) ∈ C mit ci = 0. Dann existiert eine Basis<br />

x = x1, . . . , xk von C. Es gibt α2, . . . , αk ∈ Fq, so dass x2−α2x1, . . . , xk−<br />

αkx1 an der i-ten Stelle eine Null haben; und sie sind linear unabhängig.<br />

⇒ dim Či ≥ k − 1<br />

(b) dim Či = k − 1 (a)<br />

⇔ | Či| < |C| ⇔ ∃(c1, . . . , cn) ∈ C mit ci = 0.<br />

(c) Die Projektion<br />

π : C −→ ◦<br />

Ci<br />

(c1, . . . , cn) ↦−→ (c1, . . . , ci−1, ci+1, . . . , cn)<br />

ist eine surjektive lineare Abbildung mit dim ◦<br />

Ci = dim C − dim ker π;<br />

wobei ker π = {(0, . . . , 0, ci, 0, . . . , 0) ∈ C}. Daraus folgt:<br />

dim ker π = 1 ⇔ ∃ci = 0, so dass (0, . . . , 0, ci, 0, . . . , 0) ∈ C<br />

(d) Či = ◦<br />

Ci ⇔ dim Či = dim ◦<br />

Ci⇔ dim ◦<br />

Ci= k − 1 oder dim Či = k.<br />

(e) Sei 0 = x = (c1, . . . , ci−1, ci+1, . . . , cn) ∈ Či, wt(x) = d( Či). Dann ist<br />

ˆx = (c1, . . . , ci−1, 0, ci+1, . . . , cn) ∈ C. Damit: d( Či) = wt(x) = wt(ˆx) ≥<br />

d(C).<br />

(f) Sei 0 = y = (c1, . . . , cn) ∈ C, wt(y) = d(C) (Beachte: C = {0}, da<br />

k ≥ 1).<br />

Dann ist ◦ y= (c1, . . . , ci−1, ci+1, . . . , cn) ∈ ◦<br />

Ci; und ◦ y= 0, da sonst<br />

C ∩ {(0, . . . , 0, c, 0, . . . , 0) : c ∈ Fq} = {0}. Also:<br />

d( ◦<br />

Ci) ≤ wt( ◦ y) ≤ wt(y) = d(C).


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 44<br />

Sei 0 = x = (d1, . . . , di−1, di+1, . . . , dn) ∈ ◦<br />

C, wt(x) = d( ◦<br />

Ci).<br />

Dann existiert ˆx = (d1, . . . , di−1, di, di+1, . . . , dn) ∈ C und ˆx = 0. Somit:<br />

d(C) ≤ wt(ˆx) ≤ wt(x) + 1 = d( ◦<br />

C) + 1.<br />

4.14 Beispiele. (a) Sei C = {(0, . . . , 0), (1, . . . , 1), (0, 1, . . . , 1), (1, 0, . . . , 0)}.<br />

C ist [n, 2]-Code über F2 mit d(C) = 1. Es ist<br />

Č1 = {(1, . . . , 1),<br />

((0, . . . , 0) }<br />

<br />

n−1<br />

n−1<br />

und d( Č1) = n − 1. ( In 4.13.e) gibt es also keine Konstante k mit<br />

d( Či) ≤ d(C) + k ).<br />

(b) Betrachte den folgenden Code und zwei verschiedene Punktierungen<br />

über F2:<br />

C = {(1101), (0110), (1011), (0000)}, d(C) = 2<br />

◦<br />

C1= {(101), (110), (011), (000)}, d( ◦<br />

C1) = 2<br />

◦<br />

C2= {(101), (010), (111), (000)}, d( ◦<br />

C2) = 1<br />

Dies zeigt, dass beide Fälle in 4.13.f) auftreten können.<br />

(c) Reed-Muller-Code der Ordnung 1: C = RM(1, m) ist [2 m , m + 1]- Code<br />

über F2 mit d(C) = 2 m−1 .<br />

- Či ist [2 m − 1, m]-Code über F2 mit d( Či) = 2 m−1 :<br />

Es ist RM(1, m) = RM(1, m − 1) ∝ RM(0, m − 1)<br />

(1, . . . , 1) ∈ RM(1, m − 1) ⇒ (1, . . . , 1, 0, . . . , 0) ∈ RM(1, m) und<br />

(0, . . . , 0, 1, . . . , 1) ∈ RM(1, m) 4.13.b)<br />

⇒ dim Či = dim C − 1 = m.<br />

Jedes Codewort = (0, . . . , 0), (1, . . . , 1) in C hat Gewicht 2 m−1 .<br />

Also liefert die Verkürzung außer (0, . . . , 0) nur Codeworte von<br />

Gewicht 2 m−1 . Damit ist d( Či) = 2 m−1 . Či hat die gleichen Parameter<br />

wie der binäre Simplex-Code der Länge 2 m−1 . Man kann<br />

zeigen, dass Či Simplex-Code ist.<br />

- ◦<br />

Ci ist [2 m − 1, m + 1]-Code mit d( ◦<br />

Ci) = 2 m−1 − 1 (für m ≥ 2):<br />

C enthält keine Codewörter vom Gewicht 1 (da m ≥ 2) ⇒ dim ◦<br />

Ci=<br />

dim C = m + 1 (nach 4.13.c) ).


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 45<br />

Die Punktierung von (1, . . . , 1, 0, . . . , 0) bzw. (0, . . . , 0, 1, . . . , 1)<br />

liefert ein Codewort in ◦<br />

Ci vom Gewicht 2 m−1 − 1.<br />

Also nach 4.13.f): d( ◦<br />

Ci) = 2 m−1 − 1.<br />

Wir beweisen nun mit Hilfe der Punktierungstechnik einen Zusammenhang<br />

zwischen n, k und d:<br />

4.15 Satz (Singleton-Schranke). Ist C ein [n, k, d]-Code über Fq, so ist<br />

k ≤ n − d + 1.<br />

Beweis. Induktion nach n.<br />

n = 1 :⇒ d ≤ 1, k ≤ 1 Behauptung richtig.<br />

n > 1: (i) Für d = 1 ist die Behauptung richtig.<br />

(ii) Sei d > 1: Punktiere C. Dies liefert nach 4.13.c) wegen d > 1 einen<br />

[n − 1, k, d (1) ]-Code mit d (1) ≥ d − 1 (nach 4.13.f) ).<br />

Induktion: k ≤ (n − 1) − d (1) + 1 ≤ (n − 1) − d + 1 + 1 = n − d + 1.<br />

(Anschaulich: Punktiere C (d−1)-mal. Dann erhält man einen [n−d+1, k, d ′ ]-<br />

Code, da der Minimalabstand in jedem Schritt ≥ 2 ist. Also n−d+1 ≥ k).<br />

Bemerkung. Die Aussage von 4.15 steht schon in 3.8. Wir haben sie hier<br />

nochmals bewiesen, um die Punktierungsmethode zu verdeutlichen.<br />

4.16 Bemerkung (MDS-Code).<br />

Ein [n, k, d]-Code mit k = n − d + 1 heißt MDS-Code (maximum distance<br />

separable).<br />

Der Begriff lässt sich folgendermaßen erklären:<br />

Ist C irgendein [n, k, d]-Code, so gibt es Indizes 1 ≤ j1, . . . , jk ≤ n, so dass<br />

gilt:<br />

(∗) Sind c = (c1, . . . , cn), c ′ = (c ′ 1 , . . . , c′ n ) ∈ C mit cj1 = c ′ , . . . , cjk =<br />

j1<br />

c ′ jk , so ist c = c′ . D.h.: Ist π die Projektion auf die Koordinaten<br />

j1, . . . , jk, so ist |π(C)| = |C| = qk .<br />

Denn die Erzeugermatrix G von C enthält (wegen Zeilenrang = Spaltenrang)<br />

k linear unabhängige Spalten. Und die quadratische Matrix, die man aus G<br />

durch Auswahl dieser k Spalten erhält, hat (wegen Zeilenrang = Spaltenrang)<br />

wieder k linear unabhängige Zeilen. Daraus folgt die Aussage.<br />

Nun gilt:<br />

C ist MDS-Code ⇔<br />

(∗) gilt für alle k-Tupel von Indizes<br />

(j1, . . . , jk). (D.h. beliebige k Koordinaten<br />

trennen verschiedene Codewörter).


4 ALLGEMEINE KONSTRUKTIONSPRINZIPIEN 46<br />

Beweis. ⇒: Nach Beweis von 4.15 liefert die Punktierung an d − 1 beliebigen<br />

Stellen einen Code der Dimension k. Ist n − k + 1 = k, so folgt<br />

die Behauptung.<br />

⇐: Ist 0 = c = (c1, . . . , cn) ein Codewort, so enthält c höchstens k − 1 viele<br />

Nullen (denn wenn es k viele Nullen enthält, so unterscheidet es sich<br />

an k Stellen nicht vom Nullvektor). Also wt(c) ≥ n−(k −1) und damit<br />

d ≥ n − k + 1. Nach 4.15 ist andererseits d ≤ n − k + 1, also Gleichheit.<br />

MDS-Codes sind relativ selten; Beispiele werden wir später noch kennenlernen.<br />

Es gilt z.B.:<br />

Ist C ein binärer MDS-Code mit Parametern n, k und d, so ist entweder<br />

C = {(0, . . . , 0), (1, . . . , 1)} (n = d, k = 1) oder C = Fn 2 (n = k, d = 1) oder<br />

C = {c ∈ Fn 2 : wt(c) gerade} (k = n − 1, d = 2).<br />

D.h. für K = F2 gibt es überhaupt keine interessanten MDS-Codes.


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 47<br />

5 Reed-Muller-Codes und<br />

Majority-Logic-Decodierung<br />

Um ein wichtiges Decodierverfahren, Majority-Logic-Decodierung, am Beispiel<br />

der Reed-Muller-Codes zu beschreiben, benötigen wir eine andere Beschreibung<br />

der Reed-Muller-Codes durch Boolesche Polynome.<br />

5.1 Definition (Boolesche Funktionen).<br />

Wir betrachten Funktionen f : Fm 2 −→ F2. Davon gibt es genau 2 |Fm 2 | =<br />

22m viele. Jede solche Boolesche Funktion f(x1, . . . , xm) lässt sich durch eine<br />

Wertetabelle beschreiben:<br />

xm 0 0 0 0 . . . 1 1 1 1<br />

xm−1 0 0 0 0 1 1 1 1<br />

. . . . . . . . .<br />

x3 0 0 0 0 1 1 1 1<br />

x2 0 0 1 1 0 0 1 1<br />

x1 0 1 0 1 . . . 0 1 0 1<br />

f(x1, . . . , xm) ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗<br />

Im rechten oberen Teil stehen als Spalten die 2m Vektoren des Fm 2 , geordnet<br />

(von unten nach oben) nach aufsteigender Größe der Binärzahlen.<br />

An den ∗-Positionen stehen die Werte von f an den entsprechenden Vektoren<br />

des Fm 2 , d.h. ∗ ∈ {0, 1}.<br />

Diese Funktionen bilden mit punktweiser Addition und Multiplikation einen<br />

Ring. Man kann zeigen, dass jede solche Funktion eine Polynomfunktion ist.<br />

Was bedeutet das? Ein Beispiel einer Polynomfunktion ist folgendes:<br />

f(x1, x2, x3) = 1 + x1 + x1x2 + x2x3<br />

(Add. und Mult. in F2, d.h. x 2 i = xi und xixj = xjxi).<br />

Jede Polynomfunktion ist eine F2-Linearkombination der Monome<br />

(∗) 1, x1, x2, . . . , xm, x1x2, x1x3, . . . , x1xm,<br />

x2x3, . . . , xm−1xm, x1x2x3, . . . , x1x2 . . . xm<br />

Davon gibt es 2m viele (= Anzahl der Teilmengen von {x1, . . . , xm}), und sie<br />

sind über F2 linear unabhängig. Also gibt es 22m viele Polynomfunktionen.<br />

Und aus Anzahlgründen lässt sich jede Funktion Fm 2 −→ F2 als Polynomfunktion<br />

schreiben.<br />

Der Grad einer Polynomfunktion ist der höchste Grad der in der eindeutigen<br />

Linearkombination über F2 (mit Koeffizient 1) auftretenden Monome aus (∗);<br />

und der Grad eines der Monome in (∗) ist die Anzahl der auftretenden xi.


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 48<br />

Wie schreibt man eine gegebene Funktion f als Polynomfunktion?<br />

Werden 0 und 1 als Wahrheitswerte interpretiert, so gilt:<br />

und damit<br />

f =<br />

· entspricht ∧ (und)<br />

+ entspricht XOR<br />

1 + f entspricht ¬f<br />

f + g + fg entspricht f ∨ g<br />

<br />

( <br />

{a∈Fm 2 : f(a)=1} {j: aj=1}<br />

xj ∧ <br />

{j: aj=0}<br />

¬xj)<br />

Beispiel. Die Funktion f : F 3 2 −→ F2 ist durch folgende Wertetabelle gegeben:<br />

x3 0 0 0 0 1 1 1 1<br />

x2 0 0 1 1 0 0 1 1<br />

x1 0 1 0 1 0 1 0 1<br />

f(x1, x2, x3) 0 0 0 1 1 0 0 0<br />

↑ ↑<br />

und lässt sich mit + und · umschreiben:<br />

f = x1x2¬x3 ∨ ¬x1¬x2x3<br />

= x1x2(1 + x3) + (1 + x1)(1 + x2)x3 + x1x2x3(1 + x1)(1 + x2)(1 + x3)<br />

= x1x2 + x1x2x3 + x3 + x1x3 + x2x3 + x1x2x3 + 0<br />

= x3 + x1x2 + x1x3 + x2x3<br />

Der Grad eines Monoms xi1 . . . xik mit i1 < . . . < ik ist k. Der Grad eines<br />

Polynoms f ist das Maximum der Grade der Monome in der Darstellung von<br />

f als Linearkombination der Monome (∗), die mit Koeffizient 1 vorkommmen.<br />

Nun ordnen wir jeder Booleschen Funktion f : Fm 2 −→ F2 (also jedem Booleschen<br />

Polynom) den Vektor f ∈ F2m 2 zu, der die letzte Zeile in der Wertetabelle<br />

von f ausmacht (also die Folge der Funktionswerte). Für m = 3 ist


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 49<br />

beispielsweise:<br />

f =(00011000) (aus obigem Beispiel)<br />

x1 =(01010101)<br />

x3 =(00001111)<br />

x1 x2 =(00010001)<br />

x1 x2 + x3 =(00011110)<br />

5.2 Definition. Für 0 ≤ r ≤ m sei R(r, m) ein linearer Code der Länge 2 m<br />

über F2, definiert durch:<br />

R(r, m) := {f ∈ F 2m<br />

2 : f : F m 2 −→ F2 Polynomfunktion vom Grad ≤ r}<br />

Beispiel. (a) R(0, m) = {1, 0} = {(1, . . . , 1), (0, . . . , 0)} = RM(0, m)<br />

(b) R(1, 3) = <br />

1, x1, x2, x3 Dabei sind<br />

x1 =(01010101)<br />

x2 =(00110011)<br />

x3 =(00001111)<br />

und in R(1, 3) sind alle Linearkombinationen der drei Vektoren (z.B.<br />

x2 + x3 = (00111100)) und deren Komplemente (d.h. +1) enthalten.<br />

Damit stimmen R(1, 3) und RM(1, 3) überein.<br />

5.3 Satz. R(r, m) = RM(r, m).<br />

Beweis. Sei f ∈ R(r + 1, m + 1), f = f(x1, . . . , xm+1) Polynom vom Grad<br />

≤ r + 1 mit<br />

f(x1, . . . , xm+1) = g(x1, . . . , xm) + xm+1h(x1, . . . , xm)<br />

( grad(g)≤ r + 1, grad(h) ≤ r ). Seien g und h die Vektoren der Länge 2 m in<br />

R(r + 1, m) bzw. R(r, m) mit g = (c1, . . . , c2 m) und h = (d1, . . . , d2 m).<br />

Als Polynome in x1, . . . , xm+1 betrachtet liefert g dann das Codewort<br />

und<br />

(c1, . . . , c2 m, c1, . . . , c2 m)<br />

xm+1h(x1, . . . , xm) = (0, . . . , 0, 1, . . . , 1)(d1, . . . , d2 m, d1, . . . , d2 m)<br />

= (0, . . . , 0, d1, . . . , d2 m).


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 50<br />

Also ist f = (c1, . . . , c2m, c1 + d1, . . . , c2m + d2m). Und damit gilt die Rekursionsformel R(r+1, m+1) = R(r+1, m) ∝ R(r, m).<br />

Ausserdem ist R(0, m) = RM(0, m) und R(m, m) = RM(m, m), d.h. die<br />

Anfangsbedingungen stimmen ebenfalls überein. Es folgt jetzt<br />

5.4 Satz. Für 0 ≤ r ≤ m − 1 ist<br />

R(r, m) = RM(r, m).<br />

RM(r, m) ⊥ = RM(m − r − 1, m).<br />

(Insbesondere ist RM(r, 2r +1) ein selbstdualer Code der Dimension 2 2r und<br />

der Länge 2 2r+1 ).<br />

Beweis. Sei f = (a1, . . . , a2m) ∈ RM(r, m) und g = (b1, . . . , b2m) ∈ RM(m −<br />

r − 1, m), wobei f(x1, . . . , xm) vom Grad ≤ r, g(x1, . . . , xm) vom Grad ≤<br />

m − r − 1.<br />

Dann ist grad (f ·g) ≤ m−r−1+r = m−1. Damit ist f · g ∈ RM(m−1, m)<br />

und hat nach 4.8.d) gerades Gewicht.<br />

Da f · g = (a1b1, . . . , a2mb2m) somit eine gerade Anzahl von Einsen hat, ist<br />

Also:<br />

Weiter gilt:<br />

2<br />

<br />

f, g =<br />

m<br />

<br />

aibi = 0 (gerechnet in F2).<br />

i=0<br />

(∗) RM(m − r − 1, m) ⊆ RM(r, m) ⊥ .<br />

dim RM(r, m) ⊥ = 2 m − dim RM(r, m)<br />

= 2 m −<br />

r<br />

i=0<br />

m<br />

i<br />

<br />

=<br />

m−r−1 <br />

i=0<br />

= dim RM(m − r − 1, m).<br />

<br />

m<br />

i<br />

Aus Dimensionsgründen gilt also in (∗) schon die Gleichheit.<br />

Die binären Hamming-Codes Hm sind perfekte [2 m − 1, 2 m − 1 − m]-Codes.<br />

Sei Hm der erweiterte binäre Hamming-Code, also ein [2 m , 2 m −1−m]-Code.<br />

Jedes Wort in Hm hat gerades Gewicht. Aus 5.4 folgt nun:


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 51<br />

5.5 Folgerung. Sei m ≥ 2. Dann ist<br />

RM(m − 2, m) = Hm.<br />

Beweis. Wir zeigen RM(1, m) = H ⊥ m. Dann gilt nach 5.4 und 4.4.b):<br />

RM(m − 2, m) = RM(1, m) ⊥ = ( H ⊥ m )⊥ = Hm.<br />

⊆: Sei 0 = y ∈ RM(1, m), a ∈ Hm, a = (a1, . . . , a2 m).<br />

Ist y = (1, . . . , 1), so ya t = 0, da wt(a) gerade. Also y ∈ Hm.<br />

Sei y = (1, . . . , 1). Angenommen die letzte Komponente von y ist Null, d.h.<br />

y = (y1, . . . , y2m−1, 0). Dann ist y = (y1, . . . , y2m−1) ∈ ( RM(1, ˇ m))2m 4.14.c)<br />

=<br />

Simplex-Code der Länge 2m − 1 und Dimension m = dualer Code zu Hm.<br />

Also:<br />

⎛ ⎞<br />

Und damit:<br />

Also: y ∈ H ⊥ m .<br />

(y1, . . . , y2m ⎜<br />

−1) ⎝<br />

a1<br />

.<br />

a2 m −1<br />

< y, a >= (y1, . . . , y2m ⎜<br />

−1, 0) ⎝<br />

⎟<br />

⎠ = 0.<br />

⎛<br />

a1<br />

.<br />

a2 m<br />

⎞<br />

⎟<br />

⎠ = 0.<br />

∈RM(1,m)<br />

<br />

Ist die letzte Komponente von y gleich Eins, so gilt y = y + (1, . . . , 1) ∈ H⊥ m ,<br />

da y letzte Komponente Null hat, also y = y + (1, . . . 1) ∈ H⊥ m .<br />

Daher: RM(1, m) ⊆ H⊥ m.<br />

Für die Dimension gilt: dim RM(1, m) = m + 1 = 2 m − (2 m − m − 1) =<br />

2 m − dim Hm = dim H ⊥ m.<br />

Wie im vorigen Beweis folgt, dass RM(1, m) = H ⊥ m.<br />

Wir benötigen noch eine dritte Beschreibung der Reed-Muller-Codes. Dazu<br />

müssen wir Fm 2 als affinen Raum betrachten:<br />

5.6 Fm 2 als affiner Raum.<br />

Fm 2 ist ein m-dimensionaler Vektorraum über F2. Jeder k-dimensionale Untervektorraum<br />

C von Fm 2 lässt sich als Lösungsmenge eines Systems homogener<br />

Gleichungen mit m − k vielen Gleichungen beschreiben: Ist H die Kontrollmatrix<br />

von C, dann gilt<br />

a ∈ C ⇔ Ha t = 0


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 52<br />

Wenn man Fm 2 als affinen Raum betrachtet (oft mit A(m, 2) bezeichnet), so<br />

sind die affinen Unterräume gerade die Nebenklassen y + C, y ∈ Fm 2 , von<br />

Untervektorräumen C von Fm 2 .<br />

y + C<br />

y1<br />

y<br />

y − y1<br />

Ist dim C = m, so sagt man: y + C ist affiner Unterraum der Dimension m.<br />

• affine Unterräume der Dim. 0 : {y}, das sind 1-elementige Teilmengen<br />

von Fm 2 , also sämtliche Punkte.<br />

• affine Unterräume der Dim. 1 : {y, y +z}, z = 0, das sind 2-elementigen<br />

Teilmengen von F m 2<br />

• affine Unterräume der Dim. 2 : y + {0, z1, z2, z1 + z2}, 0 = z1 = z2 = 0,<br />

das sind alle 4-elementigen Teilmengen mit Summe der Vektoren = 0.<br />

Ist C ein k-dimensionaler Untervektorraum mit Kontrollmatrix H (eine (m−<br />

k) × m-Matrix), so gilt für y ∈ F m 2 :<br />

z ∈ y + C ⇔ Hz t = Hy t<br />

<br />

fester m − k-Vektor<br />

d.h. k-dimensionale affine Unterräume lassen sich als Lösungsmengen inhomogener<br />

Gleichungssysteme beschreiben (mit m−k vielen Gleichungen, deren<br />

Koeffizientenvektoren linear unabhängig sind).<br />

5.7 Bemerkung. (a) Sei y = (y1, . . . , ym) ∈ F m 2 . Ordne y diejenige Zahl<br />

z(y) ∈ [0, . . . , 2 m − 1] zu, deren Binärdarstellung durch y wird (gelesen<br />

von links nach rechts!):<br />

z(y) =<br />

m<br />

yi2 i−1<br />

i=1<br />

C


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 53<br />

(In der Wertetabelle der Booleschen Funktionen waren die Elemente<br />

von Fm 2 gerade - in den Spalten und von unten nach oben zu lesend<br />

- in aufsteigender Reihenfolge der z(y) angeordnet). Das heißt, in der<br />

Wertetabelle kommt y genau an der Stelle z(y) vor; als Beispiel für F3 2 :<br />

x3 0 0 0 0 1 1 1 1<br />

x2 0 0 1 1 0 0 1 1<br />

x1 0 1 0 1 0 1 0 1<br />

z(y) 0 1 2 3 4 5 6 7<br />

Zum Beispiel ist z(y) = 3 für y = (110).<br />

(b) Es gibt eine 1-1-Beziehung zwischen:<br />

1. Boolesche Funktionen F m 2 −→ F2 (= Boolesche Polynome)<br />

2. Vektoren des F2m 2<br />

3. Teilmengen des Fm 2<br />

Die folgenden Abbildungen stellen die 1-1-Beziehung her:<br />

1. → 2: f ↦−→ f<br />

2. → 3: a ↦−→ Ma = {y ∈ F m 2 : az(y) = 1}<br />

3. → 1: M ↦−→ χM (charakteristische Funktion)<br />

<br />

1, a ∈ M<br />

χM(a) =<br />

0, a ∈ M<br />

Beispiel. f : F 3 2 −→ F2 gegeben durch folgende Wertetabelle:<br />

x3 0 0 0 0 1 1 1 1<br />

x2 0 0 1 1 0 0 1 1<br />

x1 0 1 0 1 0 1 0 1<br />

f(x1, x2, x3) 0 0 1 0 1 1 0 0<br />

M = {y ∈ F m 2 : f z(y)<br />

f<br />

↓<br />

f = (00101100)<br />

↓<br />

= 1} = {(010), (001), (101)}<br />

↓<br />

χM = f


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 54<br />

5.8 Satz. Sei 0 ≤ r ≤ m. Dann gilt<br />

RM(r, m) = span{χ M ∈ F 2m<br />

2 : M ist affiner Unterraum der Dim. d ≥ m−r}.<br />

Beweis. ⊇ Sei M ein (m − k)-dimensionaler affiner Unterraum von F m 2 ,<br />

k ≤ r. Dann existiert eine k × m-Matrix H über F2 und b =<br />

(b1, . . . , bk) t ∈ F k 2 mit:<br />

y = (y1, . . . , ym) ∈ M ⇔ Hy t = b (5.6),<br />

d.h. M lässt sich als Lösungsmenge der k Gleichungen<br />

h11x1 + . . . +h1mxm − b1 + 1 = 1<br />

.<br />

hk1x1 + . . . +hkmxm − bk + 1 = 1<br />

beschreiben. Setze li(x1, . . . , xm) = hi1x1 + . . . + himxm − bi + 1 (Boolesches<br />

Polynom vom Grad 1) und<br />

p(x1, . . . , xm) =<br />

k<br />

li(x1, . . . , xm)<br />

i=1<br />

(Polynom vom Grad k ≤ r). Nun gilt:<br />

p(y1, . . . , ym) = 1 ⇔ li(y1, . . . , ym) = 1 ∀i = 1, . . . , k<br />

⇔ (y1, . . . , ym) ∈ M<br />

Also: p = χ M , d.h. χ M ∈ RM(r, m) nach 5.3 .<br />

⊆ RM(r, m) = span{p : p Monom vom Grad ≤ r}.<br />

Zeige: Ist p Monom vom Grad k ≤ r, so ist p charakteristischer Vektor<br />

eines (m − k)-dimensionalen affinen Unterraums von F m 2 .<br />

Ist nämlich p = xi1 . . . xik , i1 < . . . < ik, so ist p = χ mit M =<br />

M<br />

{(y1, . . . , ym) : yi1 = . . . = yik = 1}, affiner Unterraum der Dimension<br />

m − k.<br />

Beachte: Nicht jedes f ∈ RM(r, m) ist charakteristischer Vektor eines ddimensionalen<br />

affinen Unterraums, d ≥ m − r. Man kann sogar zeigen:<br />

5.9 Satz. Die Codewörter = 0 von minimalem Gewicht in RM(r, m) sind<br />

genau die charakteristischen Vektoren der (m−r)-dimensionalen affinen Unterräume<br />

von Fm 2 . Sie spannen RM(r, m) auf.


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 55<br />

Beweis. [MS77], Chap. 13, §6 Th. 8,12 .<br />

(Beachte: Für p = xi1 . . . xik ist wt(p) = 2m−k , denn es gibt 2 m−k viele Vektoren<br />

in F m 2 , die an den Stellen i1, . . . , ik eine 1 stehen haben; Monome von<br />

Grad r liefern Codewörter von Minimalgewicht 2 m−r . In aller Regel gibt es<br />

mehr Codewörter vom Gewicht 2 m−r , die dann von Polynomen, die keine<br />

Monome sind, erzeugt werden.)<br />

Beispiel. RM(1, 3) = H3 (vgl. 5.5). Die Vektoren von minimalem Gewicht<br />

sind nach 5.9 von der Form χ , wobei M ein 3-1 = 2-dimensionaler affi-<br />

M<br />

ner Unterraum von F3 2 ist. Nach 5.6 kann man eine beliebige 3-elementige<br />

Teilmenge von F3 2 und einen vierten Vektor so wählen, dass deren Summe<br />

gleich Null ist. So erhält man alle 2-dimensionalen affinen Unterräume von<br />

F3 (8<br />

2 . Es gibt also 3)<br />

4 = 14 viele 2-dimensionale affine Unterräume von F32 . Sie<br />

entsprechen den 14 Vektoren minimalen Gewichts 23−1 = 4 in H3.<br />

Explizit: Sei<br />

Dann sind<br />

Damit ist<br />

M = {(100), (110), (011), (001)} = {y1, y2, y3, y4}.<br />

z(y1) = 1, z(y2) = 3, z(y3) = 6, z(y4) = 4.<br />

χ M = (0 1 0 1 1 0 1 0) ∈ RM(1, 3) = H3<br />

und vom Gewicht 4. Und x1 + x3 ist das zugehörige Polynom (kein Monom<br />

vom Grad 1). Alle 14 Polynome vom Grad 1 liefern Codewörter von minimalem<br />

Gewicht. (Das gilt im Allgemeinen nicht).<br />

5.10 Majority-(Logic)-Decodierung.<br />

Definition. Sei C ein [n, k]-Code, y (1) , . . . , y (l) ∈ C⊥ (d.h. 〈y (j) , x〉 = 0 für<br />

j = 1, . . . , l und x ∈ C), y (j) = (y (j)<br />

1 , . . . , y (j)<br />

n ).<br />

y (1) , . . . , y (l) heißen orthogonal bezüglich Position i (i ∈ {1, . . . , n}), falls gilt:<br />

(1) y (j)<br />

i<br />

= 1 für alle j = 1, . . . , l.<br />

(2) Ist k = i, so ist y (j)<br />

k = 0 für höchstens ein j.<br />

Wie kann man solche Elemente zur Decodierung nutzen ?<br />

Angenommen x ∈ C wurde gesendet und man empfängt ein Wort<br />

z = (z1, . . . , zn) ∈ Fn q<br />

, das t Fehler enthält, wobei t ≤ 1<br />

2 l.


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 56<br />

Die Positionen zk1, . . . , zkt seien fehlerhaft.<br />

1.Fall: zi ist fehlerhaft, etwa zi = zk1.<br />

Aus Teil (2) der obigen Definition folgt, dass es maximal t − 1 viele y (j) gibt,<br />

die an einer der Stellen k2, . . . , kt einen Eintrag = 0 haben.<br />

Die übrigen l − (t − 1) vielen y (j) haben an den Stellen k2, . . . , kt den Eintrag<br />

0 und an der Stelle i einen Eintrag = 0.<br />

Für diese l − (t − 1) vielen y (j) liefert also der Ausdruck<br />

〈y (j) , z〉 = y (j)<br />

1 z1 + · · · + y (j)<br />

i zi + · · · + y (j)<br />

n zn<br />

einen Wert = 0, denn nur die Änderung an der Stelle i (xi in zi) ist für diese<br />

y (j) bemerkbar. (Beachte, dass y (j)<br />

1 x1 + · · · + y (j)<br />

i xi + · · · + y (j)<br />

n xn = 0.)<br />

2. Fall: zi ist korrekt.<br />

Es gibt maximal t viele y (j) , die an einer der Stellen k1, . . . , kt einen Eintrag<br />

= 0 haben.<br />

Die übrigen l − t vielen y (j) haben an diesen Stellen Eintrag 0. Der Ausdruck<br />

〈y (j) , z〉 = y (j)<br />

1 z1 + · · · + y (j)<br />

n zn<br />

liefert also für diese y (j) den gleichen Wert wie y (j)<br />

1 x1 + · · · + y (j)<br />

n xn, also 0.<br />

Fasst man die Fälle 1 und 2 zusammen, so ergibt sich:<br />

〈y (j) <br />

≤ t Werte von j, falls zi korrekt<br />

, z〉 = 0 für<br />

≥ l − (t − 1) Werte von j, falls zi fehlerhaft<br />

Nach Voraussetzung ist t ≤ 1l,<br />

d.h. l − (t − 1) > t. Daher liefert die Anzahl<br />

2<br />

der Werte = 0 von 〈y (j) , z〉 die Entscheidung, ob zi korrekt ist oder nicht:<br />

Sind maximal 1l<br />

Fehler aufgetreten, so gilt:<br />

2<br />

Mehrheit der Werte 〈y (j) , z〉 ungleich 0 genau dann, wenn zi fehlerhaft.<br />

(Majority-Logic-Decodierung)<br />

Im binären Fall kann natürlich zi korrigiert werden, wenn es fehlerhaft ist.<br />

Beispiel. Sei C der [7,3]-Simplex-Code (der duale Code zum [7,4]-Hamming-<br />

Code über F2).<br />

Eine Kontrollmatrix für C ist eine Erzeugermatrix des [7,4]-Hamming-Codes,<br />

also ⎛<br />

⎜<br />

⎝<br />

1 1 0 1 0 0 0<br />

0 1 1 0 1 0 0<br />

1 0 1 0 0 1 0<br />

1 1 1 0 0 0 1<br />

⎞<br />

⎟<br />


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 57<br />

(vgl. Beispiel nach 3.6).<br />

Wir wählen y (1) als erste Zeile, y (2) als dritte Zeile und y (3) als Summe der<br />

zweiten und vierten Zeile der Matrix, d.h.<br />

y (1) = (1101000)<br />

y (2) = (1010010)<br />

y (3) = (1000101)<br />

Dann sind y (1) , y (2) , y (3) ∈ C ⊥ orthogonal bezüglich Position 1. Mit Hilfe<br />

dieser Vektoren können wir Position 1 eines empfangenen Wortes auf<br />

Korrektheit überprüfen, falls maximal 1 Fehler aufgetreten ist.<br />

Wird z.B. z = (0100110) empfangen und ist 1 Fehler aufgetreten, so berechnen<br />

wir:<br />

〈y (1) , z〉 = 1, 〈y (2) , z〉 = 1, 〈y (3) , z〉 = 1.<br />

Die Mehrheit der Werte ist ungleich 0, also ist z1 = 0 fehlerhaft. Das<br />

gesendete Wort ist also (da nur 1 Fehler aufgetreten ist) x = (1100110).<br />

Wird z = (0110010) empfangen und ist maximal 1 Fehler aufgetreten, so<br />

berechnen wir:<br />

〈y (1) , z〉 = 1, 〈y (2) , z〉 = 0, 〈y (3) , z〉 = 0.<br />

Die Mehrheit der Werte ist gleich 0, also ist z1 = 0 korrekt.<br />

Wir verallgemeinern jetzt die Definition aus 5.10, und zwar der Einfachheit<br />

halber nur für binäre Codes.<br />

5.11 Definition. Sei C ein binärer [n, k]-Code, y (1) , . . . , y (l) ∈ C⊥ , y (j) =<br />

(y (j)<br />

1 , . . . , y (j)<br />

n ).<br />

y (1) , . . . , y (l) heißen orthogonal bezüglich der Positionen i1, . . . , is, falls gilt:<br />

(1) y (j)<br />

i1<br />

= · · · = y(j)<br />

is<br />

= 1 für alle j = 1, . . . , l.<br />

(2) Ist k = i1, . . . , is, so ist y (j)<br />

k = 0 für höchstens ein j.<br />

5.12 Satz. Die Bezeichnungen seien wie in 5.11. Wird ein Wort x ∈ C<br />

gesendet und z empfangen und sind maximal t ≤ 1l<br />

Fehler aufgetreten, so<br />

gilt:<br />

2<br />

Die Anzahl der Fehler in z an den Stellen i1, . . . , is ist ungerade<br />

⇐⇒ ♯{j : 〈y (j) , z〉 = 1} > ♯{j : 〈y (j) , z〉 = 0}.


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 58<br />

Beweis. Angenommen, die Anzahl der Fehler an den Stellen i1, . . . , is ist<br />

ungerade, also mindestens 1. Dann gibt es maximal t − 1 viele Fehler<br />

außerhalb der Stellen i1, . . . , is und nach Teil (2) von Definition 5.11 daher<br />

auch nur maximal t − 1 viele y (j) , die an einer dieser Stellen den Eintrag 1<br />

haben. Die übrigen l − (t − 1) vielen bemerken nur die Fehler an den Stellen<br />

i1, . . . , is, d.h. für diese y (j) gilt:<br />

〈y (j) , z〉 = 〈y (j) , x〉 + Anzahl der Fehler an den Stellen i1, . . . , is(mod 2) = 1,<br />

denn die Anzahl der Fehler an den Stellen i1, . . . , is ist ungerade und<br />

〈y (j) , x〉 = 0.<br />

Angenommen, die Anzahl der Fehler an den Stellen i1, . . . , is ist gerade.<br />

Dann gibt es maximal t viele Fehler außerhalb der Stellen i1, . . . , is<br />

und nach Teil (2) von Definition 5.11 daher auch nur maximal t viele<br />

y (j) , die an einer dieser Stellen den Eintrag 1 haben. Die übrigen l − t<br />

vielen bemerken nur die Fehler an den Stellen i1, . . . , is, d.h. für diese y (j) gilt:<br />

〈y (j) , z〉 = 〈y (j) , x〉 + Anzahl der Fehler an den Stellen i1, . . . , is(mod 2) = 0,<br />

denn die Anzahl der Fehler an den Stellen i1, . . . , is ist gerade und<br />

〈y (j) , x〉 = 0.<br />

Es gilt also:<br />

Ist die Anzahl der Fehler an den Stellen i1, . . . , is ungerade, so ist 〈y (j) , z〉 = 1<br />

für mindestens l − (t − 1) viele y (j) .<br />

Ist die Anzahl der Fehler an den Stellen i1, . . . , is gerade, so ist 〈y (j) , z〉 = 1<br />

für höchstens t viele y (j) .<br />

Nach Voraussetzung ist l−(t−1) > l−t ≥ t, und damit folgt die Behauptung.<br />

5.13 Multistep Majority-Decodierung für Reed-Muller-Codes.<br />

C = RM(r, m), r < m; n = 2m , k = r <br />

m−r<br />

i=0 , d = 2 .<br />

x = (x0, . . . , x2 m −1) wurde gesendet, z = (z0, . . . , z2 m −1) empfangen.<br />

Annahme: z enthalte t viele Fehler, t ≤ 2 m−r−1 − 1 = ⌊ d−1<br />

2 ⌋.<br />

Ziel: Decodierverfahren, das z in x decodiert (und in der Regel schneller<br />

ist als Syndrom-Decodierung).<br />

m<br />

i


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 59<br />

Wir wählen die folgende Bezeichnung für die Elemente des F m 2 :<br />

v0 v1 v2 · · · v2 m −1<br />

0 0 0 · · · 1<br />

. . . .<br />

0 0 1 · · · 1<br />

0 1 0 · · · 1<br />

Ist M eine Teilmenge von F m 2 , so meinen wir, wenn wir von den Positionen<br />

von M reden, diejenigen i, für die vi in M enthalten ist (äquivalent:<br />

diejenigen Positionen i, an denen χ M gleich 1 ist).<br />

Wir benötigen jetzt noch folgende Aussage:<br />

5.14 Bemerkung. Sei M ein p-dimensionaler Vektorunterraum von Fm 2 ,<br />

p ≤ r.<br />

Seien M1, . . . , Mw die sämtlichen (p + 1)-dimensionalen Vektorunterräume<br />

von Fm 2 , die M enthalten. Dann gilt:<br />

a) w = 2 m−p − 1<br />

b) Die Anzahl der Fehler in z an den Positionen von M ist ungerade<br />

⇐⇒<br />

♯{j : Anzahl der Fehler in z an den Positionen von Mj ist ungerade}<br />

><br />

♯{j : Anzahl der Fehler in z an den Positionen von Mj ist gerade}.<br />

Beweis. (a) Es ist |M| = 2 p . Ist v ∈ F m 2<br />

\ M, so ist span(M ∪ {v})<br />

ein (p + 1)-dimensionaler Vektorunterraum, der M enthält. Er enthält<br />

2 p+1 − 2 p = 2 p viele Vektoren, die nicht in M liegen. Jeder von diesen spannt<br />

also zusammen mit M den gleichen Unterraum auf. Da es 2 m − 2 p viele<br />

Vektoren außerhalb von M gibt, ist w = 2m −2 p<br />

2 p<br />

= 2 m−p − 1.<br />

(b) Es ist Mi ∩ Mj = M für i = j. Daher hat jedes χ an den Positionen<br />

Mi<br />

von M eine 1 und außerhalb der Positionen von M haben χ und χ für<br />

Mi Mj<br />

i = j an keiner Position eine 1 gemeinsam. (*)<br />

Angenommen, die Anzahl der Positionen von M, an denen z fehlerhaft ist,<br />

ist ungerade.<br />

Dann haben maximal t − 1 viele der χ eine 1 an einer der fehlerhaften<br />

Mj<br />

Positionen außerhalb der Positionen von M (wegen(*)). Der Rest, also mindestens<br />

w−(t−1) viele, trifft mit seinen Einsen außer auf korrekte Positionen


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 60<br />

von z nur auf die fehlerhaften Positionen von M.<br />

Also: Es gibt mindestens w − (t − 1) viele Mj, an deren Positionen z eine<br />

ungerade Anzahl von Fehlern hat.<br />

Angenommen, die Anzahl der Positionen von M, an denen z fehlerhaft ist,<br />

ist gerade.<br />

Dann haben maximal t viele der χ Mj<br />

eine 1 an einer der fehlerhaften Positio-<br />

nen außerhalb der Positionen von M (wegen(*)). Der Rest, also mindestens<br />

w − t viele, trifft mit seinen Einsen außer auf korrekte Positionen von z nur<br />

auf die fehlerhaften Positionen von M.<br />

Also gibt es mindestens w − t viele Mj, an deren Positionen z eine gerade<br />

Anzahl von Fehlern hat, d.h. es gibt höchstens t viele, an deren Positionen z<br />

eine ungerade Anzahl von Fehlern hat.<br />

Da nach a) und Voraussetzung w − t = 2 m−p − t − 1 ≥ 2 m−r − t − 1 > t, folgt<br />

die Behauptung.<br />

(Beachten Sie die Ähnlichkeit des Beweises mit 5.12.)<br />

Beschreibung des Decodier-Verfahrens:<br />

1. Schritt:<br />

Wähle einen r-dimensionalen Vektorunterraum M von Fm 2 ; dieser enthält<br />

v0. Seien M1, . . . , Mw alle (r + 1)-dimensionalen Unterräume von Fm 2 , die M<br />

enthalten. Nach Teil a) der obigen Bemerkung ist w = 2m−r − 1.<br />

Nach 5.4 ist RM(r, m) ⊥ = RM(m − r − 1, m). Nach 5.8 liegen alle<br />

χ , j = 1, . . . , w, in RM(r, m)<br />

Mj<br />

⊥ , da r + 1 = m − (m − r − 1).<br />

Nun folgt aus Mi ∩ Mj = M für i = j, dass die χ orthogonal bezüglich<br />

Mj<br />

der Positionen von M sind.<br />

Berechne alle 〈χ , z〉. Ist die Mehrzahl der Werte ungleich 0, so ist die<br />

Mj<br />

Anzahl der Fehler in z an den Positionen von M ungerade, ansonsten gerade<br />

(nach 5.12, da t ≤ 2m−r−1 − 1 ≤ 1<br />

2 (2m−r − 1)).<br />

2. Schritt:<br />

Führe den ersten Schritt für alle r-dimensionalen Untervektorräume von F m 2<br />

durch.<br />

Nach dem 2. Schritt:<br />

Es ist für jeden r-dimensionalen Untervektorraum bekannt, ob die Anzahl<br />

der Fehler von z an dessen Positionen gerade oder ungerade ist.<br />

3. Schritt:<br />

Wähle einen (r − 1)-dimensionalen Vektorunterraum N von F m 2<br />

und bestim-


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 61<br />

me alle r-dimensionalen Vektorunterräume, die N enthalten.<br />

Aufgrund von Schritt 2 und Teil b) der obigen Bemerkung können wir<br />

bestimmen, ob die Anzahl der Fehler von z an den Positionen von N gerade<br />

oder ungerade ist.<br />

Führe dies für alle (r − 1)-dimensionalen Untervektorräume durch.<br />

4. Schritt:<br />

Führe den dritten Schritt für alle (r − 2)−, . . . , 1−, 0−dimensionalen Untervektorräume<br />

durch.<br />

Der 0-dimensionale Fall betrifft nur den Nullraum {v0}. Wir wissen daher,<br />

ob z an der Position von v0 eine gerade oder ungerade Anzahl von Fehlern<br />

hat, d.h. ob z0 korrekt oder fehlerhaft ist.<br />

Da wir auch wissen, ob die Anzahl der Fehler von z an den Positionen der<br />

1-dimensionalen Vektorunterräume {v0, vi} gerade oder ungerade ist, können<br />

wir dann auch feststellen, ob zi korrekt oder fehlerhaft ist für i = 1, . . . , 2 m −1.<br />

5.15 Bemerkung. Ist r ≈ m<br />

, so benötigt das Multistep Majority-De-<br />

2<br />

codierverfahren O(m2m2 +m ) viele binäre Operationen, während bei der<br />

Syndrom-Decodierung O(22m−1) viele Nebenklassenführer zu berechnen und<br />

zu vergleichen sind. Für große m ist der Aufwand der Syndrom-Decodierung<br />

also erheblich höher.<br />

Es gibt Modifikationen und noch effizientere Versionen der Multistep<br />

Majority-Decodierung von Reed-Muller-Codes. Nähere Informationen:<br />

[MS77] , Chapter 10.<br />

5.16 Beispiel.<br />

Multistep Majority-Decodierung des Reed-Muller-Codes RM(1, 4)<br />

n = 2 m = 16, k = 1 + 4 = 5, d = 2 3 = 8<br />

RM(1, 4) ist 3-Fehler-korrigierend.<br />

Wir wählen folgende Bezeichnungen für die Elemente des F 4 2 :<br />

v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15<br />

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1<br />

0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1<br />

0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1<br />

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1<br />

Die Elemente sind von oben nach unten zu lesen; die durch sie dargestellte<br />

Zahl in Binärschreibweise (niedrigstes Bit unten) gibt die Position in der


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 62<br />

Tabelle an (v0 Position 0,. . . ,v15 Position 15).<br />

Angenommen, ein Wort x = (x0, . . . , x15) ∈ R(1, 4) wird gesendet und<br />

z = (1011010001001010) wird empfangen.<br />

Wir nehmen an, dass maximal drei Fehler aufgetreten sind und wollen z mit<br />

Multistep Majority-Logic decodieren.<br />

Da r = 1, bestimmen wir zunächst durch Betrachtung aller 1-dimensionalen<br />

Unterräume {v0, vi}, i = 1, . . . , 15, des F 4 2 , die v0 enthalten (vgl. 5.6), ob an<br />

den zugehörigen Positionen 0 und i von z eine gerade oder ungerade Anzahl<br />

von Fehlern aufgetreten ist.<br />

Wir beginnen mit M = {v0, v1} und müssen für alle 2-dimensionalen<br />

Unterräume Mj des F4 oder 1 ist.<br />

2, die M enthalten, überprüfen, ob 〈z, χ 〉 gleich 0<br />

Mj<br />

Es gibt sieben solcher Unterräume, nämlich<br />

M1 = {v0, v1, v2, v3}, M2 = {v0, v1, v4, v5}, M3 = {v0, v1, v6, v7},<br />

M4 = {v0, v1, v8, v9}, M5 = {v0, v1, v10, v11}, M6 = {v0, v1, v12, v13},<br />

M7 = {v0, v1, v14, v15}.<br />

Man erhält sie, indem man neben v0 und v1 einen dritten Vektor vs wählt;<br />

der vierte Vektor ist dann v0 + v1 + vs = v1 + vs, also gerade vs+1 (vgl. 5.6).<br />

〈z, χ 〉 rechnet man aus, indem man die Einsen in z, die an den durch M1<br />

M1<br />

bestimmten Positionen 0,1,2,3 stehen, addiert (modulo 2), also 1 + 1 + 1 =<br />

1. Analog verfährt man mit den übrigen Mj. Dann erhält man:<br />

j 1 2 3 4 5 6 7<br />

〈z, χ 〉<br />

Mj<br />

1 0 1 0 1 0 0<br />

Da die Mehrzahl der Werte von 〈z, χ 〉 gleich 0 ist, enthält<br />

Mj<br />

z an den Positionen 0,1 eine gerade Anzahl von Fehlern, d.h.<br />

(x0 − z0) + (x1 − z1) = (x0 − 1) + (x1 − 0) = 0 (modulo 2).<br />

Diese Rechnung haben wir jetzt für alle M = {v0, vi} durchzuführen. Die<br />

Ergebnisse sind in folgender Tabelle zusammengefasst:


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 63<br />

M Mj 〈z, χ 〉<br />

Mj<br />

{v0, v1} Anzahl der Fehler<br />

siehe an den Positionen 0,1<br />

oben gerade<br />

{v0, v2} {v0, v2, v1, v3} 1 Anzahl Nullen<br />

{v0, v2, v4, v6} 0 ><br />

{v0, v2, v5, v7} 1 Anzahl Einsen<br />

{v0, v2, v8, v10} 0 Daher:<br />

{v0, v2, v9, v11} 1 Anzahl der Fehler<br />

{v0, v2, v12, v14} 0 an den Positionen 0,2<br />

{v0, v2, v13, v15} 0 gerade<br />

{v0, v3} {v0, v3, v1, v2} 1 Anzahl Nullen<br />

{v0, v3, v4, v7} 0 <<br />

{v0, v3, v5, v6} 1 Anzahl Einsen<br />

{v0, v3, v8, v11} 0 Daher:<br />

{v0, v3, v9, v10} 1 Anzahl der Fehler<br />

{v0, v3, v12, v15} 1 an den Positionen 0,3<br />

{v0, v3, v13, v14} 1 ungerade<br />

{v0, v4} {v0, v4, v1, v5} 0 Anzahl Nullen<br />

{v0, v4, v2, v6} 0 ><br />

{v0, v4, v3, v7} 0 Anzahl Einsen<br />

{v0, v4, v8, v12} 0 Daher:<br />

{v0, v4, v9, v13} 0 Anzahl der Fehler<br />

{v0, v4, v10, v14} 0 an den Positionen 0,4<br />

{v0, v4, v11, v15} 1 gerade<br />

Analog ergeben sich die übrigen Fälle:<br />

M Anzahl der Fehler<br />

{v0, v5} an den Positionen 0,5: gerade<br />

{v0, v6} an den Positionen 0,6: gerade<br />

{v0, v7} an den Positionen 0,7: ungerade<br />

{v0, v8} an den Positionen 0,8: gerade<br />

{v0, v9} an den Positionen 0,9: gerade<br />

{v0, v10} an den Positionen 0,10: gerade<br />

{v0, v11} an den Positionen 0,11: ungerade<br />

{v0, v12} an den Positionen 0,12: gerade<br />

{v0, v13} an den Positionen 0,13: gerade<br />

{v0, v14} an den Positionen 0,14: gerade<br />

{v0, v15} an den Positionen 0,15: gerade


5 REED-MULLER-CODES UND MAJORITY-LOGIC-DECODIERUNG 64<br />

Da die Mehrzahl der Fehleranzahlen in den Positionen 0, i gerade ist, ist<br />

die Fehleranzahl an der Position 0 gerade, d.h. die Position 0, also die erste<br />

Koordinate von z ist korrekt. Da wir wissen, ob die Fehleranzahl an einem<br />

Positionenpaar 0, i gerade oder ungerade ist, folgt jetzt auch, dass genau an<br />

den Positionen 3, 7, 11 Fehler aufgetreten sind.<br />

z wird also decodiert zum Codewort x = (1010010101011010).


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 65<br />

6 Polynomcodierung und zyklische Codes<br />

6.1 Exkurs (Polynomringe, I).<br />

Sei K ein Körper und K[x] die Menge aller formalen Polynome über K (nicht<br />

Polynomfunktionen !).<br />

(1) Addition:<br />

n<br />

aix i +<br />

i=0<br />

Multiplikation mit Skalaren:<br />

a ·<br />

n<br />

bix i :=<br />

i=0<br />

n<br />

aix i :=<br />

i=0<br />

n<br />

(ai + bi)x i<br />

i=0<br />

n<br />

(aai)x i<br />

i=0<br />

Damit ist K[x] ein Vektorraum über K.<br />

Für jedes n ≥ 0 ist<br />

K[x]n := {f ∈ K[x] : grad f < n}<br />

ein Untervektorraum von K[x] (grad 0 := −∞).<br />

(2) Multiplikation von Polynomen:<br />

<br />

n<br />

aix i<br />

<br />

m<br />

· bix i<br />

<br />

=<br />

i=0<br />

i=0<br />

n+m <br />

mit ci := a0bi + a1bi−1 + . . . + aib0, wobei aj = 0 für j > n und bj = 0<br />

für j > m zu setzen ist.<br />

Multiplikation mit Skalaren entspricht der Multiplikation mit Polynomen<br />

vom Grad ≤ 0.<br />

Beispiel: K = F2<br />

i=0<br />

cix i<br />

(x 2 + x + 1)(x 3 + x 2 + 1) = x 5 + x + 1<br />

(3) K[x] ist mit der in (1) definierten Addition und der Multiplikation aus<br />

(2) ein kommutativer Ring mit Eins.<br />

(4) In K[x] gibt es Division mit Rest: Seien f, g ∈ K[x] und g = 0. Dann<br />

gibt es eindeutig bestimmte Polynome h, r ∈ K[x] mit<br />

f = g · h + r


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 66<br />

und grad r < grad g.<br />

Man schreibt auch: r = f mod g.<br />

Beispiel: Für f = x 4 + x 2 + 1 und g = x 2 + x + 1 ist:<br />

x 4 + x 2 + 1 : x 2 + x + 1 = x 2 − x + 1<br />

−(x 4 + x 3 +x 2 )<br />

.<br />

0<br />

In obiger Notation ergibt sich h = x 2 − x + 1 und r = 0, und somit ist<br />

f mod g = 0. Das heisst g teilt f; g | f.<br />

Für f = x 4 + x + 1 und g = x 2 + 1 ist:<br />

x 4 + x + 1 : x 2 + 1 = x 2 − 1<br />

−(x 4 +x 2 )<br />

.<br />

x + 2<br />

In obiger Notation ergibt sich h = x 2 − 1 und r = x + 2, also<br />

Ist K = F2, so ist f mod g = x.<br />

f mod g = x + 2.<br />

(5) Ein Polynom f ∈ K[x] vom Grad ≥ 1 heißt irreduzibel, falls f nicht<br />

Produkt zweier Polynome vom Grad ≥ 1 ist. (Entspricht einer Primzahl<br />

in Z).<br />

(6) Jedes Polynom f ∈ K[x] vom Grad ≥ 1 lässt sich eindeutig schreiben<br />

in der Form<br />

f = a · f1 · . . . · fs<br />

Dabei ist a ∈ K und fi sind irreduzible Polynome mit höchstem Koeffizienten<br />

1. (Entspricht der eindeutigen Primfaktorzerlegung in Z).<br />

6.2 Polynomcodierung.<br />

Sei k < n. Wir codieren Klartexte m ∈ F k q , m = (m0, . . . , mk−1) auf folgende<br />

Weise:


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 67<br />

(1) Identifiziere m mit m(x) = m0 + m1x + . . . + mk−1x k−1 ∈ Fq[x]k. Diese<br />

Zuordnung<br />

ist ein Vektorraum-Isomorphismus.<br />

F k q −→ Fq[x]k<br />

m ↦−→ m(x)<br />

(2) Wähle ein Polynom g(x) vom Grad n − k. Multipliziere m(x) mit x n−k :<br />

x n−k m(x) = m0x n−k + m1x n−(k+1) + . . . + mk−1x n−1<br />

Codiere m(x) in c(x) := x n−k m(x) − (x n−k m(x) mod g(x)<br />

<br />

grad


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 68<br />

so ist ⎛<br />

−r<br />

⎜<br />

⎝<br />

(n−k)<br />

.<br />

0 . . . −r (n−k)<br />

n−k−1<br />

−r (n−1)<br />

0 . . . −r (n−1)<br />

n−k−1<br />

.<br />

⎞<br />

1 0<br />

. ..<br />

⎟<br />

⎠<br />

0 1<br />

Erzeugermatrix von C, (wenn die Elemente von C als n-Tupel geschrieben<br />

sind).<br />

Beweis. (a) Zu m(x) ∈ Fq[x]k ist das Codewort<br />

c(x) = x n−k m(x) − (x n−k m(x) mod g(x))<br />

ein Vielfaches von g(x), also in g(x)Fq[x]k. Also gilt C ⊆ g(x)Fq[x]k.<br />

C ⊇ g(x)Fq[x]k. Sei grad t(x) < k und g(x)t(x) =<br />

a0 + a1x + . . . + an−k−1x n−k−1 + m0x n−k + . . . + mk−1x n−1 ∈ Fq[x]n.<br />

Setze m(x) = m0 + . . . + mk−1x k−1 . Dann ist<br />

und<br />

g(x)t(x) = a0 + . . . + an−k−1x n−k−1 + x n−k m(x)<br />

−a0 − . . . − an−k−1x n−k−1 = x n−k m(x) mod g(x),<br />

d.h. g(x)t(x) = x n−k m(x) − (x n−k m(x) mod g(x)). Also g(x)Fq[x]k ⊆<br />

C.<br />

(b) Folgt aus (a) (Basis g(x) · 1, g(x) · x, . . . , g(x) · x k ).<br />

(c) Sei m(x) = m0 + . . . + mk−1x k−1 . Dann x n−k · m(x)<br />

= m0x n−k + . . . + mk−1x n−1<br />

= m0rn−k(x) + . . . + mk−1rn−1(x) + g(x)(m0qn−k(x) + . . . + mk−1qn−1(x)).<br />

Also m0rn−k(x) + . . . + mk−1rn−1(x) = x n−k m(x) mod g(x). Daraus<br />

folgt die Behauptung.<br />

6.4 Bemerkung. (a) Polynomcodierung ist dort sinnvoll, wo es nur auf<br />

Fehlererkennung ankommt (Nachfragemöglichkeit !).<br />

(b) Polynomdivision lässt sich durch Schieberegister realisieren, ist also<br />

sehr schnell.


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 69<br />

(c) Man kann bei gegebenen g(x) auch Nachrichten von beliebiger Länge<br />

k (d.h. Polynome vom Grad ≤ k − 1 ) codieren:<br />

Wähle g(x) vom Grad t und Nachrichten beliebiger Länge k, so ist<br />

c(x) = x t m(x) − (x t m(x) mod g(x))<br />

vom Grad < k + t und entspricht einem Codewort der Länge k +<br />

t. Damit erhält man Codewörter variabler Länge, an deren letzten k<br />

Stellen jeweils die ursprüngliche Nachricht steht.<br />

Bei Ethernetanwendungen wir in der Regel ein Polynom vom Grad 16<br />

genommen.<br />

(d) Anwendung von Polynomcodierung (z.B. Ethernet-LAN) :<br />

m(x) = m0 + . . . + mk−1x k−1 (Nutzdaten)<br />

c(x) = −b0 − b1x − . . . − bn−k−1x n−k−1 + m0x n−k + . . . + mk−1x n−1<br />

↔ (−b0, −b1, . . . , −bn−k−1,<br />

m0, . . . , mk−1) ∈ F<br />

<br />

Ethernet-Trailer<br />

n q<br />

(e) Die Erzeugerpolynome sind zum Teil standardisiert:<br />

CRC-CCITT-Polynom:<br />

CRC-16-Polynom:<br />

g(x) = x 16 + x 12 + x 5 + 1<br />

g(x) = x 16 + x 15 + x 2 + 1<br />

CCITT: Comité Consultativ International de Téléphonique et Télégraphique,<br />

Vorläuferorganisation der ITU, einem internationalen Gremium<br />

zur Vereinheitlichung und Normierung von Telekommunikationsstandards.<br />

CRC: Cyclic Redundancy Code<br />

Mit diesen Polynomen ist die Division mit Rest sehr einfach durch<br />

Schieberegister realisierbar.<br />

6.5 Beispiel. Sei K = F2, n = 24, k = 8. Für eine Polynomcodierung sei<br />

g(x) = x 16 + x 15 + x 2 + 1.


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 70<br />

Es soll die Nachricht m = (10110101) ∈ F 8 2 verschickt werden. Das m entsprechende<br />

Polynom ist:<br />

Multiplikation mit x n−k = x 16 ergibt:<br />

m(x) = 1 + x 2 + x 3 + x 5 + x 7<br />

x 16 m(x) = x 16 + x 18 + x 19 + x 21 + x 23<br />

Bei Division von x 16 m(x) durch g(x) erhält man:<br />

x 23 + x 21 + x 19 + x 18 + x 16 : x 16 + x 15 + x 2 + 1 = x 7 + x 6 + x 3 + 1<br />

−(x 23 + x 22 + x 9 + x 7 )<br />

.<br />

x 15 + x 9 + x 8 + x 7 + x 6 + x 5 + x 3 + x 2 + 1<br />

<br />

x 16 m(x) mod g(x)<br />

Codierung:<br />

c(x) = 1 + x 2 + x 3 + x 5 + x 6 + x 7 + x 8 + x 9 + x 15 + x 16 + x 18 + x 19 + x 21 + x 23<br />

↔ (1011011111000001<br />

| 10110101 )<br />

Ethernet-Trailer<br />

m<br />

Die Polynomcodierung wird vor allem auch für sogenannte zyklische Codes<br />

verwendet. Wir definieren zunächst, was das bedeuted.<br />

6.6 Definition. Sei C ein [n, k]-Code über Fq. C heißt zyklisch, falls gilt:<br />

(c0, . . . , cn−1) ∈ C ⇒ σ(c0, . . . , cn−1) := (cn−1, c0, . . . , cn−2) ∈ C<br />

6.7 Bemerkung.<br />

(a) Ist C ein zyklischer Code der Länge n, (c0, . . . , cn−1) ∈ C, so ist auch<br />

(ci+1, . . . , cn−1, c0, . . . , ci) = σ n−i−1 (c0, . . . , cn−1) ∈ C<br />

für alle i = 0, . . . , n − 1.<br />

(b) Ist C zyklischer Code und sind y1, . . . , yl ∈ C ⊥ orthogonal bezüglich<br />

Position 1, so sind σ(y1), . . . , σ(yl) ∈ C ⊥ orthogonal bezüglich Position<br />

2, σ 2 (y1), . . . , σ 2 (yl) ∈ C ⊥ orthogonal bezüglich Position 3, usw. .


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 71<br />

Daher ist Majority-Logic Decodierung für zyklische Codes besonders effektiv:<br />

Wenn man eine Position korrigieren kann, so auch alle anderen.<br />

Äquivalente Codes zyklischer Codes sind nicht unbedingt zyklisch!<br />

6.8 Beispiele. (a) Vorbemerkung: Ist K ein endlicher Körper (|K| = q),<br />

so ist die multiplikative Gruppe K ∗ = K\{0} zyklisch, d.h. es existiert<br />

ein α ∈ K mit α q−1 = 1 und K ∗ = {1, α, α 2 , . . . , α q−2 }.<br />

(b) Der Körper F 2 l der Ordnung 2 l (l ∈ N) ist ein l-dimensionaler Vektorraum<br />

über F2. Bezüglich einer F2-Basis lassen sich die Elemente von<br />

F 2 l als 0-1-Vektoren der Länge l schreiben.<br />

Sei nach (a): F ∗<br />

2 l = {1, α, α 2 , . . . , α 2l −2 } mit α 2 l −1 = 1.<br />

Sei H die l×(2 l −1)-Matrix über F2, deren Spalten gerade 1, α, . . . , α 2l −2<br />

sind (geschrieben als 0-1-Vektoren). 1, α, . . . , α 2l −2 sind also sämtliche<br />

Vektoren = 0 des F2-Vektorraums F 2 l. Sei Hl der binäre Hamming-<br />

Code bezüglich dieser Kontrollmatrix.<br />

Es gilt (mit n = 2 l − 1):<br />

und<br />

n−2<br />

i=0<br />

x = (x0, . . . , xn−1) ∈ Hl ⇔ Hx t = 0<br />

<br />

xi+1α i + x0α n−1 n−2<br />

= (<br />

i=0<br />

n−1<br />

= (<br />

i=0<br />

n−1<br />

⇔ xiα i = 0<br />

i=0<br />

xi+1α i+1 + x0α 0 )α −1<br />

xiα i )α −1 = 0.<br />

(α n = 1 = α 0 )<br />

Also: (x1, x2, . . . , xn−1, x0) ∈ Hl, falls (x0, x1, . . . , xn−1) ∈ Hl. Somit ist<br />

Hl zyklisch.<br />

Also: Jeder binäre Hamming-Code ist äquivalent zu einem zyklischen<br />

Code.<br />

Dies gilt auch für die nicht-binären Hamming-Codes.


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 72<br />

6.9 Beispiel (Reed-Solomon-Codes, 1960). Sei K = Fq und q eine Primzahlpotenz,<br />

q ≥ 3. Setze n = q − 1 und wähle d mit 2 ≤ d ≤ n. Nach 6.8.a)<br />

ist K ∗ zyklisch (d.h. K ∗ = {1, α, . . . , α n−1 }, α n = 1).<br />

Sei H die folgende (d − 1) × n-Matrix über K:<br />

⎛<br />

⎜<br />

H = ⎜<br />

⎝.<br />

1 α α2 . . . αn−1 1 α2 α4 . . . α2(n−1) 1 α d−1 α (d−1)2 . . . α (d−1)(n−1)<br />

Mit Hilfe der Vandermonde-Determinante sieht man, dass jede<br />

(d − 1) × (d − 1)-Unterdeterminante von H ungleich 0 ist.<br />

Damit folgt:<br />

Je d − 1 Spalten von H sind linear unabhängig und rg(H) = d − 1.<br />

Der Reed-Solomon-Code über K = Fq ist der [n, n − d + 1]-Code mit der<br />

Kontrollmatrix H und wird mit RSq(d) bezeichnet.<br />

6.10 Satz. Sei q ≥ 3 eine Primzahlpotenz, n = q − 1, 2 ≤ d ≤ n.<br />

(a) RSq(d) ist ein zyklischer Code.<br />

(b) Die Minimaldistanz von RSq(d) ist d.<br />

(c) RSq(d) ist ein MDS-Code (vgl. 4.16 ).<br />

Beweis. (a) x = (x0, . . . , xn−1) ∈ RSq(d) ⇔ Hx t = 0<br />

⇔ n−1<br />

j=0 αij xj = 0 für alle i = 1, . . . , d − 1<br />

⇔ 0 = α i n−1<br />

j=0 αij xj = n−1<br />

j=0 αi(j+1) xj = xn−1 + α i x0 + α 2i x1 + . . . +<br />

α (n−1)i xn−2 für alle i = 1, . . . , d − 1<br />

⇔ (xn−1, x0, . . . , xn−2) ∈ RSq(d).<br />

(b) Da je d − 1 Spalten von H linear unabhängig sind (und wegen rg(H) =<br />

d−1 je d Spalten linear abhängig sind) - siehe 6.9 , folgt die Behauptung<br />

aus 3.8 .<br />

(c) Dies folgt aus dim RSq(d) = n − d + 1 und b).<br />

Reed-Solomon-Codes wurden bei den US-Raumfahrtprogrammen Galileo<br />

(Jupiter, 1989 - 2003), Magellan (Venus, 1989 - 1994) und der NASA-ESA<br />

Raumsonde Ulysses (Sonne, seit 1990) verwendet.<br />

.<br />

⎞<br />

⎟<br />


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 73<br />

6.11 Exkurs (Polynomringe, II).<br />

(1) Sei R ein beliebiger kommutativer Ring (mit Eins). I ⊆ R heißt Ideal,<br />

falls gilt:<br />

a) I ist bezüglich der Addition eine Untergruppe von R.<br />

b) ri ∈ I für alle r ∈ R, i ∈ I, d.h. rI ⊆ I für alle r ∈ R.<br />

(2) Bedeutung von Idealen:<br />

Die Nebenklassen bezüglich der Addition von I in R, also die Mengen<br />

s + I, s ∈ R, bilden bezüglich<br />

und<br />

(s1 + I) + (s2 + I) := (s1 + s2) + I<br />

(s1 + I) · (s2 + I) := (s1 · s2) + I<br />

einen Ring R/I, den Faktorring von R nach I. (Wichtig: Da I Ideal ist,<br />

hängt die Definition der Verknüpfungen + und · auf den Nebenklassen<br />

nicht von den Vertretern ab).<br />

(3) Ist a ∈ R, so ist aR = {ar : r ∈ R} ein Ideal (Hauptideal).<br />

(4) In K[x] ist jedes Ideal ein Hauptideal, d.h. von der Form f(x) · K[x],<br />

f(x) ∈ K[x]. Dies liegt im Wesentlichen an der Division mit Rest. (Ein<br />

entsprechender Satz gilt für den Ring Z).<br />

(5) f1(x)K[x] ⊆ f2(x)K[x] ⇔ f2(x) | f1(x).<br />

Ist f(x) irreduzibel, so ist K(x)/f(x)K[x] ein Körper.<br />

(6) Die Ideale in R = K[x]/f(x)K[x] sind genau die von der Form<br />

g(x)K[x]/f(x)K[x] mit g(x) | f(x).<br />

(7) Gilt grad f = n, so bilden die Polynome vom Grad < n ein Vertretersystem<br />

der Nebenklassen von f(x)K[x] in K[x]:<br />

K[x]/f(x)K[x] = {g(x) + f(x)K[x] : grad g < n}<br />

Addition und Multiplikation auf K[x]/f(x)K[x] lassen sich auf K[x]n<br />

übertragen:<br />

Addition = übliche Addtion in K[x]<br />

Multiplikation = Multiplikation in K[x] und dann Reduktion<br />

mod f(x).


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 74<br />

Dann: K[x]n =K[x]/f(x)K[x] (isomorphe Ringe).<br />

Beispiel. K = F2, f(x) = x 3 + x 2 + 1.<br />

K[x]/f(x)K[x] = {g(x) + f(x)K[x] : grad g < 3}<br />

K[x]3 = {0, 1, x, x + 1, x 2 , x 2 + 1, x 2 + x + 1}<br />

Multiplikation: (x 2 + 1) ⊙ (x 2 + x + 1) =?<br />

in K[x]: (x 2 + 1)(x 2 + x + 1) = x 4 + x 3 + x + 1<br />

x 4 + x 3 + x + 1 : x 3 + x 2 + 1 = x<br />

x 4 + x 3 + x<br />

1<br />

Also: (x 2 + 1) ⊙ (x 2 + x + 1) = 1.<br />

Mit dieser Multiplikation (und Addition) ist F2[x]3 ein Körper der Ordnung<br />

8.<br />

6.12 Satz. Sei C ein linearer Code der Länge n über Fq. Identifiziere F n q mit<br />

Fq[x]n wie bei der Polynomcodierung; dabei C ⊆ F n q ↔ C ⊆ Fq[x]n.<br />

Mache Fq[x]n zu einem Ring, indem man wie in 6.11(7) Addition und Multiplikation<br />

von Fq[x]/(x n − 1)Fq[x] auf Fq[x]n überträgt.<br />

Dann gilt:<br />

C ist zyklisch ⇔ C ist Ideal in Fq[x]n.<br />

Beweis. c = (c0, . . . , cn−1) ∈ C ↔ c(x) = c0 + c1x + . . . + cn−1x n−1 ∈ C.<br />

(cn−1, c0, . . . , cn−2) ∈ C ⇔ cn−1 + c0x + . . . + cn−2x n−1 ∈ C<br />

Also: C zyklisch ⇔ C Ideal.<br />

⇔ x ⊙ (c0 + c1x + . . . + cn−1x n−1 ) ∈ C<br />

( denn x n mod (x n − 1) = 1)<br />

⇔ h(x) ⊙ c(x) ∈ C für alle h(x) ∈ Fq[x]n.<br />

6.13 Satz. Sei C zyklischer [n, k]-Code über Fq, identifiziert mit einem Ideal<br />

C ⊆ Fq[x]n =Fq[x]/(x n − 1)Fq[x].<br />

(a) Es existiert ein eindeutig bestimmtes Polynom g(x) vom Grad n − k<br />

mit höchstem Koeffizienten 1 und g(x) | x n − 1, so dass<br />

C = {m(x) ⊙ g(x) : grad m(x) < k}<br />

(⊙ entspricht hier genau der üblichen Multiplikation, da<br />

grad m(x)g(x) < n). g(x) ist also Erzeugerpolynom von C (vgl.<br />

6.2) (oder auch von C).


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 75<br />

(b) Ist x n − 1 = g(x)h(x) (vgl. 6.1(5) ), so ist<br />

C = {f(x) ∈ K[x]n : f(x) ⊙ h(x) = 0}.<br />

h(x) heißt Kontrollpolynom von C (oder auch von C).<br />

Beweis. (a) Dies folgt aus 6.11 (6).<br />

(b) Es ist g(x) ⊙ h(x) = 0 in Fq[x]n. Also f(x) ⊙ h(x) = 0 für alle f(x) ∈ C<br />

nach a).<br />

Ist umgekehrt f(x) ⊙ h(x) = 0 für alle f(x) ∈ C, so g(x)h(x) = x n − 1 |<br />

f(x)h(x). Dann g(x) | f(x), also f(x) ∈ C nach a).<br />

6.14 Folgerung. (a) Es gibt genauso viele zyklische Codes der Länge n<br />

über Fq wie es Teiler von x n − 1 in Fq[x] gibt.<br />

(b) Sei C ein zyklischer [n, k]-Code über Fq,<br />

g(x) = g0 + g1x + . . . + gn−kx n−k Erzeugerpolynom (gn−k = 1) und<br />

h(x) = h0 + h1x + . . . + hkx k Kontrollpolynom.<br />

Dann ist die k × n-Matrix<br />

⎛<br />

g0<br />

⎜ 0<br />

G = ⎜<br />

⎝ .<br />

. . .<br />

. ..<br />

. ..<br />

. . .<br />

. ..<br />

gn−k 0<br />

. ..<br />

. . .<br />

. ..<br />

. ..<br />

0<br />

.<br />

0<br />

⎞<br />

⎟<br />

⎠<br />

0 . . . 0 g0 . . . . . . gn−k<br />

Erzeugermatrix von C und die (n − k) × n-Matrix<br />

Kontrollmatrix von C.<br />

Beweis. (a) Das folgt aus 6.13.a) .<br />

⎛<br />

hk<br />

⎜ 0<br />

H = ⎜<br />

⎝ .<br />

. . .<br />

. ..<br />

. ..<br />

. . .<br />

. ..<br />

h0 0<br />

. ..<br />

. . .<br />

. ..<br />

. ..<br />

⎞<br />

0<br />

⎟<br />

. ⎟<br />

0 ⎠<br />

0 . . . 0 hk . . . . . . h0<br />

(b) Nach 6.13 a) sind g(x), x · g(x), . . . x k−1 · g(x) eine Basis von C. Daraus<br />

folgt, dass G eine Erzeugermatrix von C ist.


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 76<br />

Es ist x n − 1 = gh = n<br />

i=0 ( n<br />

j=0 gjhi−j)x i (dabei sind alle nicht definierten<br />

hi, gj gleich 0 zu setzen).<br />

Koeffizientenvergleich ergibt n−k<br />

j=0 gjhi−j = 0 für alle i = 1, . . . , n − 1,<br />

d.h. GH t = 0.<br />

g0h0 = −1, also rg(H) = n − k. Also ist H Kontrollmatrix für C.<br />

Beispiel. Sei n = 4, K = F2. Zyklische Codes der Länge 4 über F2:<br />

Teiler:<br />

x 4 − 1 = (x − 1) 4 in F2[x]<br />

1 C = F4 2 ⎛<br />

1 1 0<br />

⎞<br />

0<br />

x − 1 Erzeugermatrix ⎝0<br />

1 1 0⎠<br />

, dim C = 3<br />

(x − 1)<br />

0 0 1 1<br />

2 = x2 − 1<br />

(x − 1)<br />

<br />

1 0 1 0<br />

Erzeugermatrix<br />

dim C = 2<br />

0 1 0 1<br />

3 = x3 + x2 + x + 1 Erzeugermatrix 1 1 1 1 , dim C = 1<br />

(x − 1) 4 C = {0}<br />

Zyklische Codes sind häufig gut geeignet nicht nur zufällige Fehler gut zu<br />

erkennen (und zu korrigieren), sondern auch Fehlerbündel (mehrere nebeneinanderliegende<br />

Bits gestört), wie es bei Übertragungen oder Speicherungen<br />

auf CD’s oft passiert.<br />

Dazu:<br />

b Stellen<br />

<br />

6.15 Definition. Ein Vektor v = (0, . . . , 0, a, ∗, . . . , ã, 0, . . . , 0) ∈ Fn q mit<br />

a, ã = 0 heißt Bündel der Länge b (“burst”).<br />

Wird c ∈ C gesendet, v ∈ Fn q empfangen und ist f = v − c (der Fehlervektor)<br />

ein Bündel der Länge b, so heißt f Fehlerbündel der Länge b.<br />

6.16 Satz. Sei C ein zyklischer [n, k]-Code. Dann enthält C keine Bündel der<br />

Länge ≤ n − k.<br />

Daher entdeckt ein zyklischer [n, k]-Code Fehlerbündel der Länge ≤ n − k.<br />

Beweis. Angenommen (0, . . . , 0, ai, . . . , ai+b−1, 0, . . . , 0) ∈ C, ai, ai+b−1 = 0,<br />

b ≤ n − k. Dann auch c = (ai, . . . , ai+b−1, 0, . . . , 0 ) ∈ C.<br />

<br />

≥k Stellen


6 POLYNOMCODIERUNG UND ZYKLISCHE CODES 77<br />

Die b-te Zeile der Kontrollmatrix H aus 6.14 b) ist h = (0, . . . , 0, hk =<br />

1, . . . , h0, 0, . . . , 0).<br />

hc t = ai+b−1 · hk = 0, also Hc t = 0. Widerspruch.<br />

Ist v = c + f, f Fehlerbündel der Länge ≤ n − k, so gilt:<br />

= Hf t = 0, da f ∈ C (siehe oben).<br />

Hvt = Hct t c∈C<br />

+ Hf<br />

6.17 Korrektur von Fehlerbündeln.<br />

dimensionaler Vektorraum über Fq.<br />

(a) Für K = Fqm ist K ein m-<br />

Jedem a ∈ K kann genau ein m-Tupel über Fq zugeordnet werden, und<br />

somit einem e-Fehler-korrigierenden Code C über K der Länge n ein<br />

Code C0 der Länge nm über Fq.<br />

Mit C0 können Fehlerbündel bis zur Länge (e−1)m+1 über Fq korrigiert<br />

werden, denn (e − 1)m + 1 Stellen über Fq beeinflussen höchstens e<br />

Stellen im zugehörigen Codewort in C.<br />

(b) Die Korrekturmöglichkeit von Fehlerbündeln wird durch Codeverschachtelung<br />

verbessert:<br />

Sei C ein [n, k]-Code über K, t ∈ N. Dann heißt<br />

C(t) := {(c11, . . . , ct1, . . . , c1n, . . . , ctn) : (ci1, . . . , cin) ∈ C, i = 1, . . . , t}<br />

Codeverschachtelung der Tiefe t (“interleaving”).<br />

Es gilt:<br />

Kann C Fehlerbündel der Länge ≤ b korrigieren, so kann C(t) Fehlerbündel<br />

der Länge ≤ bt korrigieren.<br />

(Außerdem: Ist C zyklischer [n, k]-Code, so ist C(t) zyklischer [nt, kt]-<br />

Code.)<br />

Die Techniken aus 6.17 werden bei der Codierung von Audio-Daten auf CD’s<br />

verwendet.<br />

Ausgangspunkt ist dabei ein Reed-Solomon-Code über F 2 8 mit d = 5;<br />

Näheres z.B. in [Wil99], S. 27-29 oder [Fri96], S. 425-429.


LITERATUR 78<br />

Literatur<br />

[Ber84] E. R. Berlekamp. Algebraic Coding Theory. Aegean Park Press,<br />

1984.<br />

[Fri96] B. Friedrich. Kanalcodierung. Springer, 1996.<br />

[Ham50] R. W. Hamming. The theory of error detecting and error correcting<br />

codes. Bell Systems Technical Journal, 29:147–160, 1950.<br />

[Her81] Ch. Hering. A combinatorial lemma and Shannon’s theorem for<br />

binary symmetric channels. Arch. Math., 36:476 – 480, 1981.<br />

[HQ83] W. Heise and P. Quattrocchi. Informations- und <strong>Codierungstheorie</strong>.<br />

Springer, 1983.<br />

[Jun95] D. Jungnickel. <strong>Codierungstheorie</strong>. Spektrum Akademischer Verlag,<br />

1995.<br />

[MS77] F. MacWilliams and N. J. A. Sloane. The Theory of Error-<br />

Correcting-Codes. North Holland, 1977.<br />

[PH98] V. S. Pless and W.C. Huffman, editors. Handbook of Coding Theory<br />

I, II. Elsevier, 1998.<br />

[Rom92] S. Roman. Coding and Information Theory. Springer, 1992.<br />

[Sha48] C. E. Shannon. A mathematical theory of communication. Bell<br />

Systems Technical Journal, 27:379–423, 623–656, 1948.<br />

[vL99] J. van Lint. Introduction to Coding Theory. Springer, 1999.<br />

[VO89] S. A. Vanstone and P. C. Oorschot. An Introduction to Error-<br />

Correcting Codes with Applications. Kluwer, 1989.<br />

[Wil99] W. Willems. <strong>Codierungstheorie</strong>. de Gruyter, 1999.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!