Codierungstheorie - Diskrete Mathematik - Universität Tübingen
Codierungstheorie - Diskrete Mathematik - Universität Tübingen
Codierungstheorie - Diskrete Mathematik - Universität Tübingen
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.