22.01.2013 Aufrufe

Codierungstheorie II: Fehlerkorrigierende Codes

Codierungstheorie II: Fehlerkorrigierende Codes

Codierungstheorie II: Fehlerkorrigierende Codes

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Codierungstheorie</strong> <strong>II</strong>: <strong>Fehlerkorrigierende</strong> <strong>Codes</strong><br />

0. Einleitung, Fragestellung<br />

Frieder Knüppel<br />

In der <strong>Codierungstheorie</strong> gibt es grundsätzlich zwei verschiedene Probleme:<br />

(Ü) Übermittlungsproblem, Kanal-Code, fehlerkorrigierende <strong>Codes</strong>, channel-<br />

coding, error-correcting codes Eine Nachricht soll über einen (Übertragungs-<br />

) Kanal gesendet werden. Während der Übertragung wird die Nachricht eventu-<br />

ell verfälscht (z. B. durch Knacken in einer Telephonleitung, Kratzer auf einer<br />

CD, Störung eines Funksignals). Trotzdem soll aus der verfälschten Nachricht die<br />

Original-Nachricht berechnet werden.<br />

Um dies zu erreichen, nimmt man in Kauf, dass die übertragene Nachricht länger<br />

ist als die Originalnachricht.<br />

(Sp) Speicherproblem; Quellencodierung (source-coding, compression-code)<br />

Eine Nachricht soll möglichst platzsparend (komprimiert) gespeichert oder übermit-<br />

telt werden, wobei bei der Übertragung oder beim Speichervorgang Fehlerfreiheit<br />

vorausgesetzt wird. Beispiel: Ein Text wird durch Morse-Zeichen übermittelt. Dabei<br />

ist der Morsecode (’Morsealphabet’) so konzipiert, dass etwa der häufige Buchsta-<br />

be e ein kürzeres ’Morsezeichen’(nämlich 0) bekommt als der seltene Buchstabe q<br />

(nämlich 1101). Anderes Beispiel: Programme zip.<br />

Um (Ü) zu lösen, nutzt man ’fehlerkorrigierende’ oder ’fehlererkennende’ <strong>Codes</strong>.<br />

Falls keine Rückfrage möglich ist (z. B. beim Abspielen einer CD oder Satteli-<br />

tenübertragung) braucht man fehlerkorrigierende <strong>Codes</strong>: der Empfänger soll aus<br />

einer fehlerhaft eingetroffenen Nachrich automatisch die Originalnachricht berech-<br />

nen können.<br />

Wenn Rückfrage möglich ist (z. B. im Gespräch oder in einem Computernetzwerk)<br />

genügt oft das Wissen um einen aufgetretenen Fehler in der Übermittlung; denn<br />

dann kann die Übermittlung wiederholt werden.<br />

1


Die für (Sp) benutzten Verfahren nennt man ’Quellcodierung’: die Nachricht einer<br />

Quelle soll möglichst ökonomisch gespeichert oder übermittelt werden, wobei fehler-<br />

lose Speicherung oder übermittlung vorausgesetzt wird. Dabei ist zu präzisieren, was<br />

’möglichst ökonomisch’ bedeutet. Man braucht dazu Begriffe aus der Wahrschein-<br />

lichkeitsrechnung (endliche Wahrscheinlichkeitsräume, Entropie) und allgemein die<br />

Informationstheorie von Shannon.<br />

In der Praxis werden beide Verfahren kombiniert: Wenn etwa ein Text übermittelt<br />

werden soll, wird er zunächst mit ’Quellcodierung’ komprimiert, dann mit einem<br />

fehlerkorrigierenden Code übermittelt und schließlich decodiert.<br />

Das Problem der Kodierungstheorie darf nicht verwechselt werden mit der Aufgabe<br />

des Verschlüsselns (Chiffrierung, Kryptographie): dabei wird die Nachricht (Klar-<br />

text) nicht durch unvorhersehbare Ereignisse verfälscht, sondern als verschlüsselter<br />

Text (Chiffre) versendet, dem (im Idealfall) nur der berechtigte Empfänger den Klar-<br />

text entnehmen kann.<br />

Oft braucht man Kryptographie und <strong>Codierungstheorie</strong> in einem System, etwa bei<br />

der Übermittlung verschlüsselter Fernsehsendungen (pay-tv).<br />

In diesem Teil der Vorlesung beschäftigen wir uns mit fehlerkorrigierenden <strong>Codes</strong>.<br />

1. Problem, Beispiel<br />

1.1 Problem Eine Nachricht wird gesendet. Im Übertragungskanal wird sie mögli-<br />

cherweise verändert. Der Empfänger soll erkennen, ob die eventuell verfälschte Nach-<br />

richt Fehler aufweist und möglichst die korrekte Nachricht berechnen.<br />

Bei Sprachkommunikation mit Rückfragemöglichkeit bittet der Zuhörer den Spre-<br />

cher, eine nicht fehlerfrei erkannte Nachricht zu wiederholen. Bei Druckfehlern in<br />

Text oder Noten kann man meistens aus dem Sinnzusammenhang Fehler beheben.<br />

1.2 Grundbegriffe Sei K eine endliche Menge (’Alphabet’), |K| = n ∈ IN, V :=<br />

K l = K × .... × K hießt Menge der Wörter der (Block)länge l ∈ IN.<br />

2


Ein Code C ist eine Teilmenge mit |C| ≥ 2 von V ; Elemente von C heißen Code-<br />

Wörter.<br />

α : V × V → IN0, (x, y) ↦→ |{i ∈ {1, ..., l} | xi ̸= yi}| heisst (Hamming-<br />

)Abstandsfunktion (x = (x1, ..., xl) und y = (y1, ..., yl)).<br />

Setze für ϵ ∈ IR und a ∈ V :<br />

Bϵ(a) := {x ∈ V | α(a, x) < ϵ}<br />

B ′ ϵ(a) := {x ∈ V | α(a, x) ≤ ϵ}<br />

Sϵ(a) := {x ∈ V | α(a, x) = ϵ}<br />

(offener Ball mit Mittelpunkt a und Radius ϵ, abgeschlossener Ball mit Mittelpunkt<br />

a und Radius ϵ, Sphäre mit Mittelpunkt a und Radius ϵ).<br />

Im folgenden seien K, V, C, l, n wie in 1.2 gegeben.<br />

1.3 Bemerkung α ist eine Metrik auf V (soll bedeuten: eine Abbildung V × V →<br />

IR≥0; α(x, y) = 0 ⇔ x = y; und α ist symmetrisch; und es gilt die Dreiecksunglei-<br />

chung).<br />

1.4 Definition Nenne δ := min{α(c, e) | c, e ∈ C, c ̸= e } den Minimalabstand<br />

des <strong>Codes</strong> (wegen |C| ≥ 2 ist δ wohldefiniert).<br />

Falls K = GFn ’der’ Körper mit n ∈ IN Elementen ist, kann man V als K-Vektorraum<br />

ansehen.<br />

1.5 Beispiel ISBN-Code für Bücher. Die Zahl 0131391399 ∈ K 10 mit K = {0, 1, ..., 9, 10 =<br />

X} ist eine ISBN-Nummer. Dabei bedeuten: 0 Land (USA); 13 Verlag; 139139 ver-<br />

lagsinterne Nummer; 9 Prüfziffer.<br />

Damit die Zahl 10 nicht mit dem Ziffernpaar (1, 0) verwechselt wird, schreibt man<br />

X für 10. Hier ist<br />

C = {(z10, z9, ..., z1) | z10, ..., z2 ∈ {0, ..., 9}; z1 ∈ {0, ..., 10};<br />

10∑<br />

k=1<br />

3<br />

k · zk ≡ 0 mod 11}<br />

Das oben angegebene Wort ist wirklich ein Codewort: 10 · 0 + 9 · 1 + 8 · 3 + 7 · 1 +<br />

6 · 3 + 5 · 9 + 4 · 1 + 3 · 3 + 2 · 9 + 9 ist ≡ 0 mod 11.<br />

Angenommen, in einer ISBN-Nummer (=Codewort) z = (z10, z9, ..., z1) werden zwei<br />

benachbarte und verschiedene Buchstaben vertauscht, etwa zi und zi+1. Dann ist


die gewichtete Quersumme des entstehenden Wortes:<br />

( ∑ 10<br />

k=1;k̸=i,i+1 kzk) + izi+1 + (i + 1)zi = ( ∑ 10<br />

k=1 kzk) − zi+1 + zi ≡ zi − zi+1 mod 11; und<br />

zi − zi+1 ̸≡ 0 mod 11.<br />

Der Empfänger kann also ’Zahlendreher’ als Fehler erkennen (die beim Sprechen am<br />

Telephon häufigsten Fehler).<br />

Auch wenn bei 2 gleichen aufeinander folgenden Zahlen nur die erste gelesen und die<br />

folgende verdoppelt wird (z.B. statt 653 wird 655 empfangen) ist das entstehende<br />

Wort kein Codewort.<br />

Das Verfahren kann man verallgemeinern; zum Beispiel bei einem Alphabet {0, ..., 36}<br />

wird eine Prüfziffer angehängt, derart dass die ’gewichtete Quersumme’ kongruent<br />

0 mod 37 ist.<br />

1.6 Technische Betrachtung, Dekodierverfahren Wir nehmen an, ein Code-<br />

wort c = (c1, ..., cn) wird gesendet und es kommt das Wort d = (d1, ..., dn) an. Es<br />

kann d ̸= c sein.<br />

Der Empfänger kennt d (aber nicht c).<br />

Falls d = c gilt, also α(c, d) = 0, wurde c fehlerfrei übertragen.<br />

Nun sei d ̸= c. Dann wurden α(d, c) Stellen von c bei der Übertragung verfälscht.<br />

Wenn d ̸∈ C ist, bemerkt der Empfänger: die Übertragung war nicht fehlerfrei. Wenn<br />

d ∈ C ist, kann der arglose Empfänger den Fehler nicht erkennen. In diesem Fall<br />

gilt α(c, d) ≥ δ (=Mindestabstand).<br />

Man definiert deshalb: Sei ϵ ∈ IN0. Falls ϵ+1 ≤ δ ist, heißt der Code ϵ-fehlererkennend.<br />

Denn wenn c ∈ C und d ∈ V und α(c, d) ≤ ϵ ist (also α(c, d) < δ), so folgt d ̸∈ C<br />

(technisch gesagt: der Empfänger merkt, dass bei der Übertragung ein Fehler auf-<br />

trat).<br />

Verfahren (MDD) (minimum-distance-decoding, auch maximum-likelyhood-decoding<br />

genannt) Falls es genau ein Codewort e ∈ C gibt, das (unter allen Codewörtern)<br />

minimalen Abstand zu d hat, zeige e; sonst ∞.<br />

Formal formuliert: wir betrachten die Abbildung V → C ∪ {∞}, welche jedem Ele-<br />

ment d ∈ V das Codewort e ∈ C mit minimalem α(d, e) zuordnet falls e eindeutig<br />

ist; sonst ∞ (∞ soll natürlich kein Codewort bezeichnen).<br />

4


Verfahren (RBϵ) (radius-ϵ-sphere-shrinking) Sei ϵ ∈ IR. Wenn e das einzige Code-<br />

wort ∈ B ′ ϵ(d) ist, liefer e. Sonst melde ∞.<br />

Wir fragen nach Bedingungen, unter denen der Empfänger nach 1.5 das richtige<br />

(d.h.gesendete) Codewort c erhält.<br />

1.7 Definition Sei ϵ ∈ IN0. Nenne den Code C ϵ-korrigierend, wenn gilt<br />

für alle c, e ∈ C mit c ̸= e.<br />

1.8 Lemma Sei ϵ ∈ IR.<br />

Sei C ϵ-korrigierend.<br />

B ′ ϵ(c) ∩ B ′ ϵ(e) = ∅<br />

Seien c ∈ C und d ∈ V mit α(c, d) ≤ ϵ (d.h. d entsteht aus dem Codewort c durch<br />

Verfälschung an höchstens ϵ Stellen).<br />

Dann liefern (MDD) und auch (RBϵ) zu d das (richtige) Codewort c (denn s ist das<br />

einzige Codewort, welches unter allen Codewörtern zu d minimalen Abstand hat).<br />

Beweis Zu (MDD). Nehmen wir an, es gibt e ∈ C, e ̸= c mit α(e, d) ≤ α(c, d). Dann<br />

gilt α(e, d) ≤ α(c, d) ≤ ϵ, d.h. d ∈ B ′ ϵ(c) ∩ B ′ ϵ(e), Widerspruch.<br />

Zu (RBϵ). Jedenfalls ist c ∈ B ′ ϵ(d). Nehmen wir an, es gibt e ∈ C, e ̸= c mit<br />

e ∈ B ′ ϵ(d). Dann gilt d ∈ B ′ ϵ(c) ∩ B ′ ϵ(e), Widerspruch.<br />

1.9 Satz Sei ϵ ∈ IN0. Folgende Aussagen sind äquivalent.<br />

(i) Für alle c, e ∈ C mit c ̸= e gilt B ′ ϵ(c) ∩ B ′ ϵ(e) = ∅, d.h. C ist ϵ-korrigierend.<br />

(ii) δ ≥ 2ϵ + 1.<br />

Beweis (i) ⇒ (ii). Angenommen, (ii) ist falsch. Dann existieren c, e ∈ C mit δ =<br />

α(c, e) ≤ 2ϵ.<br />

Falls α(c, e) ≤ ϵ ist, folgt c ∈ B ′ ϵ(c) ∩ B ′ ϵ(e), Widerspruch zu (i). Also kann man<br />

δ = α(c, e) > ϵ annehmen.<br />

Seien i1, ..., iδ die Stellen, an denen sich c und e unterscheiden.<br />

Definiere z = (z1, ..., zl) ∈ V durch: zk := ek falls k ̸∈ {i1, ..., iϵ}; zk := ck falls<br />

5


k ∈ {i1, ..., iϵ}.<br />

Dann gilt α(z, e) = ϵ und α(z, c) = δ − ϵ.<br />

Wegen δ ≤ 2ϵ ist δ − ϵ ≤ ϵ.<br />

Es folgt z ∈ B ′ ϵ(c) ∩ B ′ ϵ(e) = ∅, Widerspruch zu (i).<br />

(ii) ⇒ (i). Angenommen, (i) ist falsch; d.h. es gibt verschiedene c, e ∈ C und d ∈<br />

B ′ ϵ(c) ∩ B ′ ϵ(e). Dann gilt (Dreiecksungleichung) δ ≤ α(c, e) ≤ α(c, d) + α(d, e) ≤ 2ϵ,<br />

Widerspruch zu (ii).<br />

1.10 Korollar Sei δ der Mindestabstand des <strong>Codes</strong> C. Der Code C ist 1δ<br />

− 1 kor-<br />

2<br />

rigierend im Fall δ gerade; bzw. 1(δ<br />

− 1) korrigierend im Fall δ ungerade.<br />

2<br />

Beides in einem: der Code ist [ 1(δ<br />

− 1)] korrigierend (dabei bezeichnet [β] die größte<br />

2<br />

ganzrationale Zahl ≤ β für β ∈ IR).<br />

1.11 Lemma Seien a ∈ V = K l , |K| = n und ϵ ∈ IR. Dann gilt:<br />

falls ϵ ∈ IN0, sonst = 0.<br />

|Sϵ(a)| =<br />

|Bϵ(a)| = ∑<br />

( )<br />

l<br />

(n − 1)<br />

ϵ<br />

ϵ<br />

i∈IN0, i


1.12 Betrachtungen Was ist ein ’guter’ Code ?<br />

Wenn V gegeben ist, soll C möglichst groß sein und wegen 1.9 soll auch der Mini-<br />

malabstand δ möglichst groß sein. Anschaulich ist klar: ein vorgeschriebener Mini-<br />

malabstand δ erzwingt eine Obergrenze für |C|.<br />

Zum Begriff Informationsrate. Je größer |C| im Vergleich zu |V | ist, desto mehr ’In-<br />

formation’ steht zur Verfügung. Um die Definition der Informationsrate plausibel zu<br />

machen, nehmen wir an: Zu jedem Tupel (c1, ..., ck) ∈ K k existiert genau ein Code-<br />

wort der Form (c1, ..., ck, ∗, ..., ∗) (d.h. die ersten k Stellen sind ’Informationsstellen’,<br />

die übrigen l − k sind ’Prüfstellen’). Dann gilt |C| = n k ; k = log n |C|; l = log n |V |.<br />

Man nennt dann R := k<br />

l<br />

die Informationsrate. Anders formuliert:<br />

R = log n |C|<br />

log n |V |<br />

Diese Formulierung paßt für beliebige <strong>Codes</strong>:<br />

1.13 Definition Die Zahl R in obiger Formelzeile heißt Informationsrate des (Kanal-<br />

)<strong>Codes</strong>.<br />

Man hat 0 < R ≤ 1; R wächst monoton mit |C| (bei festem V ). Bei R = 1 ist C = V .<br />

1.14 Beobachtung (Hamming-Schranke, Kugelpackungsbedingung) Gegeben sei<br />

ein Code C mit Minimalabstand δ.<br />

Setze ϵ := 1(δ<br />

− 1) (der Code ist [ϵ] fehlerkorrigierend).<br />

2<br />

Dann gilt<br />

|C| · |B ′ ϵ(∗)| ≤ |V |<br />

Dabei steht ∗ für ein beliebiges Element von V (vgl. 1.11).<br />

Umformuliert:<br />

|C| ≤<br />

|V |<br />

|B ′ ϵ(∗)|<br />

Denn je zwei Bälle B ′ ϵ(c) und B ′ ϵ(e) mit c, d ∈ C, c ̸= e, sind disjunkt. Die Menge<br />

∪<br />

c∈C B ′ ϵ(c) hat also |C| · |B ′ ϵ(∗)| Elemente und liegt in V .<br />

1.14’ Beispiel l = 90, n = 2. Dann ist |B ′ 2(∗)| = 2 12 . Wenn C ein 2 -korrigierender<br />

Code ist, muss nach 1.9 δ ≥ 5 sein, also ϵ := 1<br />

2 (δ − 1) ≥ 2. Also |B′ ϵ(∗)| ≥ |B ′ 2(∗)| =<br />

7


2 12 . Also gilt nach 1.14<br />

Wegen n lR = |C| erhält man<br />

|C| ≤ 290<br />

= 278<br />

212 1.15 Folgerung (Umformulierung von 1.14, Hamming-Schranke für R) Vorausset-<br />

zungen wie in 1.14.<br />

Es gilt |Bϵ(∗)| ≤ n l(1−R) für die Informationsrate R; also<br />

1 − log n |B ′ ϵ(∗)|<br />

l<br />

Dabei ist ∗ ein beliebiges Wort und ϵ wie in 1.14.<br />

Dies ist die ’Hamming-Schranke’ für R.<br />

≥ R<br />

1.16 Begriff Ein Code heißt perfekt, wenn die Hamming-Schranke mit = erfüllt ist.<br />

Das bedeutet, die abgeschlossenen Bälle mit Radius δ−1<br />

2<br />

Mittelpunkten überdecken disjunkt ganz V .<br />

8<br />

und den Codewörtern als<br />

Wenn es in 1.14’ also einen Code mit |C| = 2 78 und δ = 5 gäbe, wäre er perfekt.<br />

Für jedes ϵ ∈ IR≥0 gilt<br />

|V |<br />

|B ′ 2ϵ(∗)|<br />

≤ |V |<br />

|B ′ ϵ(∗)|<br />

Die Zahl rechts ist die in 1.14 auftauchende Obergrenze von |C|, wobei C ⊆ V ein<br />

ϵ -korrigierender Code ist.<br />

1.16’ Beobachtung Sei C ⊆ V ein Code mit geradem Minimalabstand δ. Dann ist<br />

C nicht perfekt.<br />

Beweis. Angenommen, C ist perfekt. Dann gilt<br />

V = ˙<br />

∪c∈CB ′ ϵ(c)<br />

(disjunkte Vereinigung) für passendes ϵ ∈ IN0.<br />

Nach 1.9 ist δ ≥ 2ϵ + 1, d.h. ϵ < δ<br />

2 .


(+) Es gibt a ∈ C und v ∈ V mit α(a, v) = δ<br />

2 .<br />

Denn man wähle a = (a1, ..., al) ∈ C beliebig und v = (v1, ..., vl) ∈ V mit vi ̸= ai für<br />

i = 1, ..., δ<br />

2 und vi = ai für i = δ + 1, ..., l.<br />

2<br />

Seien nun a ∈ C und v ∈ V wie in (+).<br />

Nach Voraussetzung existiert c ∈ C mit v ∈ B ′ ϵ(c). Es folgt a ̸= c (denn α(a, v) =<br />

δ<br />

2<br />

> ϵ). Also gilt δ ≤ α(a, c) ≤ α(a, v) + α(v, c) ≤ δ/2 + ϵ < δ; ein Widerspruch.<br />

Der folgende Satz liefert einen ϵ -korrigierenden Code mit mindestens so vielen Ele-<br />

menten wie die Zahl links in obiger Ungleichung:<br />

1.17 Satz (Gilbert-Varˇsamov-Schranke) Sei n ≥ 2, ϵ ∈ IN0 mit 2ϵ < l.<br />

Es gibt einen ϵ -korrigierenden Code C ⊆ V mit<br />

Beweis<br />

|C| ≥<br />

|V |<br />

|B ′ 2ϵ(∗)|<br />

Der zu konstruierende Code soll Mindestabstand δ := 2ϵ + 1 haben (siehe 1.9).<br />

(i) Es gibt einen Code C ⊆ V mit Mindestabstand δ.<br />

Hierzu. Wähle a ∈ V . Wegen n ≥ 2 und δ = 2ϵ + 1 ≤ l kann man b ∈ V wählen<br />

mit ai ̸= bi für i = 1, ..., δ und ai = bi für i = δ + 1, ..., l. Dann hat C := {a, b}<br />

Mindestabstand δ.<br />

(ii) Wenn C ⊆ V ein Code mit Mindestabstand δ ist und mit<br />

|C| <<br />

|V |<br />

|B ′ 2ϵ(∗)|<br />

so existiert ein Code C ′ ⊆ V mit C ′ ⊃ C (echt) und Mindestabstand δ.<br />

Beweis hiervon. Wir haben<br />

| ∪<br />

Bδ(c)| ≤ |C| · |Bδ(∗)| = |C| · |B2ϵ+1(∗)| = |C| · |B ′ 2ϵ(∗)| < |V |<br />

c∈C<br />

(letztes < nach Voraussetzung). Also existiert ein x ∈ V mit x ̸∈ ∪<br />

c∈C Bδ(c). D.h.<br />

man hat α(x, c) ≥ δ für alle c ∈ C. Setze C ′ := C ∪ {x}.<br />

Aus (i) und (ii) folgt die Behauptung.<br />

9


1.17’ Beispiel zu 1.17. Sei n = 2, l=90, ϵ = 2.<br />

Dann |B ′ 2ϵ(∗)| = |B ′ 4(∗)| = 2676766 (siehe 1.11) und |V | = 2 90 . Nach 1.17 existiert<br />

ein 2-korrigierender Code C ⊆ V mit<br />

2 Lineare <strong>Codes</strong><br />

|C| ≥<br />

|V |<br />

|B ′ 2ϵ(∗)|<br />

≈ 4, 6 · 1020<br />

Um das Dekodierverfahren (MDD) zu praktizieren, muß man nach Empfang eines<br />

Wortes d alle Abstände α(c, d) für c ∈ C berechnen. Das dauert in der Praxis oft zu<br />

lange. Deshalb nimmt man algebraische Strukturen zur Hilfe.<br />

2.1 Voraussetzungen Nun sei K ein Körper mit n Elementen und C ein Unter-<br />

vektorraum ̸= {0} des Vektorraums V = K n . Dann spricht man von einem linearen<br />

Code C.<br />

Ein solcher liege jetzt vor mit dimC = k.<br />

Wir wollen ein schnelles Verfahren für (MDD) entwickeln und ’gute’ lineare <strong>Codes</strong>.<br />

Der Hamming-Abstand ist translations-invariant, α(a − c, b − c) = α(a, b) für alle<br />

a, b ∈ V . Insbesondere α(a, b) = α(a − b, 0).<br />

Wir nennen γ(a) := α(a, 0) das Gewicht von a ∈ V .<br />

Es gilt α(a, b) = γ(a − b); durch die Gewichtsfunktion γ ist also die Abstandsfunk-<br />

tion α festgelegt.<br />

Für einen Code C ist deshalb der Minimalabstand gleich min{γ(a) | a ∈ C, a ̸= 0 }.<br />

2.2 Begriffe Eine Generatormatrix ist eine k × l-Matrix (mit Einträgen aus K),<br />

deren Zeilen eine Basis von C sind.<br />

Auf V betrachte man das Standardskalarprodukt V ×V → K. Dies ist eine reguläre<br />

symmetrische Bilinearform (es können aber durchaus isotrope Vektoren ̸= 0 vor-<br />

kommen). Deshalb gilt (C ⊥ ) ⊥ = C und r := dimC ⊥ = l − k.<br />

Wenn C ⊥ bekannt ist, dann auch C (wegen (C ⊥ ) ⊥ = C).<br />

10


Eine r × l-Matrix H, deren Zeilen eine Basis von C ⊥ bilden, heißt eine Kontrollma-<br />

trix des <strong>Codes</strong> C.<br />

Für x ∈ V nennt man dann Hx t ∈ K r das Syndrom von x (x t der zu x gehörende<br />

Spaltenvektor=l × 1-Matrix).<br />

2.3 Beobachtung Sei x ∈ V , C ⊆ V ein Code und H eine Kontrollmatrix des<br />

linearen <strong>Codes</strong> C. Dann gilt<br />

x ∈ C ⇔ x ∈ C ⊥⊥ ⇔ Hx t = 0<br />

D.h. ein Wort x ist genau dann ein Codewort, wenn sein Syndrom 0 ist.<br />

2.4 Beobachtung Voraussetzungen wie in 2.3. Für alle x, y ∈ V gilt x + C =<br />

y + C ⇔ Hx t = Hy t .<br />

D.h. zwei Wörter liegen genau dann in der gleichen Nebenklasse von V modulo C,<br />

wenn sie gleiches Syndrom haben.<br />

Denn x + C = y + C ⇔ x − y ∈ C ⇔ H(x t − y t ) = 0 ⇔ Hx t = Hy t .<br />

2.2’ Bezeichnung Sei eine Nebenklasse x+C gegeben (x ∈ V ). Man nennt f einen<br />

Anführer der Nebenklasse x + C (coset leader), wenn f ∈ x + C ist und f minimales<br />

Gewicht (unter allen Elementen von x + C) hat.<br />

Für x ∈ C ist also 0 einziger Anführer der Nebenklasse x + C = C.<br />

2.5 Lemma Sei x ∈ V .<br />

Wenn x + C genau einen Anführer f hat, existiert genau ein Codewort c ∈ C, das<br />

zu x minimalen Abstand (unter allen Codewörtern) hat; nämlich c = x − f.<br />

Wenn es genau ein Codewort c gibt, welches (unter allen Codewörten) minimalen<br />

Abstand zu x hat, so gibt es genau einen Anführer von x + C; nämlich f = x − c.<br />

Beweis Sei f einziger Anführer von x + C und c := x − f. Dann ist c ∈ C. Sei e ∈ C<br />

mit α(e, x) ≤ α(c, x). Es folgt γ(x − e) = α(x, e) ≤ α(c, x) = γ(x − c) = γ(f). Da f<br />

einziger Anführer von x + C ist und x − e ∈ x + C, folgt x − e = f = x − c; also<br />

11


e = c.<br />

Sei nun c einziges Codewort, das zu x minimalen Abstand hat. Setze f := x − c.<br />

Dann ist f ∈ x + C. Sei g ∈ x + C und γ(g) ≤ γ(f). Man hat g = x − e für ein<br />

e ∈ C und α(x, e) = γ(x − e) = γ(g) ≤ γ(f) = γ(x − c) = α(x, c), also e = c nach<br />

Voraussetzung und damit f = g.<br />

2.6 Korollar Sei f, x ∈ V und f ∈ x + C. Dann gilt:<br />

f ist einziger Anführer der Nebenklasse x + C genau dann, wenn der abgeschlossene<br />

Ball B ′ γ(f) (x) mit Mittelpunkt x und Radius γ(f) genau ein Codewort c ∈ C enthält.<br />

2.7 Dekodierverfahren<br />

Das Wort x ∈ V werde empfangen.<br />

Nach 2.5 liefert (MDD) ein Codewort c ∈ C (und nicht ∞) zu x genau dann, wenn<br />

die Nebenklasse x + C genau einen Anführer f hat. In diesem Fall ist c = x − f das<br />

von (MDD) gelieferte Codewort (das einzige x nächstliegende Codewort).<br />

Man kann beim Dekodieren (d.h. Berechnen von c) wie folgt vorgehen.<br />

Vorbereitung (unabhängig von x):<br />

Wähle eine Kontrollmatrix H.<br />

Es gibt m := |V |/|C| Nebenklassen; |V/C| = m = n l−k .<br />

Zu jeder Nebenklasse wähle einen Anführer f.<br />

Berechne die Syndrome Hf t dieser Anführer.<br />

Nun sei zu x ∈ V (praktischer Hintergrund: das empfangene Wort) das nächstlie-<br />

gende Codewort c zu finden; im Fall mehrerer nächstliegende Codewörter ist ∞ zu<br />

melden.<br />

Algorithmus hierzu:<br />

Berechne das Syndrom Hx t .<br />

Suche den Anführer f (unter den gewählten Anführern der Nebenklassen) mit<br />

Hx t = Hf t (man braucht m Vergleiche).<br />

12


Nach 2.4 gilt x + C = f + C, also f ∈ x + C.<br />

Falls f + C = x + C mehr als einen Anführer hat, existieren nach 2.5 mehrere x<br />

nächstliegende Codewörter. In diesem Fall melde ∞.<br />

Andernfalls ist nach 2.5 c := x − f das einzige x nächstliegende Codewort.<br />

Bemerkung.<br />

Man braucht also n l−k Vergleiche. Wenn man für jedes Codewort e ∈ C den Abstand<br />

α(e, x) berechnet, sind das n k Operationen.<br />

Je dichter k (die Dimension von C) bei l = dimV , desto schneller ist also der oben<br />

beschriebene Algorithmus im Vergleich zum Durchprobieren.<br />

2.8 Beispiel K = GF2, l = 4; Generatormatrix<br />

Eine Kontrollmatrix ist dann<br />

⎛<br />

⎞<br />

1 0 1 1<br />

G := ⎝ ⎠<br />

0 1 0 1<br />

⎛<br />

⎞<br />

1 0 1 0<br />

H = ⎝ ⎠<br />

1 1 0 1<br />

Nun schreiben wir ein ’Standardschema’ hin:<br />

Zu jeder Nebenklasse wähle einen Anführer;<br />

In die erste Zeile kommen die n k = 2 2 Codewörter, beginnend mit 0 (dem Anführer<br />

von C);<br />

in die erste Spalte (untereinander) die gewählten Anführer; hinter den Anführer f<br />

in die betreffende Zeile sämtliche Elemente der Restklasse f + C derart, daß f + c<br />

unter c ∈ C (der ersten Zeile) steht.<br />

Zum Schluss fügen wir eine Spalte an, in der das jeweilige Syndrom der Restklasse<br />

der betreffenden Zeile steht (siehe 2.4).<br />

Ein Standardschema:<br />

0000 0101 1011 1110 | 00<br />

0001 0100 1010 1111 | 01<br />

0010 0111 1001 1100 | 10<br />

1000 1101 0011 0110 | 11<br />

13


Wörter mit Syndom 01 können nicht eindeutig decodiert werden; denn die betref-<br />

fende Restklasse hat 2 verschiedene Anführer ( 0001 und 0100 ).<br />

14


Erste Beispiele linearer <strong>Codes</strong><br />

2.9 Beispiel (Wiederholungscode)<br />

K = GF2, l = 2k gerade,<br />

⎛<br />

⎜<br />

G := ⎜<br />

⎝<br />

1<br />

0<br />

...<br />

0<br />

1<br />

...<br />

0<br />

0<br />

...<br />

....<br />

....<br />

...<br />

1<br />

0<br />

...<br />

0<br />

1<br />

...<br />

0<br />

0<br />

...<br />

....<br />

...<br />

...<br />

⎞<br />

⎟<br />

⎠<br />

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

Generatormatrix zu C (d.h. zweimal die k × k-Einheitsmatrix aneinandergehängt).<br />

Der Code hat schlechte Informationsrate R = 1<br />

2 .<br />

2.10 Beispiel (Paritätskontroll-Code, bei n = 2 für Magnetbandspeicherung)<br />

K = GFn, l ∈ IN, C := {(x1, ..., xk, ∑ k i=1 xi) | xi ∈ K}. Dann ist k = dimC = l − 1.<br />

Informationsrate k<br />

k+1 .<br />

3.3 Lemma (Kriterium für Mindestabstand linearer <strong>Codes</strong>) Sei C ⊆ V = K l ein<br />

k-dimensionaler Code mit Minimalabstand δ. Sei H ∈ K r×l eine Matrix, deren Zei-<br />

len C ⊥ aufspannen (die Menge der Zeilen braucht nicht linear unabhängig zu sein).<br />

Dann gilt für alle d ∈ IN0:<br />

δ ≥ d ⇔ je d − 1 Spalten von H sind linear unabhängig.<br />

Beweis ⇐: Angenommen, δ < d. Jedenfalls ist d − 1 ≤ l. Es gibt c = (c1, ..., cl) ∈ C<br />

mit γ(c) = δ < d. Seien s1, ..., sl die Spalten von H.<br />

Wir nehmen (eventuell die Spalten umnumerieren) an c1, ..., cδ ̸= 0 = cδ+1 = ... = cl.<br />

Da hc t = 0 für jede Zeile von H gilt, ist ∑ l 1 sici der Nullvektor und deshalb<br />

s1c1 + ... + sδcδ = 0. Also sind s1, ..., sδ linear abhängig und wegen d − 1 ≥ δ<br />

auch s1, ..., sd−1; Widerspruch zur Annahme.<br />

⇒: Angenommen, die Spalten s1, ..., sd−1 sind linear abhängig. Dann gilt s1c1 +<br />

...sd−1cd−1 = 0 für passende ci ∈ K, nicht alle 0. Es ist c := (c1, ..., cd−1, 0, ..., 0) ∈ K l<br />

ein Codewort; denn man hat hc t = 0 für jede Zeile h von H, also c ∈ (C ⊥ ) ⊥<br />

da die Zeilen von H den Untervektorraum C ⊥ aufspannen. Das Gewicht von c ist<br />

≤ d − 1 < δ, ein Widerspruch.<br />

15


3.4 Korollar Voraussetzungen wie in 3.3. Dann gilt:<br />

d = δ ⇔ je d − 1 Spalten von H sind linear unabhängig, und es gibt d linear<br />

abhängige Spalten.<br />

Anders formuliert:<br />

δ = max{ d ∈ IN | je d − 1 Spalten sind linear unabhängig }.<br />

Wir erinnern uns an die Gilbert-Varˇsamov-Schranke 1.17. Da waren V = K l und<br />

ein Mindestabstand δ = 2ϵ + 1 (mit ϵ ∈ IN0) vorgegeben wie auch n = |K|.<br />

Behauptet wurde die Existenz ϵ-korrigierenden <strong>Codes</strong> C (Mindestabstand δ = 2ϵ+1)<br />

mit<br />

|C| ≥<br />

∑ δ−1<br />

i=0<br />

|V |<br />

)<br />

(n − 1) i<br />

Was kann man sagen bei Beschränkung auf lineare <strong>Codes</strong>? Einerseits sind dann<br />

weniger <strong>Codes</strong> zur Konkurrenz zugelassen. Andererseits ist 3.4 ein handfestes Kri-<br />

terium, einen Mindestabstand δ zu garantieren: man muß nur dafür sorgen, daß in<br />

einer Kontrollmatrix je δ − 1 Spalten linear unabhängig sind.<br />

Für lineare <strong>Codes</strong> muss n = |K| eine Primzahlpotenz sein und |C| = n k für ein<br />

passendes k ∈ IN.<br />

3.5 Satz (Gilbert-Varˇsamov-Schranke für lineare <strong>Codes</strong>)<br />

Seien d, l, n ∈ IN gegeben, d ≥ 2, k < l und sei n eine Primzahlpotenz, K := GFn<br />

und V := K l .<br />

Setze<br />

Sei k ∈ IN mit<br />

( l<br />

i<br />

( )<br />

d−2 ∑ l − 1<br />

Σ :=<br />

(n − 1)<br />

i<br />

i<br />

i=0<br />

n k <<br />

Dann gibt es einen linearen Code C ⊆ K l über K := GFn mit |C| ≥ n k und Min-<br />

destabstand ≥ d.<br />

Bemerkung<br />

Die Grenze<br />

|V |<br />

Σ<br />

|V |<br />

Σ<br />

(bei d = δ ≥ 2) ist größer oder gleich der Schranke<br />

∑ δ−1<br />

i=1<br />

|V |<br />

)<br />

(n − 1) i<br />

( l<br />

i<br />

16


(allgemeine Gilbert-Varˇsamov-Schranke in 1.17).<br />

Wir holen den Beweis von 3.5 nach und notieren<br />

3.6 Spezialfall d = 3.<br />

Seien l, n ∈ IN gegeben und sei n eine Primzahlpotenz, K := GFn und V := K l .<br />

Sei k ∈ IN, k < l. Setze r := l − k. Es gelte<br />

1 + (l − 1)(n − 1) < n r , anders formuliert : l ≤ nr − 1<br />

n − 1<br />

(das ist die Bedingung in 3.5 für d = 3).<br />

Dann gibt es einen linearen Code C ⊆ K l über K := GFn mit |C| ≥ n k und Min-<br />

destabstand ≥ 3.<br />

3.7 Definition Ein Hamming-Code ist ein k-dimensionaler linearer Code C ⊆ V =<br />

K l mit K = GFn und Mindestabstand ≥ 3, wobei für r := l − k gilt<br />

D.h. die Bedingung in 3.5’ ist scharf.<br />

3.5’ Beweis von 3.5<br />

Setze r := l − k.<br />

(i) Sei λ ∈ {1, ..., l}.<br />

l = nr − 1<br />

n − 1<br />

Für jede Matrix H ∈ K r×λ mit Spalten s1, ..., sλ setze wir<br />

LH := {x1s1 + ... + xλsλ | xi ∈ K, 0 < |{i | xi ̸= 0}| ≤ d − 1}<br />

D.h. LH ist die Menge der Linearkombinationen von höchstens d − 1 Spalten von<br />

H, wobei die Koeffizienten der Linearkombination nicht alle 0 sind.<br />

Behauptung: Zu jedem λ ∈ {1, ..., l} gibt es eine Matrix H ∈ K r×λ derart, daß<br />

0 ̸∈ LH ist, d.h. jedes Spaltentupel zu höchstens d − 1 verschiedenen Indizes ist<br />

linear unabhängig.<br />

Beweis mit Induktion über λ, mit dem offensichtlichen Anfang λ = 1.<br />

Sei 1 ≤ λ < l. Schritt auf λ + 1.<br />

17


Nach Ind.voraussetzung ex. H ∈ K r×λ eine Matrix mit 0 ̸∈ LH.<br />

Setze M := {x1s1 + ....xλsλ | xi ∈ K, 1 ≤ |{i | xi ̸= 0}| ≤ d − 2}, d.h. die Menge<br />

aller Linearkombinationen von höchstens d − 2 verschiedenen Spalten von H, deren<br />

Koeffizienten nicht alle 0 sind.<br />

Man hat<br />

∑<br />

|M| ≤ |{(x1, ..., xλ) | xi ∈ K, 1 ≤ |{i | xi ̸= 0}| ≤ d−2}| =<br />

d−2<br />

i=1<br />

18<br />

( )<br />

λ<br />

(n−1)<br />

i<br />

i < Σ ≤ n r −1<br />

(das < wegen λ ≤ l − 1 und da der Summand bei Σ mit 0 anfängt; das ≤ wegen der<br />

Voraussetzung). Deshalb existiert ein s ∈ K r \ {0} mit s ̸∈ M.<br />

Setze H ′ := (H | s) (d.h. s wird als Spalte an H angefügt. Dann hat H ′ die Eigen-<br />

schaft 0 ̸∈ LH ′.<br />

Damit ist die Behauptung bewiesen.<br />

Wir wählen nun eine Matrix H ∈ K r×l derart, daß je d−1 Spalten unabhängig sind.<br />

Der von den r Zeilen von H im K l aufgespannte Untervektorraum U hat Dimension<br />

≤ r. Für C := U ⊥ gilt deshalb dimC ≥ n − r ≥ k. Außerdem spannen die Zeilen<br />

von H den Untervektorraum C ⊥ = U auf. Nach 3.3 gilt für den Mindestabstand δ<br />

des <strong>Codes</strong> C: δ ≥ d.


Wir erinnern an die Definition eines Hamming-<strong>Codes</strong>: Ein Hamming-Code ist ein<br />

k-dimensionaler linearer Code C ⊆ V = K l mit K = GFn und Mindestabstand ≥ 3,<br />

wobei für r := l − k gilt<br />

l = nr − 1<br />

n − 1<br />

D.h. die Bedingung in 3.5’ ist scharf.<br />

3.8 Satz Hamming-<strong>Codes</strong> sind perfekt und ihr Mindestabstand ist gleich 3. Sie sind<br />

also 1-korrigierend (und 2-fehlererkennend).<br />

Beweis Sei C ⊆ V = K l ein k-dimensionaler Hamming-Code. Nach Voraussetzung<br />

ist sein Mindestabstand δ ≥ 3 und es gilt l = nr−1 und k = l − r.<br />

n−1<br />

Sei ϵ ∈ IN maximal mit B ′ ϵ(c) ∩ B ′ ϵ(d) = ∅ für je zwei verschiedene c, d ∈ C (d.h. ϵ<br />

maximal derart, dass C ϵ-fehlerkorrigierend ist). Dann gilt<br />

(1) n l−r · (1 + l(n − 1)) = n k · (1 + l(n − 1)) = |C||B ′ 1(∗)| ≤ |C||B ′ ϵ(∗)| ≤ |V | = n l<br />

Nach Voraussetzung ist die linke Seite gleich n l . Deshalb sind die Ungleichungen in<br />

(1) Gleichheiten. Es folgt |B ′ 1(∗)| = |B ′ ϵ(∗)|, also (da ϵ ganzzahlig ist) ϵ = 1 und<br />

δ = 3 und |C||B ′ ϵ(∗)| = |V |, also |C||B ′ 1(∗)| = |V |. Letzeres bedeutet der Code ist<br />

perfekt; V ist disjunkte Vereinigung der abgeschlossenen Bälle B ′ 1(c) (wobei c ∈ C<br />

läuft). Nach Wahl von ϵ gilt δ = 3 oder δ = 4. Da ein perfekter Code ungeraden<br />

Mindestabstand hat, folgt δ = 3.<br />

3.9 Beobachtung Sei C ⊂ V = K l (|K| = n) ein perfekter linearer Code mit Min-<br />

destabstand 3. Dann ist C ein Hamming-Code. Die Anführer der Nebenklassen sind<br />

genau die Wörter mit Gewicht ≤ 1, und jede Nebenklasse hat genau einen Anführer.<br />

Beweis Der Faktorraum V/C hat n l−k = n r Elemente (=Nebenklassen).<br />

Da C perfekt und δ = 3 ist, gilt |V | = |C||B ′ 1(∗)|, also n r = l(n − 1) + 1.<br />

Also ist C ein Hamming-Code und es gibt genau l(n − 1) + 1 Nebenklassen ∈ V/C.<br />

Es gibt auch genau l(n − 1) + 1 Wörter ∈ V mit Gewicht ≤ 1.<br />

Verschiedene Wörter v, w ∈ V mit Gewicht ≤ 1 liegen in verschiedenen Nebenklas-<br />

sen (sonst 0 ̸= v − w ∈ C und δ = 3 ≤ γ(v − w) = α(v, w) ≤ 2).<br />

Deshalb enthält jede Nebenklasse genau ein Element mit Gewicht ≤ 1.<br />

Also sind die Anführer der Nebenklassen genau die Wörter mit Gewicht ≤ 1 (und<br />

jede Nebenklasse hat genau einen Anführer).<br />

19


3.10 Satz (Konstruktion binärer Hamming-<strong>Codes</strong>) Sei r ∈ IN, n := 2, K := GF2.<br />

Setze l = 2 r − 1 und k = l − r.<br />

Sei H die r × (2 r − 1) -Matrix, deren Spalten genau die Vektoren ̸= 0 aus K r sind.<br />

Dann hat H den Rang r und der Code C ⊆ V := K l mit H als Kontrollmatrix ist<br />

ein Hamming-Code; Bezeichnung: Ham(r, 2).<br />

Beweis Der Aufspann der Spalten von H ist K r , hat also die Dimension r. Also hat<br />

H den Rang (=Zeilenrang=Spaltenrang) r.<br />

Der Code C (d.h. der Senkrechtraum des Aufspanns der Zeilen von H) hat also die<br />

Dimension l − r. Die Identität l(n − 1) = n r − 1 ist für n = 2 erfüllt. Je 2 = 3 − 1<br />

Spalten von H sind linear unabhängig. Deshalb hat C nach 3.3 Mindestabstand ≥ 3.<br />

3.11 Bemerkung zum Dekodieren von Ham(r, 2).<br />

Der Faktorraum V/C hat 2 l−k = 2 r = l + 1 Elemente (=Nebenklassen).<br />

Nach 3.9 sind die Anführer der Nebenklassen genau die Wörter mit Gewicht ≤ 1,<br />

und jede Nebenklasse hat genau einen Anführer).<br />

Die Syndrome der Nebenklassen ̸= C sind also genau die l Spalten von H.<br />

Hieraus ergibt sich das folgende einfache Dekodierverfahren.<br />

Ordne die Spalten von H so an, daß in der j-ten Spalte die Binärdarstellung der<br />

natürlichen Zahl j steht (1 ≤ j ≤ l = 2 r − 1).<br />

Es sei x ∈ V zu dekodieren. Falls x ∈ C, gebe x aus. Andernfalls ist Hx t ∈<br />

K r \ {0} die Binärdarstellung etwa der Spalte Nummer j von H. Dann ist f :=<br />

(0, .., 0, 1, 0, .., 0) (1 in Position j) der Anführer von x + C (denn Hx t = Hf t und f<br />

ist ein Anführer). Gebe c := x − f aus.<br />

3.12 Konstruktion beliebiger Hamming-<strong>Codes</strong>.<br />

Sei n ∈ IN eine Primzahlpotenz und r ∈ IN.<br />

Sei K der Körper der Ordnung n; setze l = nr −1<br />

n−1 .<br />

Wir wollen einen Hamming-Code C ⊂ V := K l der Dimension k := n − r konstru-<br />

ieren, indem wir eine passende Kontrollmatrix H ∈ K r×l angeben. Es genügt nach<br />

3.4 eine Matrix H ∈ K r×l zu finden, die Rang r hat und in der je 2 Spalten zu<br />

verschiedenen Indizes linear unabhängig sind.<br />

20


Nun enthält K r genau l = nr −1<br />

n−1<br />

verschiedene 1-dimensionale Untervektorräume.<br />

Aus jedem dieser Untervektorräume wählen wir einen Vektor ̸= 0; Die Matrix H,<br />

deren Spalten diese Vektoren sind, genügt den Forderungen (der Aufspann der Spal-<br />

ten ist K r , deshalb ist der Rang der Matrix r).<br />

Offenbar gibt es bis auf Reihenfolge der Spalten und Multiplikation jeder Spalte mit<br />

einem Faktor ̸= 0 keine andere Alternative zur Wahl von H.<br />

Ein so konstruierter Hamming-Code heißt Ham(r, n).<br />

Historisches: Die Hamming-<strong>Codes</strong> waren die ersten praktisch genutzten <strong>Codes</strong> mit<br />

großer Wortlänge und sind erstmals beschrieben in:<br />

R.W. Hamming, Error detecting and error-correcting codes, Bell Syst. Tech. J. 29<br />

(1950).<br />

4. Äquivalenz von <strong>Codes</strong><br />

4.1 Begriff Äquivalenz von <strong>Codes</strong> Sei C ⊆ K l ein Code (nicht notwendig linear).<br />

a) Sei φ eine Permutation von {1, ..., l}. Für ein Wort v = (v1, ..., vl) ∈ K l setze<br />

ˆv := (v1φ, ..., vlφ).<br />

Dann ist Ĉ := {ĉ | c ∈ C} ⊆ Kl ein Code mit gleicher Mächtigkeit und gleichem<br />

Mindestabstand wie C.<br />

b) Sei j ∈ {1, ..., l} und π eine Permutation von K (wenn K ein Körper ist, zum<br />

Beispiel die Multiplikation mit einem Körperelement ̸= 0).<br />

Für ein Wort v = (v1, ..., vl) ∈ K l setze ˆv := (v1, ..., vjπ, ..., vl) (d.h. an der Position<br />

j wird π angewendet).<br />

Dann ist Ĉ := {ĉ | c ∈ C} ⊆ Kl ein Code mit gleicher Mächtigkeit und gleichem<br />

Mindestabstand wie C.<br />

Man nennt C ′ ⊆ K l einen zu C äquivalenten Code, wenn man C ′ aus C durch<br />

(endlich viele) Umformungen der Typen a) und b) erhält.<br />

Äquivalente <strong>Codes</strong> haben offenbar gleichen Mindestabstand und gleiche Mächtig-<br />

keit.<br />

21


Deshalb sieht man äquivalente <strong>Codes</strong> als gleich gut an.<br />

4.2 Bemerkung Sei C ⊆ K l ein Code und 0 ∈ K irgendein Element. Dann existiert<br />

ein zu C<br />

äquivalenter Code C ′ mit (0, ..., 0) ∈ C ′ .<br />

4.3 Bemerkung Seien r, n ∈ IN (n Primzahlpotenz). Je zwei Hamming-<strong>Codes</strong> vom<br />

Typ Ham(r, n) sind äquivalent.<br />

Beweis durch Revision von 3.12.<br />

4.4 Beispiel (Anwendung) Sei l = 5 vorgegeben und K = {0, 1}. Wir wollen einen<br />

Code C ⊆ K l mit Mindestabstand 3 und |C| ≥ 4 konstruieren (nicht notwendig<br />

linear).<br />

Gibt es einen solchen Code?<br />

Ist er bis auf Äquivalenz eindeutig ?<br />

Da es ≥ 200000 4-elementige Teilmengen von K 5 gibt, ist Probieren (Mindestab-<br />

stand ≥ 3 ?) mühsam.<br />

Angenommen, C ist ein Code mit den genannten Eigenschaften.<br />

Nach 4.2 darf man annehmen 00000 ∈ C.<br />

Dann hat jedes Codewort ̸= 00000 mindestens 3 1-Einträge.<br />

Es folgt 11111 ̸∈ C.<br />

Es gibt höchstens 1 Codewort mit genau 4 1-Einträgen.<br />

Also existieren mindestens 2 Codewörter mit genau 3 1-Einträgen.<br />

Nach Umformung vom Typ a) in 4.1 darf man also annehmen 00000, 11100, 00111 ∈<br />

C.<br />

Durch Ausprobieren folgt: Das einzig mögliche weitere Codewort ist 11011.<br />

Resultat: Bis auf Äquivalenz ist C = {00000, 11100, 00111, 11011 } der einzige<br />

Code mit den geforderten Eigenschaften.<br />

4.5 Äquivalenz linearer <strong>Codes</strong><br />

22


Sei C ⊆ V = K l ein linearer Code, dimC = k.<br />

Sei G eine Generatormatrix.<br />

Der Zeilenaufspann von G, d.h. der Code C, ändert sich nicht, wenn wir G ersetzen<br />

durch eine Matrix G ′ , die aus G durch ’elementare Zeilenumformungen’ enstanden<br />

ist. Das sind die Operationen:<br />

Permutation der Zeilen;<br />

Zeile zi ersetzen durch zi + zj wobei i ̸= j ist;<br />

Zeile zi ersetzen durch λzi wobei λ ∈ K \ {0} ist.<br />

Eine beliebige Matrix G kann man durch Nacheinanderausführung von elementaren<br />

Zeilenumformungen verwandeln in eine ’reduzierte Treppenmatrix’ G ′ . Im Fall einer<br />

Generatormatrix G ist die Anzahl k der Zeilen gleich dem (Zeilen-)Rang von G und<br />

auch gleich dem Rang von G ′ . In G ′ hat jede Zeile als ersten Eintrag ̸= 0 eine 1 und<br />

in der Spalte dieser 1 steht sonst nur 0. Die Anzahl der Nullen vor dieser Zeileneins<br />

steigt monoton mit dem Zeilenindex. Es gibt in G ′ keine 0-Zeile.<br />

Durch Permutation der Spalten von G ′ kann man eine Matrix G ′′ = (E|B) gewin-<br />

nen, wobei E die k × k -Einheits matrix ist und B ∈ K k×(l−k . Damit haben wir<br />

gezeigt:<br />

4.5’ Satz Aus jedem linearen k-dimensionalen Code C gewinnt man durch passende<br />

Umwandlung vom Typ a) in 4.1 einen äquivalenten Code C ′ , der als Generatormatrix<br />

eine Matrix der Form<br />

G ′ = (<br />

hat, wobei E eine k × k-Einheitsmatrix ist.<br />

E B<br />

Der Code C ′ hat offenbar die Eigenschaft: Zu c1, ..., ck ∈ K existiert genau ein Co-<br />

dewort c der Form c = (c1, ..., ck, ∗, ..., ∗).<br />

Man nennt deshalb 1, ..., k die Informationsstellen und k + 1, ..., l die Prüfstellen.<br />

4.5” Zusatz Wir betrachten einen k-dimensionalen Code mit einer Generatormatrix<br />

wie in 4.5’. Dann ist offenbar<br />

(<br />

B t −E ′<br />

eine Kontrollmatrix des <strong>Codes</strong> (dabei ist E ′ eine (l − k) × (l − k) -Einheitsmatrix).<br />

)<br />

)<br />

23


4.5”’ Beispiel<br />

⎛<br />

1<br />

⎜ 0<br />

G = ⎜ 0<br />

⎝<br />

0<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

0<br />

1<br />

1<br />

⎞<br />

1<br />

⎟<br />

1 ⎟<br />

0 ⎟<br />

⎠<br />

0 0 0 1 0 1 1<br />

Eine Kontrollmatrix ist<br />

⎛<br />

1<br />

⎜<br />

H = ⎜ 0<br />

⎝<br />

1<br />

1<br />

1<br />

1<br />

0<br />

1<br />

−1<br />

0<br />

0<br />

−1<br />

0<br />

0<br />

⎞<br />

⎟<br />

⎠<br />

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

5. Erste Bemerkungen zu <strong>Codes</strong> und Inzidenzstrukturen<br />

5.1 Definition Eine Inzidenzstruktur sei hier ein Tripel (P, B, I), wobei P und B<br />

Mengen seien (Elemente von P nenne Punkte, die von B Blöcke) und I eine Relation<br />

zwischen Punkten und Blöcken (d.h. I ⊆ P × B; statt (a, c) ∈ I schreibt man aIc).<br />

Statt Block kann man auch Gerade sagen, was aber in der Kombinatorik nicht üblich<br />

ist.<br />

Seien λ, d, l ∈ IN. Ein S(λ, d, l)-Steiner-System ist eine Inzidenz-Struktur (P, B, I)<br />

mit den Eigenschaften:<br />

S1. Zu beliebigen λ Punkten existiert genau ein mit diesen Punkten inzidenter Block.<br />

S2. Jeder Block inzidiert mit genau d Punkten;<br />

S3. |P | = l;<br />

5.2 Beispiel Eine affine Ebene der Ordnung o ∈ IN ist ein S(2, o, o 2 ) Steiner-System.<br />

Eine projektive Ebene der Ordnung o ∈ IN ist ein S(2, o+1, o 2 +o+1) Steiner-System.<br />

5.3 Definition/Satz Sei C ⊆ V = K l ein perfekter linearer Code, n = |K| = 2,<br />

mit Minimalabstand δ = 2ϵ + 1.<br />

Wir ordnen dem Code eine Inzidenzstruktur zu:<br />

P := {1, ..., l}; B := {c ∈ C | γ(c) = δ}; I := {(j, c) | πj(c) = 1}. Dabei sei<br />

πj : V → K, πj((v1, ..., vl)) := vj die Abbildung auf die j-te Koordinate.<br />

24


Behauptung: Diese Inzidenzstruktur ist ein S(ϵ + 1, δ, l) Steiner-System.<br />

Beweis Nur S1. ist nicht gleich offensichtlich. Sei also eine Menge von ϵ + 1 Punkten<br />

gegeben. Zu zeigen: es gibt genau einen Block, der mit all diesen Punkten inzidiert.<br />

Wir dürfen annehmen, die Punkte sind 1, 2, ..., ϵ + 1.<br />

Zu zeigen ist also: es gibt genau ein c = (c1, ..., cl) ∈ C mit γ(c) = δ und c1, ..., cϵ+1 ̸=<br />

0.<br />

Setze x := (1, ..., 1, 0, ..., 0) ∈ V (mit ϵ + 1 Einsen).<br />

Existenz.<br />

Da der Code perfekt mit Minimalabstand δ = 2ϵ + 1 ist, existiert genau ein c ∈ C<br />

mit x ∈ B ′ ϵ(c); d.h. es gibt (genau) ein c ∈ C mit Hamming-Abstand α(x, c) ≤ ϵ.<br />

Es gilt c ̸= 0 (denn α(x, 0) > ϵ).<br />

Mit δ ≤ γ(c) = α(c, 0) ≤ α(c, x) + α(x, 0) ≤ δ folgt γ(c) = δ, also c ∈ B. Es ist<br />

c1, ..., cϵ+1 ̸= 0; denn wäre etwa c1 = 0, so wäre für y := (0, 1, 1, .., 1, 0, ..., 0) ∈ V<br />

(letzte Eins an der Stelle ϵ + 1):<br />

α(y, c) < α(x, c) ≤ ϵ. Man hätte also α(0, c) ≤ α(0, y) + α(y, c) ≤ ϵ + ϵ < δ, Wider-<br />

spruch.<br />

Eindeutigkeit.<br />

Angenommen, c, e ∈ B erfüllen c, e I 1, 2, ..., ϵ + 1.<br />

Dann gilt α(c, e) ≤ α(c, x) + α(x, e) ≤ ϵ + ϵ < δ, also c = e.<br />

5.3’ Spezialfall Der Code sei ein Hamming-Code über GF2. Dann ist die in 5.3<br />

definierte Inzidenzstruktur ein S(2, 3, l)-Steiner-System mit l = nr−1 . Das ist ein<br />

n−1<br />

Steiner-System, in dem je 2 verschiedene Punkte mit genau einem Block inzidieren,<br />

und jeder Block genau 3 Punkte enthält.<br />

Explizit bedeutet das für den Code:<br />

S1. Zu zwei beliebigen Stellen j1, j2 ∈ {1, ..., l} existiert genau ein Codewort c =<br />

(c1, ..., cl) ∈ C mit γ(c) = 3 und cj1 = 1 = cj2.<br />

Beispiel für ein S(2, 3, l)-Steiner-System ist die affine Ebene zum Vektorraum (GF3) 2<br />

und auch die projektive Ebene zum Vektorraum (GF2) 3 .<br />

25


6. Perfekte <strong>Codes</strong>, Golay-<strong>Codes</strong><br />

Sei C ⊆ V := K l (n := |K| ∈ IN ).<br />

Wir erinnern daran, daß der Code C perfekt genannt wird, wenn ein ϵ ∈ IN0 existiert<br />

mit<br />

wobei die Vereinigung disjunkt ist.<br />

Es folgt (mit m := |C|):<br />

(perf) n l = m(1 +<br />

V = ˙∪<br />

c∈C B′ ϵ(c)<br />

( )<br />

l<br />

(n − 1)<br />

1<br />

1 +<br />

( )<br />

l<br />

(n − 1)<br />

2<br />

2 + ... +<br />

In diesem Fall ist δ := 2ϵ + 1 der Mindestabstand des <strong>Codes</strong>.<br />

( )<br />

l<br />

(n − 1)<br />

ϵ<br />

ϵ )<br />

Seit 1950 bearbeitete M. Golay das Problem, alle perfekten <strong>Codes</strong> zu bestimmen.<br />

Für Primzahlpotenzen n gelang J.H. van Lint und A. Tietäväinen 1973 eine Teil-<br />

Lösung (6.4), nämlich die möglichen Parametertripel (l, |C|, δ) zu bestimmen (zu<br />

denen es einen perfekten Code C ⊆ K l mit Mindestabstand δ gibt), wenn n eine<br />

Primzahlpotenz ist.<br />

Die Hamming-<strong>Codes</strong> Ham(r, n) liefern Beispiele für perfekte <strong>Codes</strong> zu Primzahlpo-<br />

tenzen n mit l = nr −1<br />

n−1 und |C| = nk wobei k := l − r ist und ϵ = 1; also δ = 3.<br />

’Triviale’ Beispiele perfekter <strong>Codes</strong> sind C = V (d.h. jedes Wort ist ein Codewort;<br />

also ϵ = 0, δ = 1) und C = {(0, ..., 0), (1, ..., 1)} ⊂ K l wobei K = {0, 1} ist und l<br />

ungerade (also ϵ = 1(l<br />

− 1)).<br />

2<br />

Wenn n keine Primzahlpotenz ist, ist sehr wenig über die Existenz perfekter <strong>Codes</strong><br />

bekannt.<br />

Theorem (Tietäväinen, van Lint, Zinovev, Leontev) über einem endlichen Körper<br />

existieren (bis auf Äquivalenz) nur die folgenden nicht-trivialen linearen perfekten<br />

<strong>Codes</strong>:<br />

• Die Hamming-<strong>Codes</strong> Ham(r, n) (Länge l = nr−1 , r = l − k wobei k = dimC,<br />

n−1<br />

K = GFn; δ = 3).<br />

• Die beiden Golay-<strong>Codes</strong> G23, G11 (Beschreibung unten).<br />

Bescheidenere Frage: Welche Zahlentripel (l, m, ϵ, n) gibt es, die (perf) erfüllen?<br />

Für n = 3 ist (l, m, ϵ, n) = (11, 3 6 , 2, 3) eine Lösung von (perf) (denn 3 11 = 3 6 (1 +<br />

26


11 · 2 + ( )<br />

11<br />

· 2 2<br />

2 )).<br />

Für n = 2 fand Golay: (23, 212 , 3, 2) und (90, 278 , 2, 2).<br />

Um 1970 hat van Lint mit Computer berechnet, dass es für l ≤ 1000, ϵ ≤ 1000 und<br />

n ≤ 100 (n Primzahlpotenz) neben den oben genannten keine weiteren Beispiele<br />

von Zahlenquadrupeln mit (perf) gibt (d.h. nur Parameter (l, m, ϵ, n) zu Hamming-<br />

<strong>Codes</strong> oder trivialen <strong>Codes</strong> oder die eben genannten drei).<br />

Zu den Parametern (23, 2 12 , 3, 2) und (11, 3 6 , 2, 3) hat Golay perfekte lineare <strong>Codes</strong><br />

konstruiert; zu (l = 90, |C| = 2 78 , ϵ = 2, n = 2) gibt es keinen perfekten Code.<br />

Wir beweisen zunächst eine Teilaussage der letzten Feststellung, machen nämlich<br />

die Zusatzannahme C ist linear.<br />

6.1 Satz Es gibt keinen linearen Code C ⊆ K 90 mit K = GF2 und dimC = 78<br />

und Mindestabstand δ = 2ϵ + 1 = 5 (obwohl für die Parameter die Identität (perf)<br />

stimmt. Falls es einen solchen Code gäbe, wäre er perfekt).<br />

Beweis Man hat 2 90 = 2 78 · |B ′ 2(∗)|, denn |B ′ 2(∗)| = 2 12 = 4096. Also stimmt (perf)<br />

für die angegebenen Parameter.<br />

Angenommen, C ist ein Code wie beschrieben.<br />

Sei H ∈ K 12×90 eine Kontrollmatrix von C.<br />

Nach 3.3 sind wegen δ = 5 je 4 der Spalten S1, ..., S90 von H linear unabhängig.<br />

Die Menge S := {Si, Sj + St | i, j, t ∈ {1, ..., 90} und j ̸= t} besteht deshalb aus<br />

90 + ( )<br />

90<br />

= 2 2<br />

12 − 1 Elementen. Deshalb ist S ∪ {0} = K12 . In K12 gibt es genauso<br />

viele gerade Vektoren wie ungerade (=mit ungeradem Gewicht), nämlich 211 (gilt<br />

allgemein in K l ). Deshalb enthält S genau 2 11 ungerade Vektoren.<br />

Man hat für Abstand α und Gewicht γ:<br />

γ(Si + Sj) = γ(Si − Sj) = α(Si, Sj) = γ(Si) + γ(Sj) − 2 · γ(Si ∧ Sj)<br />

(Si ∧ Sj sei der Vektor, der genau an den Stellen eine Eins hat, wo Si und Sj beide<br />

eine Eins haben). Also ist Si +Sj genau dann ungerade, wenn genau einer der beiden<br />

Vektoren Si, Sj ungerade ist.<br />

Sei u die Anzahl der ungeraden Spalten von H. Die Anzahl der ungeraden Vektoren<br />

in S ist nach dem Gesagten u + u(90 − u) = u(91 − u) (der Term u(90 − u) zählt<br />

die ungeraden der Form Sj + St) .<br />

Wir erhalten also u(91 − u) = 2 11 (und u, 91 − u ̸= 1). Deshalb sind u und 91 − u<br />

gerade Zahlen (Eindeutigkeit der Primfaktorzerlegung), ein Widerspruch.<br />

27


Wir brauchen eine Hilfskonstruktion.<br />

6.2 Satz/Definition Erweitern und Verkürzen durch Paritäts-Stelle<br />

Seien l, m ∈ IN, δ ungerade und K = {0, 1}.<br />

a) Sei C ⊆ K l ein (nicht notwendig linearer) Code mit |C| = m und ungeradem<br />

Mindestabstand δ.<br />

Für v = (v1, ..., vl) ∈ K l setze ˆv := (v1, ..., vl, 0) ∈ K l+1 oder ˆv := (v1, ..., vl, 1) ∈<br />

K l+1 je nachdem v gerade oder ungerade ist.<br />

Dann ist Ĉ := {ĉ | c ∈ C} ⊆ Kl+1 ein Code mit Mindestabstand δ+1 und | Ĉ| = m.<br />

Falls C linear, ist Ĉ linear.<br />

b) Sei Ĉ ⊆ Kl+1 ein Code mit geradem Mindestabstand δ + 1.<br />

Wähle Codewörtert x, y ∈ Ĉ mit Abstand δ + 1.<br />

Sei etwa xl+1 ̸= yl+1. Streiche in allen Codewörtern die l+1-te Stelle. Der entstehende<br />

Code C ⊆ K l hat Mindestabstand δ und erfüllt |C| = | Ĉ| (wenn c(c1, ..., cl, 0), d =<br />

(c1, ..., cl, 1) ∈ C ist, folgt α(c, d) = 1 < 2 ≤ δ + 1, Widerspruch).<br />

Falls Ĉ linear, ist C linear.<br />

6.3 Golay-Code Wir konstruieren einen perfekten linearen Code mit l = 23,<br />

K = GF2, dim C = 12, Mindestabstand δ = 7 (Bezeichnung: G23).<br />

Zunächst erklären wir den ’erweiterten Golay-Code’<br />

28<br />

Ĉ; das ist ein linearer Code<br />

zu K = GF2 mit l = 24 und dimĈ = 12 und Mindestabstand 8. Bezeichnung:<br />

G24 := Ĉ.<br />

Nach 6.2 erhält man durch Verkürzen einen linearen Code C ⊂ K 23 (siehe 6.2).<br />

Bezeichnung: G23.<br />

Die Matrix G ∈ K 12×24 definiere durch G := ( E A ). Dabei sei E die 12 × 12-


Einheitsmatrix und<br />

⎛<br />

⎞<br />

011111111111<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 111011100010 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 110111000101 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 101110001011 ⎟<br />

⎜<br />

⎟<br />

⎜ 111100010110 ⎟<br />

⎜<br />

⎟<br />

⎜ 111000101101 ⎟<br />

A := ⎜<br />

⎟<br />

⎜ 110001011011 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 100010110111 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 100101101110 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ 101011011100 ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎝<br />

110110111000 ⎟<br />

⎠<br />

101101110001<br />

Ĉ sei der von den Zeilen von G aufgespannte Untervektorraum von K 24 .<br />

Beobachtungen<br />

(i) Offenbar ist RangG =RangE = 12.<br />

(ii) Es gilt A t = A und A · A t = A · A = E (Einheitsmatrix).(direkt Überprüfen).<br />

Es ist Ĉ totalisotrop (bezüglich gewöhnlichem Skalarprodukt), d.h. Ĉ ⊆ Ĉ⊥ . Denn<br />

GG t = 0-Matrix, d.h. xy t = 0 für je zwei Zeilen x, y von G.<br />

Wegen dim Ĉ⊥ = 12 =dim Ĉ folgt Ĉ = Ĉ⊥ .<br />

Der Senkrechtraum C ⊥ wird von den Zeilen der Matrix ( A t E ) = ( A E) aufge-<br />

spannt (4.5”). Deshalb gilt<br />

(iii) ( A E) ist eine Generatormatrix von Ĉ.<br />

Jede Zeile x von G hat durch 4 teilbares Gewicht γ(x).<br />

Seien x, y Zeilen von G. Wegen xy t = 0 (siehe (ii)) gilt: 2 teilt γ(x ∧ y).<br />

Also ist γ(x + y) = γ(x) + γ(y) − 2γ(x ∧ y) durch 4 teilbar. Analoger Schluß: die<br />

Summe von drei Zeilen hat durch 4 teilbares Gewicht, und so fort. Es folgt<br />

(iv) Jedes Codewort ∈ Ĉ hat durch 4 teilbares Gewicht.<br />

(v) Kein c ∈ Ĉ hat Gewicht 4.<br />

29


Zum Beweis unterscheidet man mehrere Fälle. Sei c ∈ Ĉ mit γ(c) = 4.<br />

Sei c = (links rechts) wobei links := (c1, ..., c12) und rechts := (c13, ..., c24) sei.<br />

1. Fall γ(links) = 0 erzwingt offenbar c = 0 (c als Linearkombination der Zeilen von<br />

G ansehen).<br />

2. Fall γ(links) = 1. Dann ist c eine der Zeilen von G; unmöglich.<br />

3. Fall γ(links) = 2. Dann ist c Summe zweier verschiedener Zeilen von G; unmöglich<br />

(überprüfen).<br />

4. Fall γ(links) = 3. Dann ist c Summe dreier verschiedener Zeilen von G, aber es<br />

wäre mühsam, alle diese Möglichkeiten zu überprüfen. Einfaches Argument: Es folgt<br />

γ(rechts) = 1 und wegen (iii) ist c eine Zeile der Matrix ( A E).<br />

5. Fall γ(links) = 4. Es folgt γ(rechts) = 0 und wie im vorigen Fall folgt: c ist<br />

Summe von 0 Zeilen der Matrix ( A E), also c = 0.<br />

Aus (iv) und (v) und da es offenbar Codewörter mit Gewicht 8 gibt, folgt<br />

(vi) Ĉ hat Mindestabstand 8.<br />

Damit haben wir G24 mit den versprochenen Eigenschaften gewonnen.<br />

Nach 6.2 erhalten wir durch Streichen der letzten Stelle in G24 einen Code G23 mit<br />

Mindestabstand 7 und Dimension 12.<br />

Dieser ist perfekt wegen<br />

2 12 · (1 + 23 +<br />

( )<br />

23<br />

+<br />

2<br />

( )<br />

23<br />

) = 2<br />

3<br />

23<br />

6.3’ Konstruktion von G11 Wir konstruieren einen perfekten linearen Code mit<br />

l = 11, K = GF3, dim C = 6, Mindestabstand δ = 5.<br />

Das funktioniert analog wie in 6.3.<br />

Zuerst besorgt man sich einen linearen Code Ĉ über GF3 mit l = 12, dim C = 6<br />

und Mindestabstand 6.<br />

Ĉ wird in einer Übungsaufgabe angegeben (Bezeichnung G12). Aus diesem erhält<br />

man dann durch Streichen der letzten Stelle gemäss 6.2 einen perfekten Code mit<br />

den gewünschten Parametern. Bezeichnung G11.<br />

30


6.4 Satz (van Lint und Tietäväinen) Sei C ein nicht-trivialer (d.h. C ̸= K l ) perfek-<br />

ter Code C ⊆ K l , mit Mindestabstand δ, wobei n := |K| eine Primzahlpotenz ist.<br />

Dann ist das Zahlentripel (l, |C|, δ) das gleiche wie bei einem Hamming-Code oder<br />

einem der beiden perfekten Golay-<strong>Codes</strong> G23, G11 (d.h. (23, 2 12 , 7); (11, 3 6 , 5)). Der<br />

Code C ist aber nicht notwendig äquivalent zu einem dieser <strong>Codes</strong>.<br />

Der Beweis ist langwierig.<br />

31


7. Hauptproblem der <strong>Codierungstheorie</strong>, Datenkompression mit <strong>Codes</strong><br />

7.1 Seien n, l, δ ∈ IN, n ≥ 2, gegeben. Sei |K| = n.<br />

Setze An(l, δ) := max{ |C| | C ist Code ⊆ K l mit Mindestabstand ≥ δ }.<br />

Als Hauptproblem bezeichnet man die Bestimmung von An(l, δ).<br />

Falls δ = 1 gilt An(l, 1) = n l .<br />

Falls δ = l gilt An(l, l) = n.<br />

Wir haben in 4.4 gefunden A2(5, 3) = 4.<br />

Selbst bei n = 2 und für einige ziemlich kleinen Werte von δ und l ist An(l, δ) nicht<br />

genau bekannt!<br />

Beispiel:<br />

Man weiss: 2560 ≤ A2(16, 3) ≤ 3276; 256 ≤ A2(16, 5) ≤ 340; 144 ≤ A2(11, 3) ≤ 158.<br />

(Quelle: N.J.A. Sloane: Error correcting codes...).<br />

7.2 Satz (Singleton-Schranke) Seien n, l, δ ∈ IN. Es gilt An(l, δ) ≤ n l−δ+1 .<br />

Beweis Sei C ⊂ K l ein Code mit Mindestabstand ≥ δ, |K| = n.<br />

Die Abbildung C → K l−(δ−1) = K l−δ+1 , c = (c1, ..., cl) ↦→ c ′ := (c1, ..., cl−(δ−1))<br />

(die letzten δ − 1 Stellen streichen) ist injektiv. Denn wenn für c, e ∈ C gilt c ′ = e ′ ,<br />

so folgt α(c, e) ≤ δ − 1 und somit c = e. Also gilt |C| ≤ |K l−δ+1 | = n l−δ+1 .<br />

7.3 Datenkompression und <strong>Codes</strong><br />

Das Problem der Datenkompression mit Trübung ist in gewisser Weise dual zum Co-<br />

dieren: beim Codieren wird durch Übertragen zusätzlicher Ziffern einer Verfälschung<br />

begegnet; bei der Datenkompression mit vorgesehener Trübung will man weniger Zif-<br />

fern übertragen.<br />

Ein Bild werde in Bildpunkte zerlegt.<br />

Jeder Bildpunkt entspricht einem Element x ∈ K l .<br />

Kann man mit deutlich weniger Speicherplatz auskommen, wenn man erlaubt: statt<br />

x wird ein c ∈ K l gespeichert wird mit (zum Beispiel) α(c, x) ≤ 1 ?<br />

In diesem Fall tritt zwar unweigerlich eine leichte Verfälschung ein (da ja eine Stelle<br />

32


nicht stimmt), aber das nimmt man angesichts von geringerem Speicherbedarf viel-<br />

leicht in Kauf.<br />

Zur Realisierung braucht man einen Code C ⊆ K l derart, dass zu jedem x ∈ V ein<br />

c ∈ C mit α(x, c) ≤ 1 existiert. Wir könnten einen Hamming-Code verwenden.<br />

Wie erreichen wir Speicherersparnis?<br />

Nehmen wir an, es liegt ein Hamming-Code C ⊆ K l vor mit Generatormatrix G.<br />

Die Kamera liefert einen Bildpunkt x ∈ K l .<br />

Wir bestimmen das c ∈ C, welches α(c, x) ≤ 1 erfüllt.<br />

Dieses C soll anstelle von x gespeichert werden.<br />

Man kann schreiben c = λ1 · Zeile1 + ... + λk · Zeilek (Zeilen der Generatormatrix).<br />

Wir müssen anstelle von (x1, ..., xl) ∈ K l nur (λ1, ..., λk) ∈ K k speichern.<br />

Beispiel Ham(5, 2), r = 5, n = 2; l = 2 r − 1 = 31; k = l − r = 26.<br />

8. Über BCH-<strong>Codes</strong><br />

Wir stellen spezielle Beispiele von BCH-<strong>Codes</strong> vor (Hocquenghem, Bose, Ray-Chaudhiri,<br />

Reed-Salomon, 1960).<br />

8.1 Hilfsbegriff (Vandermonde-Matrix) Sei K ein Körper und seien a1, ..., ar ∈<br />

K \ {0} paarweise verschieden.<br />

Dann ist die folgende Matrix regulär.<br />

⎛<br />

⎜<br />

⎝<br />

1 1 ... 1<br />

a1 a2 ... ar<br />

... ... ... ...<br />

a r−1<br />

1<br />

a r−1<br />

2 ... a r−1<br />

r<br />

Beweis Angenommen, die Behauptung ist falsch. Dann sind die Zeilen der Matrix<br />

linear abhängig. Es gibt also λ0, ..., λr−1 ∈ K, nicht alle 0, mit<br />

λ0 · Zeile1 + ... + λr−1 · Zeiler = 0 ∈ K r .<br />

Das bedeutet, das Polynom λ0 + λ1x + ... + λr−1x r−1 ∈ K[x] hat r verschiedene<br />

Nullstellen a1,...,ar. Da es nicht das Nullpolynom ist und Grad ≤ r − 1 hat, ein<br />

Widerspruch.<br />

⎞<br />

⎟<br />

⎠<br />

33


8.2 Beispiel Setze K := Z11 und<br />

⎛<br />

1<br />

⎜ 1<br />

H := ⎜ 1<br />

⎝<br />

1<br />

2<br />

2<br />

1<br />

3<br />

...<br />

...<br />

1<br />

10<br />

2 32 ... 102 1 23 33 ... 103 ⎞<br />

⎟<br />

⎠<br />

Dann ist jede aus 4 verschiedenen beliebigen Spalten von H gebildete Matrix von<br />

H eine 4 × 4-Vandermonde-Matrix.<br />

Wegen 8.3 ist also jede 4-Menge verschiedener Spalten von H linear unabhängig. Die<br />

Matrix H vom Rang 4 ist nach 3.4 Kontrollmatrix eines 6-dimensionalen linearen<br />

<strong>Codes</strong> C ⊆ K 10 mit Mindestabstand 5 (2-korrigierend).<br />

Der Code enthält 11 6 Codewörter.<br />

Man hat<br />

C = { (x1, ..., x10) ∈ K 11 |<br />

10∑<br />

i=1<br />

xi = 0,<br />

10∑<br />

ixi = 0,<br />

i=1<br />

10∑<br />

i=1<br />

i 2 xi = 0,<br />

10∑<br />

i=1<br />

i 3 xi = 0}<br />

Wenn man nicht will, dass 10 ∈ Z11 vorkommt, kann man C ′ ⊆ C betrachten:<br />

C ′ = { (x1, ..., x10) ∈ K 11 , xi ̸= 10 |<br />

10∑<br />

i=1<br />

xi = 0,<br />

10∑<br />

ixi = 0,<br />

i=1<br />

10∑<br />

i=1<br />

i 2 xi = 0,<br />

10∑<br />

i=1<br />

34<br />

i 3 xi = 0}<br />

Wie kann man mit C elegant dekodieren, ohne die Anführer gemäss Verfahren 2.7<br />

zu speichern?<br />

8.3 Verallgemeinerung von 8.2: eine Klasse von BCH-<strong>Codes</strong><br />

BCH-<strong>Codes</strong> sind günstig, wenn man große Körper K verwenden will.<br />

Voraussetzungen: δ = 2ϵ + 1 ≤ l ≤ n − 1, K = GFn und n sei eine Primzahl (für<br />

Primzahlpotenzen n würde es etwas komplizierter).<br />

Dann sind 1, 2, ..., l ∈ K paarweise verschieden und ̸= 0 (wenn wir etwa 6 ∈ K<br />

schreiben, ist damit gemeint 1 + 1 + 1 + 1 + 1 + 1 ∈ K; d.h. das Einselement 6-mal<br />

aufaddiert).<br />

Setze<br />

⎛<br />

1<br />

⎜ 1<br />

H := ⎜ ...<br />

⎝<br />

1<br />

2<br />

...<br />

1<br />

3<br />

...<br />

...<br />

...<br />

...<br />

1<br />

l<br />

...<br />

1 2 δ−2 3 δ−2 ... l δ−2<br />

⎞<br />

⎟ ∈ K<br />

⎟<br />

⎠<br />

(δ−1)×l


Dann bilden je δ − 1 Spalten von H eine Vandermonde-Matrix, sind also nach 8.1<br />

linear unabhängig. Insbesondere ist Rang(H) = δ − 1.<br />

Sei C ⊂ K l der Code mit Kontrollmatrix H.<br />

Nach 3.4 ist δ der Minimalabstand von C.<br />

Man hat dimC = l − δ + 1. Mit 7.2 (Singleton-Schranke) folgt<br />

8.3’ Satz Seien δ ≤ l ≤ n − 1 und n eine Primzahl und δ ungerade. Dann ist<br />

An(l, δ) = n l−δ+1 (Definition An(l, δ) siehe 7.1).<br />

8.3” Fortsetzung von 8.3 Dekodieren von BCH-<strong>Codes</strong><br />

Wir wollen das für die beschriebenen BCH-<strong>Codes</strong> übliche Dekodierverfahren verste-<br />

hen. Es kommt ohne die Speicherung der Anführer aus.<br />

Sei x = (x1, ..., xl) ∈ K l . Zu berechnen sei ein x nächstliegendes Codewort c ∈ C.<br />

Wir erinnern uns an 2.2 bis 2.7. Man berechne das Syndrom<br />

⎛<br />

⎜<br />

S := ⎜<br />

⎝<br />

s1<br />

s2<br />

...<br />

sδ−1<br />

⎞<br />

⎟ := Hx<br />

⎟<br />

⎠<br />

t<br />

Sei c ∈ C ein x nächstliegendes Codewort. Setze f := x − c. Wegen Hc t = 0 gilt (+)<br />

Hf t = Hx t = S. D.h. f ist ein Anführer der Nebenklasse x + C.<br />

Wenn umgekehrt f ∈ K l die Eigenschaft (+) hat, erfüllt c := x − f die Identität<br />

Hc t = 0 und damit c ∈ C.<br />

Wir wollen die Anführer der Nebenklassen samt ihrer Syndrome nicht auf Vorrat<br />

berechnen und speichern, sondern aus der Bedingung (+) berechnen.<br />

Das heißt, wir müssen f ∈ K l finden mit möglichst geringem Gewicht, welches das<br />

folgende Gleichungssystem erfüllt.<br />

f1 + f2 + ... + fl = s1<br />

1 · f1 + 2 · f2 + ... + l · fl = s2<br />

1 2 · f1 + 2 2 · f2 + ... + l 2 · fl = s3<br />

... ... ... ... ... ... ... ... ...<br />

1 δ−2 · f1 + 2 δ−2 · f2 + ... + l δ−2 · fl = sδ−1<br />

35


In dieser allgemeinen Form ist das ein mühsames Unterfangen.<br />

Deshalb setzen wir voraus:<br />

(V) Zu x existiert ein Codewort c mit α(c, x) ≤ ϵ für ϵ := 1(δ<br />

− 1).<br />

2<br />

Wegen δ = 2ϵ + 1 ist dann c eindeutig bestimmt (wenn c, e ∈ C die Abstandseigen-<br />

schaft haben, folgt α(c, e) ≤ α(c, x) + α(x, e) ≤ 2ϵ < δ, also c = e). Es ist also c das<br />

zu findende Codewort.<br />

Anwendungsbezogen bedeutet (V): wir setzen voraus, es wird ein Codewort c ∈ C<br />

gesendet und das an höchstens ϵ Stellen verfälschte Wort x empfangen.<br />

Wir nehmen nun an, c ∈ C mit α(c, x) ≤ ϵ sei bereits gefunden.<br />

Dann erfüllt f := x − c jedenfalls das obige Gleichungssystem.<br />

Wir überlegen nun, wie f (und damit c) aussieht.<br />

Wegen α(x, c) = γ(f) ≤ ϵ gibt es höchstens ϵ Stellen X1 := i1, ...., Xϵ := iϵ, in denen<br />

f Einträge ̸= 0 hat.<br />

Wir setzen Fi := fXi (Koordinate von f an der Stelle Xi; Fi = 0 kann vorkommen).<br />

Mit diesen Bezeichnungen lautet das obige Gleichungssystem<br />

F1 + F2 + ... + Fϵ = s1<br />

X1F1 + X2F2 + ... + XϵFϵ = s2<br />

X 2 1F1 + X 2 2F2 + ... + X 2 ϵ Fϵ = s3<br />

... ... ... ... ... ... ... ... ...<br />

X 2ϵ−1<br />

1 F1 + X 2ϵ−1<br />

2 F2 + ... + X 2ϵ−1<br />

ϵ Fϵ = s2ϵ<br />

Nach dem Gesagten müssen aufgrund von (V) durch diese Identitäten die ’Unbe-<br />

kannten’ Fi und Xi eindeutig festgelegt sein. Das Gleichungssystem ist nichtlinear,<br />

es gibt kein Patentrezept zur Lösung.<br />

Ramanujan hat schon 1912 solche Gleichungssysteme betrachtet.<br />

Erinnerung: Ring der formalen Potenzreihen.<br />

Der Polynomring K[Θ] ist K[Θ] = {(ao, a1, ....) ∈ K IN | ai ∈ K, nur endlich viele<br />

ai ̸= 0 }, zusammen mit den uns bekannten Verknüpfungen + und · (die Menge aller<br />

36


Abbildungen von IN0 in K wobei nur endlich viele Bildelemente ̸= 0 sind). Für das<br />

Tupel (0, 1, 0, 0...) schreibt man üblicherweise Θ (die Buchstaben Xi kommen schon<br />

vor, deshalb hier K[Θ] und nicht K[x]). Man hat dann Θ k = (0, ..., 0, 1, 0, ..., 0) ( 1<br />

an k-ter Stelle). Für (a0, ...) schreibt man üblicherweise nur a0.<br />

Wenn man die Endlichkeitsforderung wegläßt, hat man den Ring der formalen Po-<br />

tenzreihen K[[Θ]] = {(ao, a1, ....) ∈ K IN | ai ∈ K } (+ und · analog wie beim<br />

Polynomring). K[[Θ]] ist also die Menge aller Abbildungen von IN0 in K. Der Ring<br />

K[[Θ]] ist ein Integritätsbereich. Wir argumentieren im folgenden in seinem Quoti-<br />

entenkörper K((Θ)).<br />

Wir setzen nun voraus: X1, ..., Xϵ, F1, ..., Fϵ ∈ K erfüllen das Gleichungssystem.<br />

Man setze<br />

(1) Φ :=<br />

F1<br />

1 − X1Θ +<br />

F2<br />

+ ... +<br />

1 − X2Θ<br />

Fϵ<br />

1 − XϵΘ<br />

Man hat in K((Θ)) (analog zur geometrischen Reihe):<br />

also<br />

1<br />

1 − XjΘ = 1 + XjΘ + X 2 j Θ 2 + ...<br />

∈ K(Θ) ⊆ K((Θ))<br />

Φ = (F1 + ... + Fϵ) + (X1F1 + ... + XϵFϵ)Θ + (X 2 1F1 + ... + X 2 ϵ Fϵ)Θ 2 + ...<br />

Da die Xi und Fi das obige Gleichungssystem erfüllen, folgt<br />

(2) Φ = s1 + s2Θ + ... + s2ϵΘ 2ϵ−1 + ⋆ · Θ 2ϵ + ⋆ · Θ 2ϵ+1 + ...<br />

Dabei bezeichnet ⋆ Zahlen aus K, die nicht näher interessieren.<br />

Wir schreiben 1 + b1Θ + ... + bϵΘ ϵ = (1 − X1Θ) · ... · (1 − XϵΘ) (mit bi ∈ K; Produkt<br />

der Nenner in (1)) und haben dann Φ (mit passenden ai ∈ K) in der Form<br />

(3) Φ = a1 + a2Θ + ... + aϵΘ ϵ−1<br />

1 + b1Θ + ... + bϵΘ ϵ<br />

Das Zählerpolynom heißt Fehlerwerte-Polynom (error-evaluating polynomial); das<br />

Nennerpolynom Fehlstellen-Polynom (error-locating polynomial). Denn die Nullstel-<br />

len des Fehlstellen-Polynoms sind laut seiner Definition die Zahlen X −1<br />

i .<br />

37


Aus dem Nennerpolynom erhält man die Werte Fi, wie wir gleich sehen.<br />

Aus (2) und (3) folgt<br />

(s1+s2Θ+...+s2ϵΘ 2ϵ−1 +⋆·Θ 2ϵ +⋆·Θ 2ϵ+1 +...)(1+b1Θ+...+bϵΘ ϵ ) = a1+a2Θ+...+aϵΘ ϵ−1<br />

Wir vergleichen die Koeffizienten der Θ i und erhalten (4)<br />

a1 = s1<br />

a2 = s2 + s1b1<br />

a3 = s3 + s2b1 + s1b2<br />

.....<br />

aϵ = sϵ + sϵ−1b1 + sϵ−2b2 + ... + s1bϵ−1<br />

und (5)<br />

0 = sϵ+1 + sϵb1 + sϵ−1b2 + ... + s1bϵ<br />

0 = sϵ+2 + sϵ+1b1 + sϵb2 + ... + s2bϵ<br />

.....<br />

0 = s2ϵ + s2ϵ−1b1 + s2ϵ−2b2 + ... + sϵbϵ<br />

Nun kann man aus (5) eine Lösung b1, ..., bϵ berechnen (lineares Gleichungssystem;<br />

Lösung nicht notwendig eindeutig).<br />

Aus (4) entnimmt man a1, ..., aϵ.<br />

Aus dem Fehlstellenpolynom erhält man (wie gesagt) die Xi. Da Φ bekannt ist (siehe<br />

(3)) kann man die Fi aus (1) berechnen.<br />

Historische Anmerkung. Der Trick, für Gleichungssysteme der betrachteten Art<br />

Φ ∈ K((Θ)) heranzuziehen, stammt wohl von Ramanujan (1912).<br />

8.4 Beispiel<br />

38


K = GF11; C ⊂ K 10 durch folgende Kontrollmatrix festgelegt.<br />

Man hat δ = 7, ϵ = 3.<br />

⎛<br />

1 .. .. .. 1<br />

⎜ 1 2 3 .. 10<br />

⎜<br />

H := ⎜<br />

⎝ .. .. .. .. ..<br />

1 2 2 3 2 .. 10 2<br />

1 2 5 3 5 .. 10 5<br />

Angenommen, x = (?, ..., ?) ∈ K 10 hat Syndrom (s1, ..., s6) = (2, 8, 4, 5, 3, 2).<br />

Wir schreiben (4) und (5) für diesen Fall hin und erhalten aus (5): b1 =?, b2 =?,<br />

b3 =?. Nun liefert (4): a1 =?, a2 =?, a3 =?.<br />

Also<br />

Φ =<br />

?+?Θ+?Θ 2<br />

?+?Θ+?Θ 2 +?Θ 3<br />

Nun muß man Φ auf Gestalt (1) bringen (Partialbruchzerlegung).<br />

Das Nennerpolynom ist ?+?Θ+?Θ 2 +?Θ 3 = (1−?Θ)(1−?Θ)(1−?Θ). Also<br />

⎞<br />

⎟<br />

⎠<br />

Φ = F1 F2 F3<br />

+ +<br />

1−?Θ 1−?Θ 1−?Θ<br />

Daraus berechnen wir (Multiplizieren mit 1−3Θ und Θ = 3 −1 = 4 einsetzen) F1 =?.<br />

Analog: F2 =?, F3 =?.<br />

Resultat: f = (?, ..., ?), c = x − f.<br />

39


9 Zyklische <strong>Codes</strong><br />

Für praktische Zwecke spielen fast nur lineare <strong>Codes</strong> eine Rolle, weil die algebraische<br />

Struktur brauchbare Dekodierverfahren ermöglicht.<br />

Viele lineare <strong>Codes</strong> sind sogar zu zyklischen <strong>Codes</strong> (Definition in 9.3) äquivalent.<br />

Zum Beispiel sind (wie wir später sehen) die Hamming-<strong>Codes</strong> Ham(r, n) äquivalent<br />

zu zyklischen <strong>Codes</strong>, wenn r teilerfremd zu n − 1 ist (also bei n = 2 immer).<br />

9.1 Vorausetzungen Im folgenden sei K ein Körper, |K| = n, n = p r für eine<br />

Primzahl p und l ∈ IN. Sei C ⊆ K l ein linearer Code (Untervektorraum ̸= 0).<br />

9.2 Umformulierung im Polynomring Setze R := K[x]/(x l −1)K[x] (Faktorring<br />

des Polynomrings K[x] nach dem von x l − 1 erzeugten Ideal).<br />

Sei<br />

der kanonische (Ring-)homomorphismus.<br />

¯ : K[x] → R = K[x]/(x l − 1)K[x]<br />

Die Restriktion des kanonischen Homomorphismus auf die Menge {q ∈ K[x] | q =<br />

0 oder Grad(q) ≤ l − 1 } ist injektiv: jede Klasse ∈ R = K[x]/(x l − 1)K[x] enthält<br />

genau ein Polynom ∈ K[x] vom Grad ≤ l − 1. Es folgt:<br />

Die Abbildung ι : K l → R, (a0, ..., al−1) ↦→ a0 + a1x + ... + al−1x l−1 ist bijektiv.<br />

Insbesondere können wir K (konstante Polynome ∈ K[x]) als Unterring von R an-<br />

sehen (statt a0 ∈ K betrachte a0 ∈ R). Deshalb ist R auch ein K-Vektorraum. Eine<br />

Basis ist 1, x, ..., x l−1 . Die Abbildung ι ist ein Vektorraum-Isomorphismus (lineare<br />

Bijektion).<br />

Aufgrund der oben genannten Abildung können wir statt K l den (zu ihm isomorphen)K-<br />

Vektorraum R verwenden: wir ’identifizieren’ (a0, ..., al−1) mit a0 + a1x + ... + al−1x l−1<br />

(d.h. schreiben die Bijektion ι nicht hin).<br />

C ist dann ein Untervektorraum des K-Vektorraum R.<br />

9.3 Definition C heißt zyklischer Code, wenn für jedes Codewort gilt:<br />

(c0, ..., cl−1) ∈ C ⇒ (cl−1, c0, ..., cl−3, cl−2) ∈ C<br />

d.h. wenn man in einem Codewort alle Einträge um eine Stelle verschiebt (zyklische<br />

40


Verschiebung), erhält man wieder ein Codewort.<br />

Statt um eine Stelle kann man dann auch um 2,3,4,... Stellen verschieben, ohne C<br />

zu verlassen.<br />

Technischer Hintergrund: Schieberegister sind technisch leicht zu realisieren.<br />

9.4 Beobachtung C ⊆ R ist genau dann ein zyklischer Code, wenn C ein Ideal<br />

des Ringes R ist.<br />

Die zyklischen <strong>Codes</strong> in R sind genau die Ideale (̸= 0) von R.<br />

Beweis Die Forderung in 9.1 lautet:<br />

c0 + c1x + ... + cl−1x l−1 ∈ C ⇒ cl−1 + c0x + c1x 2 + ... + cl−2x l−1 ∈ C.<br />

Das bedeutet, man kommt aus C durch Multiplizieren mit x nicht heraus.<br />

Wenn dies zutrifft, folgt qC ⊆ C für jedes q ∈ R, da C bezüglich + und Multiplika-<br />

tion mit Körperelementen abgeschlossen ist. Also ist C ein Ideal des Ringes R.<br />

Umgekehrt: Wenn C ein Ideal ̸= 0 von R ist, so ist C offenbar ein zyklischer Code.<br />

9.5 Beispiel Es ist nicht ohne weiteres möglich, einem linearen Code anzusehen,<br />

ob er zyklisch ist.<br />

Betrachten wir den Hamming-Code über GF2 mit Parameter r = 3, also Wortlänge<br />

l = 2r −1<br />

2−1<br />

= 7 (wir sehen später, dass alle Hamming-<strong>Codes</strong> Ham(r, n) mit r teiler-<br />

fremd n − 1 zyklisch sind).<br />

Als Kontrollmatrix nehmen wir<br />

⎛<br />

1<br />

⎜<br />

H = ⎜ 1<br />

⎝<br />

0<br />

1<br />

1<br />

1<br />

1<br />

0<br />

1<br />

0<br />

0<br />

1<br />

⎞<br />

0<br />

⎟<br />

0 ⎟<br />

⎠<br />

0 1 1 1 0 0 1<br />

Eine Generatormatrix ist<br />

⎛<br />

0<br />

⎜ 1<br />

G = ⎜ 0<br />

⎝<br />

0<br />

0<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

⎞<br />

1<br />

⎟<br />

0 ⎟<br />

1 ⎟<br />

⎠<br />

0 0 1 0 1 1 1<br />

(denn die 4 Zeilen gi sind linear unabhängig und senkrecht auf den Zeilen von H).<br />

Die Menge der vier Zeilen von G ist keineswegs invariant gegen zyklisches Verschie-<br />

41


en.<br />

Die Zeilen ei der Matrix<br />

⎛<br />

⎞<br />

⎜ 0<br />

⎜ 1<br />

⎜ 0<br />

⎜<br />

E = ⎜ 1<br />

⎜ 1<br />

⎜ 0<br />

⎝<br />

0<br />

0<br />

0<br />

1<br />

0<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

0<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

1 ⎟<br />

0 ⎟<br />

1 ⎟<br />

1 ⎟<br />

0 ⎟<br />

0 ⎟<br />

⎠<br />

0<br />

bilden ein Erzeugendensystem von C (e1 = g1; e2 = g2; e3 = g3; e4 = g2 + g4;<br />

e5 = g1 + g2 + g3; e6 = g3 + g4; e7 = g1 + g4). Die Menge der Zeilen ist invariant<br />

gegen zyklisches Verschieben. Deshalb ist der Code zyklisch, denn offenbar gilt:<br />

9.5’ Beobachtung Sei C ⊆ K l ein linearer Code. C ist genau dann zyklisch, wenn<br />

C ein gegen zyklisches Verschieben invariantes Erzeugendensystem hat.<br />

Wir wollen in Fortsetzung von 9.4 alle zyklischen <strong>Codes</strong> C ⊆ K l beschreiben.<br />

Wie sehen die Ideale von R aus ?<br />

Wir erinnern an den allgemeinen Sachverhalt:<br />

9.6 Satz (Idealverbände bei Homomorphismen) Sei A ein beliebiger kommutativer<br />

Ring und<br />

¯: A → R ein surjektiver Ringhomomorphismus.<br />

Wenn J ein Ideal von A ist, so ist J ein Ideal von R.<br />

Wenn L ein Ideal von R ist, so ist das Urbild {a ∈ A | a ∈ L} ein Ideal von A,<br />

welches den Kern umfaßt.<br />

Die Menge der den Kern umfassenden Ideale von A wird durch ¯ bijektiv auf die<br />

Menge aller Ideale von R abgebildet.<br />

Insbesondere existiert zu jedem Ideal L von R genau ein Ideal J von A mit Kern⊆ J<br />

und J = L (nämlich {a ∈ A | a ∈ L}).<br />

Angewendet auf unseren Fall A = K[x] heißt das: die Ideale von R sind genau die<br />

Mengen J, wobei J ein Ideal von K[x] ist mit der Eigenschaft (x l − 1)K[x] ⊆ J.<br />

42


Da K[x] ein Hauptidealring ist, hat J die Form gK[x] für ein Polynom g ∈ K[x].<br />

Durch Multiplizieren mit einem Körperelement ̸= 0 kann man g normieren. Dann<br />

ist g durch J eindeutig bestimmt.<br />

Wegen (x l − 1)K[x] ⊆ J = gK[x] gilt: g teilt x l − 1 (in K[x]).<br />

Resultat zusammen mit 9.4:<br />

9.7 Satz/Definition Die zyklischen <strong>Codes</strong> C ⊆ R sind genau die Ideale ̸= {0} von<br />

R. Jedes solche Ideal kann man schreiben als C = gR von R, wobei g ∈ K[x] ein<br />

normierter Teiler (̸= x l − 1) von x l − 1 ist. Dann ist g eindeutig.<br />

Umgekehrt: Wenn g ∈ K[x] mit den genannten Eigenschaften vorliegt, ist das Ideal<br />

C = gR von R ein zyklischer Code.<br />

Man nennt g das Generatorpolynom des zyklischen <strong>Codes</strong>.<br />

9.8 Hilfssatz Sei g ∈ K[x] ein Teiler von x l − 1 (l ∈ IN), m := Grad(g), und<br />

¯: K[x] → R := K[x]/(x l − 1)K[x] der kanonische Homomorphismus.<br />

Behauptung: Jedes Element des Hauptideals gR kann man schreiben als gc mit<br />

c ∈ K[x] und Grad(c) ≤ l − m − 1.<br />

Beweis Sei d ∈ K[x] mit d ∈ gR, d ̸= 0. Man kann Grad(d) ≤ l − 1 annehmen.<br />

Es ist d = gc für ein c ∈ K[x]. Also: x l − 1 teilt d − gc in K[x]. Da g Teiler von<br />

x l − 1 ist, folgt: g teilt d − gc in K[x], und damit auch g teilt d.<br />

Also darf man d = gc annehmen und es folgt Grad(c) ≤ l − m − 1.<br />

9.9 Korollar g, g · x,..., g · x l−m−1 ist eine Basis des K-Vektorraums gR.<br />

Beweis Nach dem Hilfssatz hat jedes Element von gR die Form<br />

g · (c0 + c1x + ... + cl−m−1x l−m−1 ) = c0g + c1g · x + ... + cl−m−1g · x l−m−1<br />

(wobei ci ∈ K und ci ∈ K nicht unterschieden ist). Also ist { g, g · x, ..., g · x l−m−1 }<br />

ein Erzeugendensystem des K-Vektorraums gR. Da die Polynome g, g · c, ..., g ·<br />

x l−n−1 ∈ K[x] verschiedene Grade haben, sind sie linear unabhängig (im K-Vektorraum<br />

K[x]). Da die Grade ≤ l−1 sind und ¯ auf der Menge der Polynome vom Grad≤ l−1<br />

injektiv ist, sind auch g, g · x,..., g · x l−m−1 linear unabhängig.<br />

9.10 Resultat, Definition Sei C ein zyklischer Code ⊂ K l .<br />

43


Dann gibt es ein eindeutig bestimmtes normiertes Polynom g = g0 + g1x + ... +<br />

gm−1x m−1 + gmx m ∈ K[x] (mit gm = 1, m < l), welches x l − 1 in K[x] teilt derart,<br />

dass<br />

⎛<br />

g0<br />

⎜ 0<br />

G = ⎜ ...<br />

⎝<br />

g1<br />

g0<br />

...<br />

...<br />

g1<br />

...<br />

gm<br />

...<br />

...<br />

0<br />

gm<br />

...<br />

...<br />

0<br />

...<br />

0<br />

...<br />

...<br />

⎞<br />

⎟ ∈ K<br />

⎟<br />

⎠<br />

0 ... 0 g0 g1 ... gm<br />

(l−m)×l<br />

eine Generatormatrix von C ist.<br />

Man nennt g das Generatorpolynom des zyklischen <strong>Codes</strong> und<br />

h := xl − 1<br />

g<br />

das Kontrollpolynom des zyklischen <strong>Codes</strong> C.<br />

Ist umgekehrt g ∈ K[x] ein normierter Teiler ̸= x l − 1 von x l − 1, so wird durch die<br />

angegebene Generatormatrix ein zyklischer Code definiert.<br />

Bedeutung des Kontrollpolynoms:<br />

9.11 Beobachtung Sei C ⊆ K l ein zyklischer Code mit Generatorpolynom g und<br />

Kontrollpolynom h. Sei v = (v0, ..., vl−1) und v = v0 + v1x + ... + vl−1x l−1 auch das<br />

entsprechende Polynom in K[x]. Dann gilt:<br />

v ∈ C ⇔ v · h = 0<br />

Beweis ⇒: Man hat v = g · c für ein c ∈ K[x].<br />

v · h = g · c · h = g · c · xl − 1<br />

g = c · (xl − 1) = 0<br />

⇐: Es gelte v · h = 0. Das bedeutet, v · h ∈ (x l − 1)K[x], also v ∈ gK[x] und damit<br />

v ∈ C.<br />

9.12 Beispiel K = GF2, l = 3, x l − 1 = x 3 − 1 = (x − 1)(x 2 + x + 1). Set-<br />

ze g := x − 1 und wieder R := K[x]/(x 3 − 1)K[x] = {a0 + a1x + a2x 2 | ai ∈<br />

K }. Dann gilt C := gR = { (x − 1)(a0 + a1x + a2x 2 ) | ai ∈ K }, das ist<br />

44


C = {(0, 0, 0), (1, 1, 0), (1, 0, 1), (0, 1, 1) } ⊆ K 3 .<br />

9.13 Beispiel Sei K := GF2, l = 10. Wir wollen alle zyklischen <strong>Codes</strong> C ⊆ K 10<br />

finden.<br />

Dazu sind alle möglichen Generatorpolynome, zu bestimmen, d.h. alle Teiler von<br />

x 10 − 1 in K[x].<br />

Diese kann man der Primfaktorzerlegung vom x 10 − 1 entnehmen (K[x] ist Haupt-<br />

idealring; also sind die Primelemente genau die irreduziblen Elemente, und jedes<br />

Element hat eine bis auf Assoziierte eindeutige Zerlegung in Primelemente).<br />

Es ist keineswegs einfach, die Primfaktoren zu finden.<br />

Zunächst gilt (wegen charK = 2) x 10 − 1 = (x 5 − 1) 2 .<br />

Offenbar ist p0 := x − 1 ein Primfaktor von x 5 − 1, und man hat x 5 − 1 = p0p1 für<br />

p1 := x 4 + x 3 + x 2 + x + 1. Es ist p1 Primelement (warum?). Die normierten Teiler<br />

von x 10 − 1 in K[x] sind also p s 0p t 1 mit s, t ∈ {0, 1, 2}; insgesamt 9 Teiler, wobei 1<br />

und x 10 − 1 mitgerechnet sind. Der Verband {p s 0p t 1 | s, t ∈ {0, 1, 2} } der Teiler von<br />

x 10 − 1 ist antiisomorph zum Verband der Ideale von R := K[x]/(x 10 − 1)K[x]; und<br />

dieser Verband ist nach dem oben Gesagten isomorph zum Verband der Ideale von<br />

K[x], welche (x 10 − 1)K[x] enthalten.<br />

p s p r ist das Generatorpolynom des entsprechenden <strong>Codes</strong> (=Hauptideals von R),<br />

wobei das Nullideal (r = 2 = s) von R nicht als Code angesehen wird (wir verlangen<br />

von einem Code |C| ≥ 2).<br />

Der aus allen Wörtern bestehende Code R hat Generatorpolynom 1 = p 0 0p 0 1.<br />

9.14 Satz, Konstruktion Sei K ein Körper, n = |K|, r ∈ IN teilerfremd zu n − 1.<br />

Setze<br />

l := nr − 1<br />

n − 1<br />

Sei g ∈ K[x] das irreduzible Polynom einer primitiven l-ten Einheitswurzel.<br />

Setze R := K[x]/(x l − 1)K[x].<br />

Der Hamming-Code Ham(r, n) (siehe 3.7) ist äquivalent zum zyklischen Code gR ⊆<br />

R.<br />

Beweis und Konstruktion<br />

(i) Es ist l teilerfremd n − 1.<br />

45


Denn man hat (in Z ) (n r−2 + 2n r−3 +3n r−4 + ... +(r − 2)n 1 + (r − 1)n 0 )(n − 1) +r =<br />

n r−1 + n r−2 + ... + n + 1 = l. Wegen r teilerfremd n − 1 folgt l teilerfremd n − 1.<br />

Wir haben n r − 1 = l · (n − 1). Sei L ein Zerfällungskörper von x l(n−1) − 1 über dem<br />

Körper K. Dann hat L genau n r Elemente, und die Nullstellen von x l(n−1) − 1 (in<br />

L) sind genau die n r − 1 Elemente von L \ {0}.<br />

Die Gruppe L \ {0}, · ist zyklisch (wie jede endliche Untergruppe eines Körpers).<br />

Wegen l(n − 1) = n r − 1 existiert ein α ∈ L \ {0}, · der Ordnung l.<br />

Dann sind die Elemente 1, α, α 2 ,...,α l−1 die paarweise verschiedenen Wurzeln von<br />

x l −1, d.h. die l-ten Einheitswurzeln (in L). Das Element α nennt man eine primitive<br />

l-te Einheitswurzel, denn α erzeugt die Gruppe der l-ten Einheitswurzeln.<br />

L ist Erweiterungskörper von K und auch ein K-Vektorraum der Dimension r.<br />

(ii) Für alle 0 ≤ i < j ≤ l − 1 sind α i , α j linear unabhängig (im K-Vektorraum L).<br />

Denn angenommen, α i = λα j für ein λ ∈ K und 0 ≤ i ≤ j ≤ l − 1. Dann folgt<br />

α t ∈ K für t := j −i; also α t(n−1) = 1. Deshalb ist die Ordnung l von α (in L\{0}, ·)<br />

Teiler von t(n − 1). Da l teilerfremd n − 1 (siehe (i)) ist l Teiler von t. Das ist wegen<br />

l > |t| nur für t = 0 möglich.<br />

Nun wähle man eine Basis des K-Vektorraums L und seien h0, ..., hl−1 die Koordi-<br />

natenvektoren ∈ K r der Vektoren α 0 , α 1 , ...., α l−1 (die hi als Spalten geschrieben).<br />

Wegen (ii) sind dann die 1-dimensionalen Untervektorräume < h0 >, ..., < hl−1 > ge-<br />

nau die l = nr −1<br />

n−1 Untervektorräume von Kr . Die aus den Spalten h0, ..., hl−1 gebildete<br />

Matrix H ist deshalb eine Kontrollmatrix eines Hamming-<strong>Codes</strong> C = Ham(r, n)<br />

(siehe 3.7, 3.4).<br />

Sei g ∈ K[x] das irreduzible Polynom von α, d.h. das normierte Polynom kleinsten<br />

Grades ∈ K[x] mit g(α) = 0. Das Polynom g ist Teiler von x l − 1 in K[x] (denn α<br />

ist Nullstelle von x l − 1).<br />

Sei ¯ : K[x] → R := K[x]/(x l − 1)K[x] der kanonische Homomorphismus und<br />

˜C := gR. Dann ist ˜ C ⊆ R ein zyklischer Code (siehe 9.7).<br />

46


Sei ι : K l → R, (v0, ..., vl−1) ↦→ v0 + v1x + ... + vl−1x l−1 (’Identifikationsabbildung’).<br />

Für jedes v = (v0, ..., vl−1) ∈ K l gilt:<br />

v ∈ C ⇔ Hv t = 0 ⇔ h0v0+h1v1+...+hl−1vl−1 = 0 ⇔ α 0 v0+α 1 v1+...+α l−1 vl−1 =<br />

0 ⇔<br />

α ist Nullstelle von q := v0 + v1x + ...vl−1x l−1 ⇔<br />

g teilt q ⇔ q ∈ gK[x] ⇔ q = vι ∈ gR = ˜ C (letztes ⇐: Aus q ∈ gR folgt<br />

q − gs ∈ (x l − 1)K[x] ⊆ gK[x] für passendes s ∈ K[x]. Also q ∈ gK[x] ).<br />

Also ist ι ein K-Vektorraum-Isomorphismus mit Cι = ˜ C.<br />

Warum sind zyklische <strong>Codes</strong> in Anwendungen beliebt? Antworten liefern folgende<br />

Betrachtungen.<br />

9.15 Lemma (Codierungsmethode für zyklische <strong>Codes</strong>) Sei C ⊆ K l der zyklischer<br />

Code zum Generatorpolynom g. Dann ist k := l − m = dimC, wobei m den Grad<br />

von g bezeichnet.<br />

Seien w0, ..., wk−1 ∈ K beliebig gegeben.<br />

Behauptung: Es gibt eindeutig bestimmte Zahlen s0, ..., sm−1 ∈ K mit der Eigen-<br />

schaft c := (w0, ..., wk−1, −s0, ..., −sm−1) ∈ C.<br />

Diese Zahlen kann man wie folgt berechnen: Berechne s = s0+...+sm−1x m−1 ∈ K[x]<br />

durch<br />

(*) x m · w = q · g + s<br />

wobei w := w0 + ... + wk−1x k−1 ∈ K[x] gesetzt ist und q, s ∈ K[x] derart, dass s = 0<br />

oder Grads < Gradg = m gilt (Teilen mit Rest).<br />

Beweis Sei s gemäß (*) berechnet und d := (−s0, ..., −sm−1, w0, ..., wk−1) ∈ K l .<br />

Für das entsprechende Polynom gilt dann ˆ d = −s + x m · w = q · g ∈ gK[x]. Es<br />

folgt d ∈ C. Da c (im Lemma) aus d durch zyklische Verschiebungen entsteht und<br />

C zyklischer Code ist, folgt c ∈ C.<br />

Zur Eindeutigkeit der si.<br />

Angenommen, (w0, ..., wk−1, −s0, ..., −sm−1) ∈ C und (w0, ..., wk−1, −t0, ..., −tm−1) ∈<br />

C. Dann folgt (v0, ..., vm−1, 0, ..., 0) ∈ C für vi := si − ti. Also v0 + v1x + ... + vm−1 ∈<br />

gK[x]. Wegen Gradg = m folgt vi = 0 für i = 0, ..., m − 1.<br />

47


Interpretation Man kann also die ersten k Stellen eines zu bildenden Codeworts<br />

beliebig als ’Informationsstellen’ nutzen (beliebige Körperelemente eintragen), und<br />

während diese bereits gesendet werden die fehlenden m ’Kontrollstellen’ berechnen<br />

und nachliefern.<br />

9.16 Definition Sei K ein Körper und b ∈ IN. Nenne einen Vektor der Form<br />

v = (0, ..., 0, vj+1, ..., vj+b, 0, ..., 0) ∈ K l<br />

mit vj+1 ̸= 0 ̸= vj+b und j ∈ {0, ..., l − b} ein Bündel (’burst’) der Länge b.<br />

Motivation Das Codewort c = (c1, ..., cl) ∈ C (linearer Code) wird gesendet. Wenn<br />

an den Stellen j+1 und j+b und möglicherweise an j+2, ..., j+b−1 eine Verfälschung<br />

auftritt (aber nicht an den anderen Stellen), empfängt man w = c + v, wobei v ein<br />

Bündel der Länge b ist.<br />

’Fehlerbündel’, d.h. Störungen in mehreren aufeinanderfolgenden Stellen, treten in<br />

der Praxis häufig auf (Kratzer in CD’s, Unterbrechungen der Telephonleitung).<br />

Wann kann der Empfänger bei einem linearen Code C ⊆ K l erkennen, dass c ∈ C<br />

durch ein Bündel v der Länge b verfälscht wurde? Dies ist genau dann der Fall, wenn<br />

w = c + v ̸∈ C ist, d.h. wenn v ̸∈ C ist. Deshalb definieren wir:<br />

9.16’ Definition Man sagt, der lineare Code C ⊆ K l erkennt (Fehler-)Bündel der<br />

Länge ≤ b ∈ IN [der Länge b ∈ IN], wenn C kein Bündel der Länge ≤ b [der Länge b]<br />

enthält.<br />

Im Fall b = 1 bedeutet dies, dass der lineare Code 1-fehlererkennend ist (was bei<br />

Minimalabstand δ ≥ 2 zutrifft).<br />

9.17 Beobachtung Wenn der lineare Code C ⊆ K l Bündel der Länge ≤ b ∈ IN<br />

erkennt, gilt dimC ≤ l − b.<br />

Umformulierung: Sei C ⊆ K l linearer Code mit dimC = k. Dann erkennt C nicht<br />

mehr alle Fehlerbündel der Länge ≤ l − k + 1.<br />

Beweis. U := {λ1, ..., λb, 0, ..., 0) ∈ K l ist ein Untervektorraum von K l mit dimU = b,<br />

und jeder Vektor u ∈ U \ {0} ist ein Fehlerbündel der Länge ≤ b. Deshalb gilt<br />

48


C ∩ U = {0}, also dimC ≤ l − b.<br />

Zyklische <strong>Codes</strong> erkennen Bündel besonders gut; sie sind mit Blick auf 9.17 optimal:<br />

9.18 Satz Sei C ⊆ K l , C ̸= K l , ein zyklischer Code, k := dimC. Dann erkennt C<br />

Bündel der Länge ≤ l − k (d.h. C enthält kein Bündel der Länge ≤ l − k). Insbe-<br />

sondere ist jeder zyklische Code ̸= K l 1-fehlererkennend.<br />

Beweis Wir rechnen im Ring R = K[x]/(x l − 1)K[x] und bezeichnen wieder mit<br />

¯ den kanonischen Homomorphismus.<br />

Sei g ∈ K[x] das Generatorpolynom von C. Angenommen, v ∈ gR entspricht einem<br />

Bündel der Länge 1 ≤ b ≤ l − k.<br />

Dann ist v = 0 + ... + 0x j−1 + vjx j + ... + vj+b−1x j+b−1 für passendes j ∈ {0, ..., l − 1}.<br />

Es gilt v − gs ∈ (x l − 1)K[x] ⊆ gK[x] für ein s ∈ K[x]. Also gilt g|v in K[x] und<br />

wir dürfen annehmen v = gs.<br />

Nun hat man (+) gs = v = x j · w für w := vj + vj+1x + ... + vj+b−1x b−1 . Wegen<br />

g|x l − 1 gilt x ̸ |g. Wegen Existenz und Eindeutigkeit der Primfaktorzerlegung in<br />

K[x] folgt aus (+) g|w, insbesondere l − k = Gradg ≤ Gradw ≤ b − 1 ≤ l − k − 1.<br />

Ein Widerspruch zur Annahme.<br />

Wir betrachten einen k-dimensionalen zyklischen Code C ⊆ K l , 1 ≤ k := dimC ≤<br />

l − 1. Die Anzahl der Bündel der Länge ≤ l − k in C ist gleich 0 (voriger Satz). Was<br />

kann man über die Anzahl der Bündel mit Länge b ≥ l − k + 1 sagen? Wieviele von<br />

ihnen liegen in C? (und können damit, wenn sie als Fehlervektor auftauchen, nicht<br />

erkannt werden).<br />

9.19 Satz Voraussetzung wie oben. Sei b ∈ IN≥2.<br />

Sei αb := Anzahl aller Bündel in ∈ K l der Länge b. Sei βb := Anzahl der Bündel in<br />

C der Länge b<br />

Falls b = n − k + 1 gilt βb/αb = (n − 1) −1 · n −(l−k−1) .<br />

Falls b > l − k + 1 gilt βb/αb = n −(l−k)) .<br />

Beweis Wir rechnen in K[x]. Sei j ∈ IN0, 0 ≤ j ≤ l − b. Die Bündel der Länge<br />

b mit v0 = ... = vj−1 = 0 und vj ̸= 0 sind genau die Elemente v mit v =<br />

49


vjx j + ... + vj+b−1x j+b−1 vom Grad ≤ l − 1, wobei vj ̸= 0 ̸= vj+b−1 ist. Dies sind<br />

genau die Polynome von der Form x j · w, wobei Gradw = b − 1 ist und w0 ̸= 0.<br />

Ergebnis: Die Anzahl der Bündel der Länge b mit v0 = ... = vj−1 = 0 und vj ̸= 0 ist<br />

gleich (n − 1) 2 n b−2 .<br />

Ein Bündel wie oben beschrieben ist genau dann Element von C, wenn g ein Teiler<br />

von v ist. Dies trifft (wegen g teilerfremd x) genau dann zu, wenn g Teiler von w<br />

ist, man also w = g · q für ein q ∈ K[x] schreiben kann.<br />

Falls b = l − k + 1 = Gradg + 1 ist, gibt es genau n − 1 Möglichkeiten (wegen<br />

Gradw = b − 1).<br />

Falls b > l − k + 1, hat man (n − 1) 2 · n b−1−(l−k)−1 Möglichkeiten.<br />

Technisch gesehen ist βb/αb das Verhältnis der Anzahlen der nicht zu erkennenden<br />

Bündel der Länge b zur Anzahl aller Bündel der Länge b. Dies Verhältnis ist n −(l−k)<br />

(falls b > n − k + 1) und hängt weder von b noch dem benutzten zyklischen Code<br />

ab!<br />

9.20 Beispiel Wir betrachten einen Hamming-Code Ham(r, n) mit n = 2 (binär)<br />

und r = 10. Da n − 1 teilerfremd r ist, ist dieser Code zu einem zyklischen Code<br />

äquivalent und man hat l = n r −1 = 2 10 −1 = 1023 sowie k = dimC = l −r = 1013.<br />

In einem zyklischen Code mit diesen Daten werden Bündel der Länge ≤ r = 10<br />

erkannt (d.h. solche Bündel kommen in C nicht vor).<br />

9.21 Anwendung: CRC-<strong>Codes</strong> (cyclic redundancy check code) Bei Computer-<br />

netzwerken sind nur fehlererkennende Verfahren üblich: wenn das empfangene Wort<br />

kein Codewort ist, wird die Übertragung wiederholt. Man verwendet K = GF2 und<br />

die Hauptideale (=<strong>Codes</strong>) gR ⊆ R (mit R = K[x]/(x l − 1)K[x]) zu den Polynomen<br />

g = x 12 + x 11 + x 3 + x 2 + x + 1 = (x + 1)(x 11 + x 2 + 1); (Bezeichnung: CRC-12);<br />

g = x 16 + x 15 + x 2 + 1 = (x + 1)(x 15 + x + 1) (Bezeichnung: CRC-16);<br />

g = x 16 + x 12 + x 5 + 1 = (x + 1)(x 15 + x 14 + x 13 + x 12 + x 4 + x 3 + x 2 + x + 1)<br />

(Bezeichnung: CRC-CCITT).<br />

CRC-5-USB: x 5 + x 2 + 1 verwendet man bei USB-Übertragung.<br />

Technisch ist das Verfahren leicht zu realisieren; man braucht nur Polynomdivision<br />

mit Rest.<br />

50


10. Reed-Solomon-<strong>Codes</strong><br />

Wir haben zwar alle zyklischen <strong>Codes</strong> algebraisch beschrieben. Wenn man aber<br />

zyklische <strong>Codes</strong> mit vorgeschriebenem Mindestabstand braucht, kommt es auf das<br />

verwendete Generatorpolynom an. Wir besprechen nun in der Praxis verwendete<br />

zyklische <strong>Codes</strong>.<br />

Sei K ein endlicher Körper, n = |K|.<br />

10.1 Konstruktion Seien δ, l ∈ IN mit 2 ≤ δ ≤ l.<br />

Seien a1, ..., al ∈ K\{0} paarweise verschieden (daraus folgt l ≤ n−1) und v1, ..., vl ∈<br />

K \ {0}.<br />

Setze<br />

⎛<br />

v1 ⎜ . . . . . vl<br />

⎜ a1v1 . . . . . alvl<br />

⎜ a<br />

H = ⎜<br />

⎝<br />

2 1v1 . . . . . a2 l vl<br />

. . . . . . .<br />

. . . . . . .<br />

a δ−2<br />

1 v1 . . . . . a δ−2<br />

⎟<br />

⎠<br />

l vl<br />

⎞<br />

δ−1 × l<br />

∈ K<br />

Da H nur δ −1 Zeilen hat, gilt Rang(H) ≤ δ −1. Insbesondere sind je δ verschiedene<br />

Spalten linear abhängig. Wie in 8.3 folgt: jede δ − 1 × δ − 1 Untermatrix von H<br />

ist regulär; also je δ − 1 verschiedene Spalten linear unabhängig. Also hat der Code<br />

GRS := {c ∈ K l | Hc t = 0} ⊆ K l<br />

Mindestabstand δ. GRS steht für Generalized Reed-Solomon-Code. Die Dimension<br />

des <strong>Codes</strong> ist l − δ + 1.<br />

Spezialfall α sei ein Element der Ordnung n − 1 in K \ {0}, ·, d.h. ein erzeugendes<br />

Element der zyklischen Gruppe K \ {0}, ·. Setze l := n − 1 und wähle δ ∈ IN mit<br />

δ ≤ l.<br />

Dann ist l teilerfremd zu charK.<br />

Man setze a1 = v1 = 1, a2 = v2 = α, a3 = v3 = α 2 , ... , al = vl = α l−1 . Dann nennt<br />

51


man GRS einen Reed-Solomon-Code RS. Wir haben dann<br />

⎛<br />

⎜ 1 α . . . . α<br />

⎜<br />

H = ⎜<br />

⎝<br />

l−1<br />

1 α2 . . . . α2(l−1) 1 α3 . . . . α3(l−1) . . . . . . .<br />

. . . . . . .<br />

1 α δ−1 . . . . α (δ−1)(l−1)<br />

Wir identifizieren (wie in 9. erklärt) K l mit R := K[x]/(x l −1)K[x] via (w0, ..., wl−1) ↦→<br />

w0 + w1x + ... + wl−1x l−1 .<br />

Es ist C ′ := {c ∈ K[x] | c(α) = .... = c(α δ−1 ) = 0} ein Ideal des Ringes K[x].<br />

Da α, ..., α n−1 = 1 verschieden sind und Nullstellen von x n−1 − 1, gilt x l − 1 =<br />

(x − α)(x − α 2 )...(x − 1). Es folgt C ′ = gK[x] für g = (x − α)...(x − α δ−1 ). Insbeson-<br />

dere ist g ein Teiler von x l − 1 und (wegen δ − 1 < l) von x l − 1 verschieden. Also<br />

ist C ′ ein zyklischer Code ⊆ K l mit Generatorpolynom g.<br />

Offenbar gilt RS= C ′ . Insbesondere folgt: RS ist ein zyklischer Code. Er hat, wie<br />

oben schon gesagt, die Minimaldistanz δ.<br />

Man hat k := dimRS = l − δ + 1 und l − k =Grad des Generatorpolynoms = δ − 1.<br />

Gemäß 9.17 kann man Bündel der Länge ≤ δ − 1 erkennen. Das gilt aber allgemein<br />

für lineare <strong>Codes</strong> mit Mindestabstand δ; hier nützt das zyklisch-Sein nichts. Aller-<br />

dings bei der einfachen Handhabung (siehe 9.15).<br />

11. Plotkin-Konstruktion; die binären Reed-Muller-<strong>Codes</strong><br />

11.1 Lemma (Plotkin-Konstruktion) Sei K ein Körper und seien Ci ⊆ K l lineare<br />

<strong>Codes</strong> der Dimensionen ki und mit Mindestabständen δi (i = 1, 2).<br />

Setze C := C1&C2 := {(c1, c1 + c2) | ci ∈ Ci} ⊆ K 2l .<br />

Dann ist C ein linearer Code ⊆ K 2l . Im Fall K = GF2 ist der Mindestabstand<br />

min{2δ1, δ2}.<br />

Beweis. Wir bilden C1 ⊕ C2 = {(c1, c2) | ci ∈ Ci} ⊆ K 2l . Dies ist ein Untervektor-<br />

raum der Dimension k1 + k2. Die Abbildung C1 ⊕ C2 → C, (c1, c2) ↦→ (c1, c1 + c2)<br />

ist linear, surjektiv und ihr Kern ist 0. Deshalb ist C ein Untervektorraum und hat<br />

die Dimension k1 + k2.<br />

⎞<br />

⎟<br />

⎠<br />

52


Für das Gewicht von c = (c1, c1 + c2) ∈ C \ {0} gilt<br />

γ(c) = γ(c1) + γ(c1 + c2) ≥<br />

γ(c1) + γ(c1) + γ(c2) − 2|{i ∈ {1, ..., l} | c1i = 1 = c2i}| ≥<br />

γ(c2).<br />

Falls c2 ̸= 0, ist γ(c2) ≥ δ2. Falls c2 = 0, folgt c = (c1, c1) und dann γ(c) ≥ 2δ1.<br />

11.2 Konstruktion der binären Reed-Muller-<strong>Codes</strong><br />

Sei K := GF 2.<br />

Zu m, r ∈ IN0 mit 0 ≤ r ≤ m definiere den Reed-Muller Code r-ter Ordnung (zu<br />

gegebenem m) RM(m, r) ⊆ K 2m<br />

Anfangswerte:<br />

rekursiv wie folgt.<br />

RM(m, 0) := {(λ, ..., λ) | λ ∈ K} = {(0, ..., 0), (1, ..., 1)} ⊂ K l ,<br />

RM(m, m) := K2m. Schritt: Sei 0 < r < m (und die RM(m−1, r) für alle 0 ≤ r ≤ m−1 seien bekannt):<br />

RM(m, r) := RM(m − 1, r)&RM(m − 1, r − 1).<br />

Die Rekursionsformel ist analog der Binomialkoeffizientenformel:<br />

( ) ( ) ( )<br />

m m − 1 m − 1<br />

= +<br />

r r r − 1<br />

welche bedeutet: eine r-elementige Teilmenge einer m-elementigen Menge {1, ..., m}<br />

erhalte ich, indem ich (a) aus {1, ..., m − 1} eine r-elementige Menge wähle; oder (b)<br />

aus {1, ..., m − 1} eine r − 1 elementige Menge wähle und das Element m hinzufüge.<br />

11.3 Satz über Dimension und Mindestabstand der binären Reed-Muller-<strong>Codes</strong>.<br />

Es gilt RM(m, r) ⊆ K2m (d.h. Länge 2m ) und dim RM(m, r) = ∑ ( )<br />

r m<br />

i=0 (dafür ist<br />

i<br />

keine einfachere Formel bekannt) und Mindestabstand δ = 2m−r .<br />

Beweis. Die erste Aussage folgt, weil für alle m ∈ IN0 gilt: RM(m − 1, r) hat Länge<br />

2 m−1 , und bei der Plotkin-Konstruktion verdoppelt sich die Länge.<br />

Per Induktion folgt für die Minimaldistanz nach 11.1 und der Rekursionsvorschrift:<br />

δ(RM(m, r)) = min{2 · 2 m−1−r , 2 m−1−(r−1) } = 2 m−r .<br />

Für die Dimension erhalten wir per Induktion:<br />

53


( )<br />

m−1<br />

dim RM(m, r) = ∑r i=0 i<br />

1 + ∑r−1 i=0 [ ( )<br />

m−1<br />

+ i+1<br />

( )<br />

m−1<br />

] = i<br />

1 + ∑ ( )<br />

r−1 m<br />

i=0 = i+1<br />

∑ )<br />

ri=0<br />

.<br />

( m<br />

i<br />

+ ∑ r−1<br />

i=0<br />

( )<br />

m−1<br />

= i<br />

Dabei haben wir die oben erwähnte Formel für die Binomialkoeffizienten benutzt.<br />

11.4 Mariner-Code ist der Reed-Muller-Code RM(5, 1). Er wurde bis 1977 zur<br />

Bildübermittlung von Satelliten benutzt und hat Dimension 6, also 2 6 = 64 Co-<br />

dewörter (jedem Codewort entspricht ein Helligkeitswert eines Bildpunkts) und kann<br />

7 Fehler korrigieren. Die Länge ist 2 5 = 32. Er hat nur mäßige Korrektureigenschaf-<br />

ten aber ist technisch einfach zu handhaben.<br />

11.5 Generatormatrizen der RM-<strong>Codes</strong><br />

Zunächst definieren wir für die ’trivialen’ RM-<strong>Codes</strong> RM(m, m) = K 2m<br />

Generatormatrizen G(m).<br />

Die einzige Generatormatrix von RM(0, 0) ist die 1 × 1-Matrix G(0) = (1).<br />

Wir setzen<br />

⎛<br />

⎞<br />

G(m − 1) G(m − 1)<br />

G(m) := ⎝ ⎠ ∈ K<br />

0 G(m − 1)<br />

2m ×2m 54<br />

spezielle<br />

Gemäß einer Übungsaufgabe ist dies eine Generatormatrix von RM(m, m) = K 2m<br />

(vorausgesetzt, G(m − 1) ist eine Generatormatrix von RM(m − 1, m − 1)).<br />

Induktiv folgt sofort, dass jedes G(m) eine obere Dreiecksmatrix mit Einsen in der<br />

Diagonalen ist.<br />

11.5’ Die ’Kennmenge’ eines Zeilenindex i<br />

Sei m fest; z0, ..., z2 m −1 seien die Zeilen von G(m).<br />

Sei i ∈ {0, ..., 2 m − 1} ein Zeilenindex.<br />

Schreibe i = ∑ m−1<br />

j=0 ϵj2 j (mit ϵj ∈ {0, 1}) als Dualzahl.<br />

Nenne Ai := {j ∈ {0, ..., m − 1} | ej = 1} die Kennmenge von i und auch der i-ten<br />

Zeile.<br />

Man schreibt also i als Dualzahl; die Positionen, wo die Dualzahl einen 1-Eintrag<br />

hat, bilden die Kennmenge.<br />

Beispiel: Zeilennummmer i = 13. Dualdarstellung: 13 = 2 3 + 2 2 + 2 0 . Kennmenge


Ai = {0, 2, 3}.<br />

Beispiel Wir berechnen G(3), also die (kanonische) Generatormatrix von RM(3, 3).<br />

⎛<br />

G(2)<br />

G(3) = ⎝<br />

0<br />

⎞<br />

G(2)<br />

⎠ ∈ K<br />

G(2)<br />

23 ×23 , also<br />

⎛<br />

⎞<br />

1<br />

⎜ 0<br />

⎜ 0<br />

⎜ 0<br />

G(3) = ⎜ 0<br />

⎜ 0<br />

⎜ 0<br />

⎝<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

0<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<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 />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

0<br />

1<br />

1<br />

⎟<br />

1 ⎟<br />

1 ⎟<br />

1 ⎟ ∈ K<br />

1 ⎟<br />

1 ⎟<br />

1 ⎟<br />

⎠<br />

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

23 ×23 Zeilennummer i dual Ai |Ai<br />

0 0 ∅ 0<br />

1 001 {0} 1<br />

2 010 {1} 1<br />

3 011 {1, 0} 2<br />

4 100 {2} 1<br />

5 101 {2, 0} 2<br />

6 110 {2, 1} 2<br />

7 111 {2, 1, 0} 3<br />

11.5” Beschreibung der Matrix G(m + 1) rekursiv aus den Zeilen der Matrix<br />

G(m)<br />

Zu finden ist die i-te Zeile zi von G(m + 1).<br />

Wenn die Kennmenge Ai die Zahl m nicht enthält, besteht zi aus der zweimal hin-<br />

tereinander geschriebenen Zeile aus G(m) zu gleichem i.<br />

Wenn Ai die Zahl m enthält, besteht zi aus Aneinanderfügen von (0, ..., 0} ∈ K 2m<br />

und der Zeile aus G(m) mit Kennmenge Ai \ {m}.<br />

11.5 ”’ Rekursionsfreie Beschreibung der Zeilen von G(m)<br />

Sei i ∈ {0, ..., 2 m − 1}. Die Zeile zi = (λ0, ..., λ2 m −1} von G(m) erhält man (aufgrund<br />

55


des vorigen Ergebnis) wie folgt.<br />

Bilde die Kennmenge A := Ai ⊆ {0, ..., m − 1} (die hängt nur vom Index i ab).<br />

Durchlaufe j ∈ A absteigend. Für jedes j ∈ A setze die ersten 2 j Koordinaten gleich<br />

0, die nächsten 2 j lassen unbestimmt, die nächsten 2 j setze 0, und so fort.<br />

Die zuletzt unbestimmt gebliebenen λi setze gleich 1.<br />

Beispiel Bestimme die Zeile z6 (unter den Zeilen z0, ..., z7) von G(3).<br />

Die Kennmenge ist A = {2, 1}.<br />

Wegen j = 2 ∈ A setze λ0 := ... := λ3 := 0; λ4, ..., λ7 unbestimmt.<br />

Wegen j = 1 ∈ A setze λ4 := ... := λ5 := 0; λ6, λ7 unbestimmt.<br />

Die beiden unbestimmt gebliebenen λ6, λ7 setze 1.<br />

Es folgt z6 = (0, 0, 0, 0, 0, 1, 1).<br />

11.5”” Zeilenbildung aus Zeilen mit 1-elementiger Kennmenge<br />

Knüpfe an vorige Situation an.<br />

Seien A, B ⊆ {0, ..., m − 1} Kennmengen (zu Indizes i, t ∈ {0, ..., 2 m − 1}). Dann ist<br />

A ∪ B auch Kennmenge eines Zeilenindex.<br />

Bezeichne mit z(A) die Zeile in G(m) zur Kennmenge A.<br />

Die Zeile z(A ∪ B) hat genau an den Stellen eine 1, wo z(A) und z(B) beide eine 1<br />

haben.<br />

Wegen z(A) = z(∪j∈A{j}) kann man also z(A) gewinnen, wenn man z({0}), ..., z{m−<br />

1}) hat.<br />

Beispiel m = 3. Bestimme z({2, 1}) = z6. Man hat z({1}) = z2 = (0, 0, 1, 1, 0, 0, 1, 1)<br />

und z({2}) = z4 = (0, 0, 0, 0, 1, 1, 1, 1). Also z({2, 1}) = z6 = (0, 0, 0, 0, 0, 0, 1, 1).<br />

11.5””’ Generatormatrizen zu RM(m, r)<br />

Bisher haben wir (in kanonischer Weise) Generatormatrizen G(m) zu RM(m, m)<br />

gefunden. Da RM(m, m) = K 2m<br />

zu sein.<br />

56<br />

ist, scheint das zunächst ein recht nutzloser Sport<br />

Wie gewinnt man Generatormatrizen G(m, r) für RM(m, r), wenn 0 ≤ r < m ist?<br />

Die Definition von RM(m, r) zusammen mit einer Übungsaufgabe zeigt:


⎛<br />

⎞<br />

G(m − 1, r) G(m − 1, r)<br />

G(m, r) = ⎝ ⎠<br />

0 G(m − 1, r − 1)<br />

für m ≥ 1 und 1 ≤ r < m.Außerdem G(m, 0) = (1 ... 1) ∈ K 1×m ; und G(m, m) =<br />

G(m), wobei G(m) oben diskutiert wurde.<br />

Zusammen mit 11.5”” kann man daraus beweisen: G(m, r) ist diejenige Matrix, wel-<br />

che aus den Zeilen von G(m) mit |A| ≤ r für die Kennmenge der Zeile besteht.<br />

Beispiel Wir haben G(3) = G(3, 3) berechnet. G(3, 2) entsteht aus G(3) durch<br />

Streichen der letzen Zeile (nur für diese ist die Kennmenge > 2).<br />

Es folgt R(m, r − 1) ⊆ R(m, r) für 1 ≤ r ≤ m.<br />

11.6 Algebraische Beschreibung der Reed-Muller-<strong>Codes</strong><br />

Seien wieder m, r ∈ IN0 mit r ≤ m und K := GF 2.<br />

Definiere auf V := K 2m<br />

(w1, ..., wl) := (v1w1, ..., vlwl).<br />

eine Multiplikation · komponentenweise: (v1, ..., vl) ·<br />

Damit ist ist V, +, · ein kommutativer Ring, der K enthält (wenn man anstelle von<br />

λ ∈ K den Vektor (λ, ..., λ) ∈ V nimmt). Man sagt, V, +, · ist eine assoziative und<br />

kommutative K-Algebra. Jedes Element v ∈ V ist (bezüglich ·) idempotent, d.h.<br />

v 2 = v.<br />

Aus 11.5”” folgt: Wenn zi die i-te Zeile von G(m) ist und Kennmenge A = {j1, ..., js}<br />

hat, gilt z(A) = z(∪j∈A{j}) = z({j1}) · ... · z({js}).<br />

Beispiel: Bei m = 3 ist z6 = z({2, 1}) = z({2}) · z({1}) = (0, 0, 0, 0, 1, 1, 1, 1) ·<br />

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

Wie oben gesagt, bilden die Zeilen aus G(m) mit höchstens r-elementiger Kennmen-<br />

ge eine Basis von RM(m, r).<br />

Daraus folgt das<br />

Ergebnis Die Menge der Produktvektoren von höchstens r Faktoren aus der Menge<br />

{ z({0}), ..., z({m − 1}) } ist eine Basis von RM(m, r).<br />

Zur Dekodierung der RM-<strong>Codes</strong> hat Reed ein einfaches Verfahren (Mehrheits-Codierung,<br />

Schwellencodierung, threshhold-decoding) entwickelt. Die NASA hat aber ein ande-<br />

57


es Verfahren (beruhend auf diskreter Fourier-Zerlegung) verwendet. Beides wird<br />

hier nicht behandelt.<br />

12. Verkürzen eines <strong>Codes</strong>, Fehlerbündel, Verschachteln (Flechten, inter-<br />

leaving)<br />

12.1 Definition Sei C ⊆ K l ein Code (nicht notwendig linear, K eine beliebige<br />

endliche Menge mit 0 ∈ K), l ≥ 2. Der an der Stelle i ∈ {1, ..., l} verkürzte (nicht<br />

verwechseln mit der Konstruktion in 6.2 (Verkürzen durch Paritätsstelle) oder Punk-<br />

tieren) Code ist<br />

˘C := {(c1, ..., ci−1, ci+1, ..., cl) ∈ K l−1 | (c1, ..., ci−1, 0, ci+1, ..., cl) ∈ C} ⊆ K l−1<br />

(vorausgesetzt | ˘ C| ≥ 2).<br />

Man nimmt also alle Codewörter ∈ C, welche an der Stelle i eine 0 haben, und<br />

streicht die Position i.<br />

12.2 Beobachtung Es gilt für den Mindestabstand δ( ˘ C) ≥ δ(C). Falls C ein li-<br />

nearer Code ist und es ein c ∈ C mit ci ̸= 0 gibt, so ist ˘ C ein linearer Code und es<br />

gilt dim( ˘ C) = dimC − 1. Wenn dann H eine Kontrollmatrix von C ist, erhält man<br />

durch Streichen der i-ten Spalte eine Kontrollmatrix von ˘ C.<br />

12.4 Konstruktion (Verschachteln, Verweben, interleaving)<br />

Den Begriff Bündel (Fehlerbündel) der Länge b haben wir im Abschnitt über zy-<br />

klische <strong>Codes</strong> vorgestellt und in Hinblick auf Fehlererkennung bei zyklischen <strong>Codes</strong><br />

besprochen.<br />

Das Verschachteln (Flechten, interleaving) ist eine Methode, Fehlerbündel zu erken-<br />

nen und zu korrigieren.<br />

Der Nachteil des Verfahrens ist, dass man Codewörter nicht sofort senden kann,<br />

sondern zunächst mehrere Codewörter zu einem längeren Wort zusammenfassen<br />

(verflechten) muß und der Empfänger das ankommende Wort entflechten muß .<br />

Sei K eine endliche Menge und l, t ∈ IN.<br />

Definition Zu jedem t-Tupel v1, ..., vt mit vi ∈ K l , v1 = (v11, ..., v1l), ..., vt =<br />

(vt1, ..., vtl), definiere ˜v wie folgt:<br />

58


Man bilde die Matrix ∈ K t×l mit v1 als erster Zeile,...,vt als letzter Zeile:<br />

⎛<br />

⎞<br />

v11 v12 . . . . v1l<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ v21 v22 . . . . v2l ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜ . . . . . . . ⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎝ . . . . . . . ⎟<br />

⎠<br />

vt1 vt2 . . . . vtl<br />

Nun entsteht ˜v ∈ K t·l durch Aneinander hängen der Spalten dieser Matrix, also<br />

˜v = (v11, ..., vt1, .........., v1l, ..., vtl).<br />

Nenne ˜v die t-fache Verschachtelung (Verflechtung, interleavement) der Vektoren<br />

v1 = (v11, ..., c1l), .........., vt = (vt1, ..., vtl) ∈ K l .<br />

Nun sei C ⊆ K l ein Code (nicht notwendig linear).<br />

Man setze<br />

Ct := {(c11, ..., ct1, .........., c1l, ..., ctl) | ci = (ci1, ..., cil) ∈ C für i = 1, ..., t} ⊆ K tl<br />

D.h. (c11, ..., ct1, .........., c1l, ..., ctl) ist der durch Verschachteln der Codewörter c1, ..., ct<br />

entstandene Vektor. D.h. Ct ⊆ K l·t ist die Menge der t-fachen Verschachtelungen<br />

aller t-Tupel von Codewrtern.<br />

Bemerkung Ct ⊆ K tl ist ein Code mit gleichem Mindestabstand wie C. Falls<br />

C ⊆ K l linearer Code ist, so ist Ct ⊆ K l·t ein linearer Code.<br />

Wozu dienen Verschachtelungen? Ich erkläre das an einem<br />

12.4’ Beispiel Die Folge 100001111111011000001010... soll übertragen werden.<br />

Benutzt werden soll der Code C := {(0, ..., 0), (0, 1, 0, 1, 1), (1, 0, 1, 0, 1), (1, 1, 1, 1, 0)} ⊆<br />

K 5 . Sein Mindestabstand ist 3; er ist also 1-fehlerkorrigierend.<br />

Zu jedem 2-Tupel (λ, µ) ∈ K 2 gibt es genau ein c ∈ C, welches λ an erster und µ an<br />

zweiter Stelle hat (wir können also die ersten beiden Stellen als ’Informationsstellen’<br />

verwenden).<br />

Deshalb zerlegen wir die zu übertragende Folge in 2-Tupel<br />

[(1, 0), (0, 0), (0, 1), (1, 1), ....] und ersetzen dann jedes 2-Tupel durch das entspre-<br />

chende Codewort. Wir erhalten (10101), (00000), (01011), (11110), ....<br />

59


Normalerweise schicken wir nacheinander jedes Codewort durch den Sendekanal (wo<br />

es eventuell verfälscht wird) und dekodieren dann mit ’minimal distance decoding’.<br />

Falls in jedem gesendeten Codewort höchstens eine Stelle verfälscht wird, liefert dies<br />

Verfahren die ursprünglichen Codewörter.<br />

Nun wenden wir t = 4-faches Verschachteln an.<br />

Aus je 4 Codewörtern basteln wir ein Codewort ˜c ∈ C4 ⊆ K tl wie oben beschrie-<br />

ben (Zeilen der Matrix sind die 4 Codewörter; das entstehende verwobene Codewort<br />

erhält man, indem man die Spalten nacheinander liest). Für die ersten vier Co-<br />

dewörter erhalten wir<br />

⎛<br />

1<br />

⎜ 0<br />

˜c = ⎜ 0<br />

⎝<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

⎞<br />

1<br />

⎟<br />

0 ⎟ ∈<br />

1 ⎟<br />

⎠<br />

1 1 1 1 0<br />

˜ C ⊆ K tl = K 4·5 = K 20<br />

wobei die Spalten aneinanderzuhängen sind.<br />

Nehmen wir an, bei der Übertragung werden die Stellen 3,5,6 verfälscht.<br />

Beim normalen Senden der Codewörter (10101), (00000), (01011), (11110) als an-<br />

einandergehängtes Tupel erscheint (10000), (10000), (01011), (11110) und nach<br />

’minimal distance decoding’ erhält man (00000), (00000), (01011), (11110), also<br />

nicht das ursprünglich gesendete Quadrupel von Codewörtern (was auch zu befürch-<br />

ten war: das erste Codewort wurde an 2 Stellen verfälscht, der Code C ist aber nur<br />

1-korrigierend).<br />

Wenn wir das verschachtelte Codewort ˜c senden, erscheint beim Empfänger<br />

⎛<br />

1<br />

⎜ 0<br />

˜v = ⎜ 1<br />

⎝<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

⎞<br />

1<br />

⎟<br />

0 ⎟ ∈<br />

1 ⎟<br />

⎠<br />

1 1 1 1 0<br />

˜ C ⊆ K tl = K 8<br />

Es ist das Wort ∈ K tl welches durch Verschachteln von v1 = (11101), v2 = (01000), v3 =<br />

11011), v4 = (11110) entsteht. Wenn man auf jedes der vi minimal distance decoding<br />

anwendet, erhält man die ursprünglichen Codewörter<br />

(10101), (00000), (01011), (11110), die Übertragung gelingt also fehlerlos. In bei-<br />

den Fällen wurden 20 Ziffern übermittelt.<br />

Allgemeiner Sachverhalt:<br />

60


12.4” Satz Sei K ein Körper, C ⊆ K l ein linearer Code und t eine natürliche Zahl.<br />

Seien c1, ..., ct ∈ C ⊆ K l Codewörter und sei ˜c ∈ ˜ C die t-fache Verschachtelung von<br />

c1, ..., ct.<br />

Sei b ∈ IN, b ≤ l, und ˜w ∈ K lt ein Bündel der Länge ≤ bt.<br />

Seien v1, ..., vt ∈ K l bestimmt durch die Eigenschaft: ˜c + ˜w ist t-fache Verschachte-<br />

lung von v1, ..., vt. Dann gilt für i = 1, ..., t: vi−ci = 0 oder vi−ci ist ein Fehlerbündel<br />

der Länge ≤ b.<br />

Insbesondere folgt dann: Falls C b-fehlerkorrigierend ist, liefert ’minimal distance-<br />

decoding’ aus jedem vi das Codewort ci (als nächstliegendes Codewort).<br />

Im Beispiel war t = 4, b = 1. Wenn also beim Übertragen eines verschachtelten<br />

Codeworts höchstens Fehlerbündel der Länge 4 auftreten (wie im Beispiel angenom-<br />

men), so erfolgt die Übertragung nach minimal distance decoding fehlerfrei.<br />

12.4”’ Satz Falls C ein zyklischer Code mit Generatorpolynom g ist, so ist die<br />

Verschachtelung zur Tiefe t ein zyklischer Code mit Generatorpolynom g(x t ) (d.h.<br />

x in g wird durch x t ersetzt).<br />

61


13. Eine grobe Beschreibung der CD-Codierung<br />

Eine CD trägt Information auf einer spiralförmig verlaufenden Spur. Die Spur hat<br />

zwei verschiedene Tiefen: ein zusammenhängendes Teilstück mit niedriger Tiefe heißt<br />

pit eines mit hoher Tiefe land.<br />

Ein bit entspricht 0, 3µm = 0, 3 · 10 −6 m.<br />

Ein Sprung pit/land oder land/pit wird als 1 gedeutet, wenn kein Sprung stattfindet<br />

wird jeder Abschnitt der Länge 0, 3 · 10 −6 m als 0 gedeutet.<br />

Beispiel:<br />

− − − − − − − − − − − − − −<br />

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

Gesamtspurlänge ist etwa 5km, also werden etwa 5km / 0, 3µm = 17 · 10 9 bits ge-<br />

speichert.<br />

Die Spur wird mit etwa 1,2m/sek abgetastet (von Laserlicht beleuchtet, reflektiertes<br />

Licht - bei pit schwächer als bei land - von einer Photozelle empfangen).<br />

Technik-Regeln: zwischen zwei Einsen sind mindestens zwei Nullen (um physikalische<br />

Auflösung zu ermöglichen) und höchstens 10 Nullen ohne Unterbrechung (zwecks<br />

Synchronisation).<br />

Schalldruck des Tonsignals wird mit 44,1 kHz von beiden Stereokanälen abgetastet.<br />

Betrachten wir einen einzigen der Stereokanäle.<br />

Jedem Abtasten wird ein 16-Bit-Vektor ∈ (GF2) 16 zugeordnet.<br />

Der Körper K := GF2 8 ist als GF2-Vektorraum 8-dimensional. Pro Abtastung erhält<br />

man also ein Element ∈ K 2 .<br />

Da es zwei Stereokanäle gibt, liefert jede Abtastung ein Element in K 4 .<br />

Je 6 Abtastungen werden zu einem Wort ∈ K 24 zusammengefaßt.<br />

Jedem solchen ’Audiowort’ ordnet man ein Codewort des CIRC (cross-interleaved<br />

Reed-Solomon-code) zu.<br />

Wir beschreiben nun grob den CIRC.<br />

In K 255 betrachtet man einen 251-dimensionalen Reed-Solomon-Code RSC mit Min-<br />

destabstand 5.<br />

62


Durch mehrfaches Verkürzen (siehe 12.1, 12.2) erhält man aus RSC einen Code<br />

C1 ⊆ K 32 (innerer Code) der Dimension 28 ebenfalls mit Mindestabstand 5 (beim<br />

Verkürzen erniedrigt sich nach 12.2 der Minimalabstand nicht, und größer als 5 kann<br />

er wegen der Singleton-Schranke nicht werden).<br />

Ebenfalls aus RSC erhält man aus RSC einen Code C2 ⊆ K 28 (äußerer Code) der<br />

Dimension 24 mit Mindestabstand 5.<br />

Mit C2 werden die Audioworte kodiert. Dann unterwirft man C2 einer Verschachte-<br />

lung der Tiefe 28.<br />

Diese verschachtelten Worte werden mit C1 ⊆ K 32 codiert.<br />

Jedes Codewort wird um eine Stelle verlängert, man bekommt ein Wort ∈ K 33 (an<br />

der zusätzlichen Stelle werden Anzeige-Informationen gespeichert).<br />

Bisher haben wir also jedem Audiowort ein Codewort ∈ K 33 zugeordnet.<br />

Diese Codewörter kann man nicht unmittelbar auf die CD übertragen, da die obigen<br />

Technik-Regeln zu beachten sind.<br />

Um die Regeln zu befolgen, wird jede Bit-Folge mit dem EFM-Verfahren (eight to<br />

fourteen modulation) umgewandelt, an die entstehenden ’Blöcke’ werden noch je-<br />

weils 24 Bits für die Synchronisation und drei Puffer-Bits angehängt. Das ist aus<br />

Sicht der <strong>Codierungstheorie</strong> nicht besonders interessant. Insgesamt gehören dann zu<br />

jedem Audiowort 588 Bits. Pro Sekunde also 44100×588<br />

6<br />

= 4321800 Kanal-Bits.<br />

Bei der Dekodierung wird C1 zur Korrektur von einem Fehler benutzt (wegen Min-<br />

destabstand 5 könnte man sogar 2 Fehler korrigieren). Falls mehr als 1 Fehler re-<br />

gistriert wird, wird das ganze Codewort gelöscht, d.h. die Spalte in der Interleave-<br />

Matrix wird als fehlerhaft markiert.<br />

14. Rechnen in endlichen Körpern<br />

14.1 Satz Sei K ein endlicher Körper, P sein Primkörper, p := |P |.<br />

Dann ist n := |K| = p m für ein m ∈ IN.<br />

Für q := x n−1 − 1 ∈ P [x] und für r := x n − x = x · q ∈ P [x] gilt:<br />

K = {c ∈ K | r(c) = 0}<br />

63


K \ {0} = {c ∈ K | q(c) = 0}<br />

K ist Zerfällungskörper von r (und auch von q) über P .<br />

Denn die Gruppe K \ {0}, · hat die Ordnung n − 1 und liegt deshalb in der Null-<br />

stellenmenge von q. Mehr als n − 1 Nullstellen kann q nicht haben.<br />

14.1’ Da zwei Zerfällungskörper des gleichen Polynoms q über dem gleichen Körper<br />

P isomorph sind, gibt es bis auf Isomorphie höchstens einen Körper der Ordnung p m .<br />

Dass es zu p m (p Primzahl, m ∈ IN) einen Körper dieser Ordnung gibt, erschließt<br />

man so:<br />

14.2 Satz Sei n := p m (p Primzahl, m ∈ IN) gegeben.<br />

Sei P := Z/pZ der Primkörper der Ordnung p.<br />

Der Zerfällungskörper K von r := x n − x über P hat die Ordnung n.<br />

Beweis.<br />

(i) K = {c ∈ K | r(c) = 0}.<br />

Beweis von (i). ⊇ ist klar.<br />

Sei φ : K → K, a ↦→ a p . Dann ist φ ein Automorphismus von K (da charK = p<br />

gilt und K endliche Körpererweiterung von P ist). Auch φ m ist dann ein Automor-<br />

phismus. Deshalb ist Fixφ m := {a ∈ K | aφ m = a} ein Unterkörper von K. Aus der<br />

Definition von r folgt unmittelbar: Fixφ m = {c ∈ K | r(c) = 0}, d.h. jede Nullstelle<br />

von r liegt bereits in Fixφ m . Deshalb zerfällt r bereits in Fixφ m in Linearfaktoren.<br />

Die Definition von K als Zerfällungskörper liefert K = Fixφ m .<br />

(ii) r hat keine mehrfachen Nullstellen.<br />

Denn r ′ = n · x n−1 − 1 = −1 (es ist n = p m = 0 in K), also können r und r ′ keine<br />

gemeinsame Nullstelle haben.<br />

Aus (i) und (ii) folgt |K| = |{c ∈ K | r(c) = 0}| = n.<br />

64


Der Satz gibt keine rechnerisch einfache Konstruktionsvorschrift für K; denn die<br />

Konstruktion des Zerfällungskörpers wird wie folgt bewältigt.<br />

Man wähle einen in P [x] irreduziblen Teiler g von r und betrachte P [x]/g · P [x]<br />

(Kronecker-Konstruktion). Dies ist ein Erweiterungskörper P (α) von P , in welchem<br />

g und damit r eine Nullstelle hat.<br />

Falls r in P (α) zerfällt, ist dies der gesuchte Zerfällungskörper.<br />

Andernfalls suche man einen irreduziblen Faktor in P (α)[x] des Polynoms r<br />

x−α und<br />

adjungiere eine Nullstelle davon an P (α).....<br />

So fährt man fort, bis man einen Körper erhalten hat, in dem r in Linearfaktoren<br />

zerfällt.<br />

Kann man den Zerfällungskörper durch nur einmaliges Ausführen der Kronecker-<br />

Konstruktion erhalten?<br />

Ja!<br />

Begründung. Es gilt der Satz von Artin: jede endliche Untergruppe der multiplika-<br />

tiven Gruppe eines Körpers K ist zyklisch.<br />

Wenn also |K| = n = p m ist, gibt es β ∈ K (ein ’primitives’ Element) mit<br />

K \ {0} = {β, β 2 , ..., β n−1 = 1}. Da β algebraisch über dem Primkörper P ist<br />

(Nullstelle von x n−1 − 1 ∈ P [x] ), gibt es das in P [x] irreduzible normierte Polynom<br />

g = irr(P, β) mit Nullstelle β. Es gilt K = P (β) = P [x]/gP [x] (mit derüblichen<br />

Identifikation β = x ).<br />

Der Erweiterungsgrad m = K : P ist gleich dem Grad von g.<br />

Wir halten fest:<br />

14.2 Satz Sei n := p m (p Primzahl, m ∈ IN) gegeben und P der Primkörper mit<br />

|P | = p.<br />

Es gibt ein irreduzibles normiertes Polynom g ∈ P [x] vom Grad m.<br />

Der durch Adjungieren einer Nullstelle β von g entstehende Körper K := P (β) hat<br />

Ordnung n = p m . In diesem Körper zerfällt g in Linearfaktoren.<br />

Man kann g sogar so wählen, dass β (und damit alle Nullstellen von g) die Ordnung<br />

n − 1 in K \ {0}, · hat, also die multiplikative Gruppe von K erzeugt.<br />

65


Ein Polynom mit der letztgenannten Eigenschaft nennt man ein ’primitives’ Poly-<br />

nom (über P der Ordnung m).<br />

Eine ’Formel’ zur Berechnung primitiver Polynome ist nicht bekannt. Man findet<br />

Tabellen solcher Polynome.<br />

Rechnen mit primitiven Elementen vereinfacht das Multiplizieren in K.<br />

14.3 Beispiel P := GF2; g := x 4 + x + 1 ∈ P [x] ist irreduzibel.<br />

Sei K = P (β) der durch Adjunktion einer Wurzel β von g entstehende Körper.<br />

Behauptung: g ist primitiv, d.h. |{β, β 2 , ..., β 15 = 1}| = 15.<br />

Wir haben K = {a3β 3 + a2β 2 + a1β + a0 | ai ∈ P } (1, β, β 2 , β 3 ist eine Basis des<br />

P -Vektorraums K) und β 4 = β + 1.<br />

Wegen β 3 ̸= 1 und β 5 = β · β 4 = β 2 + β ̸= 1 ist die Ordnung von β gleich 15, also<br />

die Behauptung zutreffend.<br />

Nun kann man blitzschnell in K rechnen:<br />

Man kürze das Polynom a3β 3 + a2β 2 + a1β + a0 ab durch a3a2a1a0. Statt β i steht<br />

links in der folgenden Tabelle nur i, rechts daneben das Element β i in Polynomdar-<br />

stellung, z.B. β 11 = β 3 + x 2 + x + 0.<br />

66


0 0001<br />

1 0010<br />

2 0100<br />

3 1000<br />

4 0011<br />

5 0110<br />

6 1100<br />

7 1011<br />

8 0101<br />

9 1010<br />

10 0111<br />

11 1110<br />

12 1111<br />

13 1101<br />

14 1001<br />

Wir berechnen als Beispiel mithilfe der Tabelle:<br />

(β 8 + β 4 + 1)(β 3 + β) = β 11 + β 9 + β 7 + β 5 + β 3 + β =<br />

1110 + 1010 + 1011 + 0110 + 1000 + 0010 =<br />

0011 =<br />

β 4 = β + 1<br />

67

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!