Kapitel 1: Codierungstheorie

Werbung
Kapitel 1: Codierungstheorie
Inhalt:
1.1 Einführung
1.2 Quellcodierung
1.3 Fehlererkennende Codes
1.4 Fehlerkorrigierende Codes
1.1 Einführung
In der Codierungstheorie unterscheidet man Quellcodierung und
Kanalcodierung.
1. Die Quellcodierung hat zum Ziel, Daten so zu transformieren, dass
sie gut übertragen werden können.
2. Die Kanalcodierung hat zum Ziel, Daten so zu transformieren, dass
bei der Übertragung auftretende Fehler erkannt und evtl. sogar
korrigiert werden können.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 2
Quellcodierung
Bei der Quellcodierung sind zwei Aspekte wichtig:
(a) Oft treten Daten in einer Form auf, die sich nicht zur Übermittlung
eignet. Diese Quelldaten müssen codiert werden, damit sie überhaupt
übertragen werden können. Beispiele:
- Flaggencode
- Digitalisierung von Sprache, Bildern, ...
- Morse-Code: a = • –, b = – • • •, ...
- ASCII-Code: a = 10000010, b = 10000100, ...
(b) Die Daten sollen möglichst ökonomisch übertragen werden. Dazu
sollen sie so gut wie möglich komprimiert werden.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 3
Kanalcodierung
Der Kanalcodierung liegt folgende Situation zugrunde:
Ein Sender will einem Empfänger gewisse Daten über einen Kanal
übermitteln.
Dabei können zufällige Fehler vorkommen.
Diese Fehler treten in der Regel aus physikalischen Gründen auf.
Beispiele:
- Tippfehler bei Eingaben über eine Tastatur
- Kratzer auf einer CD
- Atmospherische Störungen („Rauschen“) bei einer Funkübertragung
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 4
Kommunikationsmodell der Kanalcodierung
Der Sender codiert einen Datensatz d zu einer Nachricht c
(Codewort); diese wird über den Kanal geschickt. Der Empfänger
versucht durch Decodieren zu erkennen, ob Fehler aufgetreten sind,
und evtl. den Datensatz wieder zu rekonstruieren.
Sender
Datensatz d
Codieren
Kapitel 1: Codierungstheorie
Empfänger
Nachricht c
(Codewort)
veränderte
Nachricht x
Decodieren
Datensatz d'
© Zschiegner
April 2002
Seite 5
Fehlererkennung und -korrektur
Bei fehlererkennenden Codes wird – wenn ein Fehler passiert –
angezeigt, dass etwas nicht stimmt.
Die Übertragung muss daraufhin wiederholt werden.
Für viele Anwendungen ist das ausreichend.
Beispiele: Kontonummern, Buchnummern, Artikelnummern, ...
Manchmal ist eine wiederholte Übertragung aber sehr aufwendig oder
überhaupt nicht möglich. Dann benötigt man fehlerkorrigierende Codes.
Beispiele: CD-Player, Datenfernübertragung zwischen Computern
(Internet), Übertragung von Planetenfotos von Satelliten zur Erde, ...
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 6
1.2 Quellcodierung
Sei {s1, s2, ..., sn} eine Quelle mit den Quellzuständen si, die jeweils
mit der Häufigkeit oder Wahrscheinlichkeit pi auftreten.
Beispiele:
(a) Im Deutschen treten die Buchstaben des Alphabets mit folgenden
Wahrscheinlichkeiten auf:
e: 17,4 %, n: 9,78 %, i: 7,55 %, s: 7,27 %, r: 7,00 %, a: 6,51 %, ...
(b) Seien s1, s2, ..., sn die verschiedenen Bytes, die in einem
Computerprogramm auftreten. Dabei trete si mit der Häufigkeit pi auf.
Wir möchten dieses Programm so gut wie möglich komprimieren.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 7
Der Huffman-Code
Wir wollen uns im Folgenden auf binäre Codierung beschränken.
Der wichtigste Code zur Datenkomprimierung ist der Huffman-Code.
Er beruht auf der Idee, häufig vorkommende Zeichen in möglichst kurze
Codewörter zu transformieren.
Beispiel: Wir betrachten folgende 8 Quellzustände und Häufigkeiten:
Quellzustände
Häufigkeiten
s1
s2
s3
s4
s5
s6
s7
s8
0,22 0,20 0,18 0,15 0,10 0,08 0,05 0,02
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 8
Beispiel zum Huffman-Code
si
pi
Code
pi
Code
s1
0,22 10
0,22 10
0,22 10
0,25 01
0,33 00
0,42 1
0,58 0
s2
0,20 11
0,20 11
0,20 11
0,22 10
0,25 01
0,33 00
0,42 1
s3
0,18 000
0,18 000
0,18 000
0,20 11
0,22 10
0,25 01
s4
0,15 001
0,15 001
0,15 001
0,18 000
0,20 11
s5
0,10 011
0,10 011
0,15 010
0,15 001
s6
0,08 0100
0,08 0100
0,10 011
s7
0,05 01010 0,07 0101
s8
0,02 01011
Kapitel 1: Codierungstheorie
pi
Code
pi
Code
pi
Code
pi
+
Code
pi
Code
=
© Zschiegner
April 2002
Seite 9
Die Schritte beim Huffman-Code
- In jedem Schritt werden die Quellzustände mit den kleinsten Häufigkeiten zu einem neuen Quellzustand kombiniert, dessen Häufigkeit die
Summe der „alten“ Häufigkeiten ist (
+
=
).
Dies wird solange durchgeführt bis nur noch zwei Zustände übrig sind.
- Von diesen beiden Quellzuständen erhält der häufigere eine 0, der
seltenere eine 1 als Code.
- Jetzt geht es rückwärts: Der Code eines Quellzustands im Schritt k
sei b1b2...bm. Wenn dieser Zustand auch im Schritt k-1 vorkommt,
dann erhält er dort die gleiche Codierung. Wenn der Zustand aus den
Zuständen su und sv kombiniert wurde (o.B.d.A. sei su häufiger),
dann erhält su den Code b1b2...bm0 und sv erhält b1b2...bm1.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 10
Die durchschnittliche Codewortlänge
Sei S = {s1, s2, ..., sn} eine Quelle mit den Quellzuständen si, die
jeweils mit der Wahrscheinlichkeit pi auftreten.
Unter einem binären Code werde si in c(si) codiert. Sei l(si) die
Länge des Codeworts c(si).
Wir definieren die durchschnittliche Codewortlänge l* als
l* = p1· l(s1) + p2· l(s2) + ... + pn· l(sn) .
Beispiel: Im obigen Beispiel gilt
l* = 0,22·2 + 0,2·2 + 0,18·3 + 0,15·3 + 0,1·3 + 0,08·4 + 0,05·5 + 0,02·5
= 2,8
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 11
Wie gut ist der Huffman-Code?
Der Huffman-Code ist im folgenden Sinne „optimal“.
1.2.1 Satz. Sei S = {s1, s2, ..., sn} eine Quelle mit den zugehörigen
Wahrscheinlichkeiten pi. Dann gilt es keinen Code, der eine kleinere
durchschnittliche Codewortlänge als der Huffman-Code hat.
Beweis durch Induktion nach n. Wenn der Code in einem Schritt k
„optimal“ ist, dann liefert das Vorgehen beim Huffman-Code auch im
Schritt k-1 einen optimalen Code.

Bemerkung. Man kann zeigen, dass der Huffman-Code eindeutig
decodierbar ist.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 12
1.3 Fehlererkennende Codes
Schon die alten Römer wussten es: „Errare humanum est”.
Wir betrachten Fehler beim Übertragen von Daten, die durch zufällige
Störungen hervorgerufen werden.
Folgen: falsche Geldüberweisungen, Artikellieferungen ,...
Die Fehler, die wir behandeln, sind Veränderungen von Zeichen. Keine
Fehler in diesem Sinne sind also Verlust oder Hinzufügen von Zeichen.
Mit Hilfe fehlererkennender Codes soll der Empfänger entscheiden
können, ob die empfangene Nachricht Fehler enthält oder nicht.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 13
Fehlererkennung im täglichen Leben
• Namen buchstabieren („Zet-es-zeh-ha-i-e-ge-en-e-er“)
• Buchstabieralphabete („A wie Anton, B wie Berta, ...“)
• Sprachen sind so redundant (haben so viel überschüssige Information), dass man alls vrsteht, auc wnn einge Bchstbn fhln. Selpst wen
groppe recktscreib Felr auftren ged dr ßinn nich färlohn.
Grundidee: Man fügt der Nachricht etwas hinzu - eine „Kontrollinformation“, die nur dazu dient, eventuelle Übertragungsfehler zu erkennen.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 14
Die Idee: Eine Prüfziffer!
Das Szenario: Als Daten wollen wir 4-stellige Zahlen übermitteln.
Der Empfänger soll merken, ob die Daten korrekt sind oder nicht.
Die Idee: Wir fügen eine Ziffer hinzu, und zwar so, dass die
Quersumme dieser (5-stelligen) Zahl durch 10 teilbar ist!
Diese hinzugefügte Ziffer heißt Prüfziffer.
Beispiele:
(a) Der Datensatz 1234 hat die Prüfziffer 0.
(b) Der Datensatz 4813 hat die Prüfziffer 4.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 15
Wie wird der Fehler erkannt?
Woran merkt der Empfänger, dass ein Fehler aufgetreten ist?
Der Empfänger bildet die Quersumme der empfangenen (5-stelligen)
Zahl.
- Wenn diese durch 10 teilbar ist, so akzeptiert er die Nachricht und
nimmt die ersten vier Stellen als Daten.
- Wenn die Quersumme nicht durch 10 teilbar ist, so weiß er, dass ein
Fehler passiert ist und fordert die Nachricht erneut an.
Beispiel: Wird die Zahl 12345 empfangen, so muss beim Übertragen
ein Fehler aufgetreten sein, denn 1+2+3+4+5=15 ist nicht durch 10
teilbar.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 16
Paritätscodes
Die Daten seien binäre Folgen der Länge n-1, D die Menge aller Daten:
D = {(b1, ..., bn-1) | bi  {0, 1}}.
Wir erhalten die codierte Nachricht, indem wir ein n-tes Bit anhängen,
so dass die Summe aller Bits gerade ist:
n
M = {(b1, ..., bn-1, bn) | bi  {0, 1} und
 bi mod 2 = 0}.
i1
Codierung: Wenn b1 + ... + bn-1 gerade ist, setzt der Sender bn = 0,
sonst bn = 1.
Decodierung: Der Empfänger überprüft, ob die Summe der Bits in der
empfangenen Nachricht gerade ist. Falls ja, akzeptiert es die Nachricht;
falls nein, akzeptiert es sie nicht.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 17
Der Paritätscode ist 1-fehlererkennend
Die Menge
M = {(b1, ..., bn-1, bn) | bi  {0, 1} und
heißt Paritätscode der Länge n zur Basis 2.
n
 bi mod 2 = 0}.
i1
Die Elemente von M heißen Codewörter.
Beobachtung: Der Paritätscode ist ein 1-fehlerekennender Code.
Das heißt, wenn höchstens ein Fehler passiert, wird dieser entdeckt.
Bemerkung: Wenn 2 (oder eine gerade Anzahl) Fehler passieren,
akzeptiert der Empfänger die Nachricht, obwohl sie Fehler enthält.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 18
Verallgemeinerung: Paritätscodes über Gruppen
Sei G eine Gruppe und sei c ein beliebiges Element von G. Die
Menge
C = {(g1, ..., gn-1, gn) | gi  G und g1 ...  gn-1 gn = c}
ist ein Paritätscode der Länge n über der Gruppe G.
Wie können uns (g1, ..., gn-1) als Informationssymbole („Daten“) und
gn als Prüfsymbol vorstellen.
Berechnung des Prüfsymbols: gn = gn-1-1  gn-2-1  ...  g1-1  c.
Beispiele: (a) G = Z2 = {0, 1}, c = 0: Vorheriges Beispiel (Folie 17).
(b) G = Z10, c = 0: Dezimalcode von Folie 15.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 19
1-Fehlererkennung bei Paritätscodes über Gruppen
1.3.1 Satz. Paritätscodes über Gruppen sind 1-fehlererkennend.
Beweis. Sei (g1, ..., gn-1, gn) ein Codewort. Dann ist
g1 ...  gn-1 gn = c.
Angenommen, das i-te Symbol gi wird durch ein anderes Symbol gi‘
ersetzt (ein Fehler an der i-ten Stelle passiert).
Würde der Empfänger die Nachricht (g1, ..., gi-1, gi‘, gi+1, ... , gn-1, gn)
akzeptieren, so müsste gelten
g1 ...  gi-1  gi‘  gi+1  ...  gn-1 gn = c.
Zusammen folgt gi = gi‘. Das ist ein Widerspruch.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 20
Vertuaschungsfehler
Bisher haben wir nur Einzelfehler betrachtet: Ein Zeichen wurde durch
ein anderes ersetzt. Beispiel: Statt 1357 liest man 1857.
Jetzt betrachten wir Vertauschungsfehler: Zwei aufeinanderfolgende
Zeichen werden vertauscht. Beispiel: Statt 1357 liest man 1375.
Paritätscodes erkennen Vertauschungsfehler im Allgemeinen nicht.
Wenn G eine abelsche Gruppe ist, wird kein Vertauschungsfehler
erkannt. Wenn G nichtabelsch ist, werden manche Vertauschungsfehler erkannt, aber niemals alle (denn jedes Element ist stets mit
seinem Inversen und mit dem neutralen Element vertauschbar).
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 21
Paritätscodes mit Gewichten
Problem: Wie können wir benachbarte Stellen unterscheiden?
Neue Idee: Wir versehen jede Stelle mit einem „Gewicht”!
Sei G die Gruppe (Zm, +) und c  Zm. Seien w1, ..., wn-1, wn  Zm.
Dann ist
C = {(z1, ..., zn-1, zn) | zi  Zm und w1z1 + ... + wn-1zn-1 + wnzn = c}
ein Paritätscode zur Basis m mit den Gewichten w1, ..., wn.
Beispiel: Wir erhalten den ursprünglichen Paritätscode (ohne Gewichte)
zurück, wenn wir w1 = ... = wn = 1 setzen.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 22
1-Fehlererkennung bei Paritätscodes mit Gewichten
1.3.2 Satz. Obiger Paritätscode mit Gewichten ist genau dann
1-fehlererkennend, wenn gilt w1, ..., wn-1, wn  Zm*.
Beweis. „“ Sei (z1, ..., zn-1, zn) ein Codewort. Dann ist
w1z1 + ... + wn-1zn-1 + wnzn = c.
Angenommen, das i-te Symbol zi wird durch zi‘  zi ersetzt. Wäre
auch (z1, ..., zi-1, zi‘, zi+1, ... , zn-1, zn) ein Codewort, so müsste gelten
w1z1 + ... + wi-1zi-1 + wizi‘ + wi+1zi+1 + ... + wn-1zn-1 + wnzn = c.
Subtraktion der beiden Gleichungen liefert wizi - wizi‘ = wi(zi - zi‘) = 0.
Da wi invertierbar ist, folgt zi - zi‘ = 0, also zi = zi‘: Widerspruch.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 23
Fortsetzung des Beweises
„“ Angenommen, wi wäre nicht aus Zm*. Dann ist t := ggT(m, wi) > 1.
Dann wird die Veränderung von zi := m/t zu zi‘ := 0 nicht erkannt!
(Denn: Sei wi = kt. Sei (z1, ..., zi, ..., zn) ein Codewort mit zi := m / t.
Dann ist c = w1z1 + ... + wizi + ... + wnzn
= w1z1 + ... + kt  m/t + ... + wnzn
= w1z1 + ... +
0 + ... + wnzn (in Zm).
= w1z1 + ... + wi  0 + ... + wnzn
= w1z1 + ... + wi  zi‘ + ... + wnzn .
Also ist auch (z1, ..., zi‘, ..., zn) ein Codewort, der Fehler an der i-ten
Stelle wird nicht erkannt. )

Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 24
Der EAN-Code
Fast jedes käufliche Produkt besitzt eine EAN (Europäische ArtikelNummer) mit zugehörigem Strichcode.
Die EAN ist entweder 13- oder 8-stellig.
An letzter Stelle steht die Prüfziffer.
Sie wird nach einem Paritätscode zur Basis 10
mit den Gewichten 1-3-1-...-1 (bei 13 Stellen)
bzw. 3-1-3-...-1 (bei 8 Stellen) berechnet.
Der EAN-Code erkennt alle Einzelfehler (nach 1.3.2), aber nicht alle
Vertauschungsfehler!
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 25
Erkennen von Vertauschungsfehlern
1.3.3 Satz. Ein Paritätscode zur Basis m mit Gewichten w1, w2, ..., wn
erkennt genau dann alle Vertauschungsfehler an den Stellen i und j,
falls die Zahl wi  wj teilerfremd zu m ist.
Beweis. Sei (z1, z2, ..., zn) ein Codewort; das bedeutet, dass gilt
w1z1 + w2z2 + ... + wnzn = c.
Nun mögen die Einträge an den Stellen i und j vertauscht werden.
Dann gilt: Der Empfänger bemerkt diesen Fehler nicht
 w1z1 + w2z2 + ... + wizj + ... + wjzi + ... + wnzn = c
 wizi + wjzj– (wizj + wjzi) = 0
 wi(zi – zj) + wj(zj – zi) = 0
 (wi– wj)(zi – zj) = 0.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 26
Fortsetzung des Beweises
Das bedeutet: Der Empfänger bemerkt jede solche Vertauschung, falls
keine der möglichen Zahlen (wi– wj)(zi – zj) gleich 0 ist (in Zm), d.h.
falls keine der Zahlen (wi– wj)(zi – zj) durch m teilbar ist.
„“: Wenn die Zahlen m und wi– wj teilerfremd sind, dann teilt m
keine der Zahlen (wi– wj)(zi– zj). Denn m müsste dann sogar zi – zj
teilen, was wegen zi – zj  m1 unmöglich ist.
„“: Wenn andererseits die Zahlen m und wi– wj einen größten
gemeinsamen Teiler t > 1 haben, dann wird die Vertauschung von
zi := m/t und zj = 0 nicht erkannt.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 27
Kann man Einzel- und Vertauschungsfehler erkennen?
1.3.4 Korollar. Für gerades m gibt es keinen Paritätscode zur Basis
m, der alle Einzelfehler und alle Vertauschungsfehler an aufeinanderfolgenden Stellen erkennt.
Beweis. Sei C ein Paritätscode der Länge n zu einer geraden Basis
m mit den Gewichten w1, w2, ...., wn.
Wenn C alle Einzelfehler erkennt, müssen nach 1.3.2 alle Gewichte
ungerade sein, da sie sonst nicht teilerfremd zu m wären. Also sind
die Differenzen wi–wi+1 alle gerade. Daher kann C nach 1.3.3 nicht
alle Vertauschungsfehler an aufeinanderfolgenden Stellen erkennen. 
Beispiel: Dezimale Paritätscodes (m = 10) erkennen nie alle Einzelfehler und alle Vertauschungsfehler an aufeinanderfolgenden Stellen.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 28
Der ISBN-Code
Einer der besten Codes ist der ISBN-Code.
Jedes Buch hat eine ISBN (International Standard Book Number).
Diese hat 10 Stellen, in 4 Gruppen eingeteilt:
1. Sprachraum (z.B. 3 = deutsch)
2. Verlag (z.B. 528: Verlag Vieweg)
3. Nummer des Buches (z.B. 06783)
4. Prüfsymbol
Kapitel 1: Codierungstheorie
ISBN 3-528-06783-7
© Zschiegner
April 2002
Seite 29
Berechnung des ISBN-Prüfsymbols
Sei a1a2a3... a9a10 eine ISBN. Das Prüfsymbol a10 wird so bestimmt,
dass die Zahl
10a1 + 9a2 + 8a3 + 7a4 + 6a5 + 5a6 + 4a7 + 3a8 + 2a9 + 1a10
eine Elferzahl ist. Das Prüfsymbol kann gleich 0, 1, 2, ..., 9 oder 10
sein. Wenn sich 10 ergibt, so schreibt man X (römische Zehn).
Beispiel: Für die ISBN 3-528-06783-? berechnen wir die Zahl
103 + 95 + 82 + 78 + 60 + 56 + 47 + 38 + 23 = 235.
Die nächste Elferzahl ist 242, also muss das Prüfsymbol 7 sein.
Die komplette ISBN lautet also 3-528-06783-7.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 30
Wie gut ist der ISBN-Code?
1.3.5 Satz. (a) Der ISBN-Code erkennt alle Einzelfehler.
(b) Der ISBN-Code erkennt alle Vertauschungsfehler – sogar an beliebigen Stellen.
Beweis. Formal kann der ISBN-Code wie folgt beschrieben werden:
{(a1, ..., a10)  10a1+ 9a2+ 8a3+ 7a4+...+ 3a8+ 2a9+ 1a10 mod 11 = 0}.
Der ISBN-Code ist also ein Paritätscode zur Basis m = 11 mit den
Gewichten 10, 9, ..., 1 und c = 0. Da Z11* = {1, 2, ..., 10} ist, liegen
alle Gewichte und alle Differenzen von je zwei Gewichten in Z11*. Nach
1.3.2 und 1.3.3 werden daher alle Einzelfehler und beliebige Vertauschungsfehler erkannt.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 31
1.4 Fehlerkorrigierende Codes
Unser erstes Ziel ist es, die Eigenschaft, Fehler korrigieren zu können,
zu präzisieren.
Im Folgenden sei eine Nachricht stets ein binäres n-Tupel, also ein
Element der Menge V := {0,1}n bzw. des Vektorraums GF(2)n.
Problemstellung: Der Kanal addiert zu dem gesendeten Vektor c (der
„Nachricht”) einen Fehlervektor e. Der Empfänger erhält den Vektor
x = c + e.
Die Aufgabe des Empfängers ist es dann, c aus x zu bestimmen.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 32
Hamming-Abstand
Der zentrale Begriff der Codierungstheorie ist der des HammingAbstandes.
Seien v = (v1, . . ., vn), w = (w1, . . ., wn)  V. Der Abstand d(v, w) von
v und w ist die Anzahl der Stellen, an denen sich v und w unterscheiden:
d(v, w) = |{i | vi  wi}|.
Oft wird d auch als Hamming-Abstand bezeichnet (zu Ehren eines der
Gründerväter der Codierungstheorie Richard W. Hamming).
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 33
Der Hamming-Abstand als Metrik
Der Hamming-Abstand d trägt den Namen „Abstand” zu Recht:
1.4.1 Lemma. Die Funktion d ist eine Metrik auf V.
Beweis. Nachweis der Eigenschaften einer Metrik:
(1) Da d(v, w) eine Anzahl ist, ist d(v, w)  0;
ferner gilt d(v, w) = 0 genau dann, wenn sich v und w an keiner
Stelle unterscheiden, also wenn sie gleich sind.
(2) Symmetrie: Offenbar gilt d(v, w) = d(w, v). (3)
(3) Die Dreiecksungleichung nachzuweisen, ist etwas kniffliger: Seien
u, v, w  V; es ist zu zeigen: d(u, w)  d(u, v) + d(v, w).
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 34
Nachweis der Dreiecksungleichung
Wir können o.B.d.A. annehmen, dass sich u und w genau an den
ersten a = d(u, w) Stellen unterscheiden. Unter diesen a Stellen
mögen b sein, an denen sich v und w unterscheiden (also u und v
übereinstimmen); ferner gebe es c Stellen außerhalb der ersten a
Stellen, an denen sich v von w unterscheidet. Natürlich ist dann
d(v, w) = b + c.
u
w
v
a 

x x x x x
o o o o o
x x x o o



b
x x x x x x x
x x x x x x x
o o o x x x x



c
Daraus erkennt man d(u, v) = a – b + c. Es ergibt sich
d(u, v) + d(v, w) = a – b + c + b + c = a + 2c  a = d(u, w).
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 35
Hammingkugeln
Zur Beschreibung von Codes werden später die „Kugeln“ bezüglich der
Hamming-Metrik von Nutzen sein.
Sei v  V, und sei r eine nichtnegative ganze Zahl. Dann heißt
Sr(v) := {x  V | d(x, v)  r}
die Kugel vom Radius r um den Mittelpunkt v.
Man spricht dabei auch von Hammingkugeln.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 36
t-fehlerkorrigierende Codes
Sei t eine natürliche Zahl. Eine Teilmenge C von V = {0,1}n heißt ein
t-fehlerkorrigierender Code, falls für je zwei verschiedene Elemente
v, w  C gilt
d(v, w)  2t + 1.
Mit anderen Worten: C  V ist ein t-fehlerkorrigierender Code, wenn
der Minimalabstand
d(C) := min {d(c, c') | c, c'  C, c  c'}
von C mindestens 2t + 1 ist.
Wir nennen die Elemente eines Codes auch Codewörter.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 37
Lemma über Hammingkugeln
1.4.2 Lemma. Sei C ein t-fehlerkorrigierender Code. Dann gilt:
(a) Zu jedem Vektor v  V gibt es höchstens ein c  C mit d(v, c)  t.
(b) Die Kugeln St(c) mit c  C sind paarweise disjunkt.
Beweis. (a) Angenommen, es gäbe zwei verschiedene Elemente
c, c'  C und einen Vektor v  V mit d(v, c)  t und d(v, c')  t.
Wegen der Dreiecksungleichung folgte daraus
d(c, c')  d(c, v) + d(v, c')  2t,
im Widerspruch zu d(C)  2t +1.
(b) Angenommen, es gibt ein v  V in St(c)  St(c') mit c, c'  C,
c  c. Dann ist d(v, c)  t und d(v, c')  t: Widerspruch zu (a).

Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 38
Warum „t-fehlerkorrigierend“?
Als gesendete Nachrichten werden nur Codewörter zugelassen. Wenn
während der Übertragung eines Codewortes c höchstens t Fehler
auftreten, so hat der empfangene Vektor x höchstens den Abstand t
zu c. Nach dem Lemma über Hammingkugeln gibt es nur ein Codewort, das einen Abstand  t zu x hat. Der Empfänger decodiert x zu
c. Hier ist die Vorstellung der Kugeln besonders hilfreich: Die Tatsache,
dass bei der Übertragung von c höchstens t Fehler auftreten,
bedeutet, dass der empfangene Vektor jedenfalls noch in St(c) liegt.
Da nach obigem Lemma je zwei Kugeln um Codewörter disjunkt sind,
kann der empfangene Vektor decodiert werden, und zwar zu dem
Codewort, welches der Mittelpunkt der Kugel ist, in der x liegt.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 39
Das Ziel der Codierungstheorie
Bemerkung. Wenn pro Codewort mehr als t Fehler auftreten, so wird
der empfangene Vektor im allgemeinen nicht korrekt decodiert. In der
Praxis wird man so vorgehen, dass man zunächst abschätzt, wie
fehleranfällig der Kanal ist, dann die Zahl t entsprechend wählt und
schließlich einen t-fehlerkorrigierenden Code konstruiert.
Das Ziel der Codierungstheorie ist es, Codes zu konstruieren, die
– einen großen Minimalabstand (und damit gute Fehlerkorrektureigenschaften) haben und
– für die es einen effizienten Decodieralgorithmus gibt.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 40
Beispiel
Die folgenden 16 Vektoren aus V = {0,1}7 bilden einen 1-fehlerkorrigierenden Code:
Kapitel 1: Codierungstheorie
0000000
1111111
1110000
0001111
1001100
0110011
1000011
0111100
0101010
1010101
0100101
1011010
0011001
1100110
0010110
1101001
© Zschiegner
April 2002
Seite 41
Lineare Codes
Der bisherige Ansatz ist unpraktikabel, denn:
- Speichern des Codes (man muss jedes Codewort abspeichern),
- Bestimmung des Minimalabstands (man muss je zwei Codewörter
vergleichen, hat also quadratischen Aufwand in |C|)
- Decodieralgorithmen (bei jedem empfangenen Vektor muss man alle
Codewörter untersuchen).
Für praktische Anwendungen besser: „Lineare Codes”.
Ein Code C  V heißt linear, falls C ein Unterraum des Vektorraums
V (und nicht nur eine Teilmenge der Menge V) ist.
Die Dimension von C wird oft mit k bezeichnet und wir nennen dann
C einen linearen [n, k]-Code.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 42
Generatormatrix
Erster Vorteil linearer Codes: Man braucht nur eine Basis von C zu
kennen. Statt alle 2k Vektoren von C zu speichern, genügt es, die k
Basisvektoren zu speichern.
Sei c1, . . ., ck eine Basis eines linearen [n, k]-Codes C. Dann heißt
die k×n-Matrix G, deren i-te Zeile der Basisvektor ci ist, eine
Generatormatrix von C.
Beispiel. Eine Generatormatrix des obigen Beispielcodes (Folie 41) ist
G=
Kapitel 1: Codierungstheorie
1

0
0

0

0 0 0 0 1 1

1 0 0 1 0 1
0 1 0 1 1 1

0 0 1 1 1 0 
© Zschiegner
April 2002
Seite 43
Minimalgewicht
Das Gewicht w(x) eines Vektors x  V ist die Anzahl der von 0
verschiedenen Stellen von x:
w(x) = d(x, 0).
Das Minimalgewicht w(C) des Codes C ist definiert als
w(C) := min {w(c) | c  C, c  0}.
1.4.3 Lemma. Sei C ein linearer Code. Dann gilt d(C) = w(C).
Zweiter Vorteil linearer Codes: Um den Minimalabstand und damit die
Fehlerkorrekturqualität von C zu bestimmen, muss man also nur das
Minimalgewicht ausrechnen; dazu braucht man höchstens |C| Schritte.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 44
Beweis des Lemmas
Beweis. Für jeden Code, der den Nullvektor enthält, gilt
d(C) = min{d(c, c') | c, c'  C, c  c'}  min{d(c, 0) | c  C, c  0} = w(C).
Noch z.z.: Es gibt ein Codewort c0 vom Gewicht d(C).
Seien c, c'  C mit d(c, c') = d(C). Dann gilt:
w(c–c') = d(c–c', 0) = d(c–c'‚ c'–c') = d(c, c') = d(C).
Da C linear ist, ist c0 := c–c'  C. Damit ist alles gezeigt.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 45
Dualer Code
Dritter Vorteil linearer Codes: Sie erlauben effizientes Decodieren.
Dazu müssen wir etwas ausholen.
Sei C  V ein Code. Der zu C duale Code C^ ist wie folgt definiert:
C^ := {v  V | cv = 0 für alle c  C};
dabei ist das innere Produkt cv der Vektoren c = (c1, . . ., cn) und
v = (v1, . . ., vn) erklärt durch
cv = c1v1 + c2v2 + . . . + cnvn.
Wenn cv = 0 ist, so sagt man auch, dass c und v orthogonal sind.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 46
Dimensionsformel für den dualen Code
1.4.4 Satz. Ist C ein linearer [n, k]-Code der Dimension k, so ist C^
ein linearer Code der Dimension n–k.
Beweis. Unabhängig davon, ob C linear ist oder nicht, ist C^ ein
Unterraum von V. Noch z.z.: dim C^ = n–k.
Dazu betrachten wir eine Generatormatrix G mit den Zeilen c1, . . , ck
von C. Dann gilt: C^ = {v  V | civ = 0, i = 1, . . ., k}, d.h. C^ besteht
aus den Lösungen v = (v1, . . ., vn)  V des homogenen Gleichungssystems mit der Koeffizientenmatrix G. Die Dimension des Lösungsraums ist gleich n–Rang(G). Da die Zeilen von G eine Basis von C
bilden, hat G den Rang k. Also gilt dim(C^) = n–k.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 47
Satz vom „Bidualcode“
1.4.5 Satz. Sei C ein linearer Code. Dann ist
C^^ = C.
Beweis. Zunächst zeigen wir C  C^^: Die Menge C^^ besteht aus all
den Vektoren, die orthogonal zu allen Vektoren aus C^ sind; dazu
gehören aber bestimmt die Vektoren aus C, da C^ ja die Menge
derjenigen Vektoren ist, die orthogonal zu jedem Vektor aus C sind.
Wenn wir die Dimensionsformel auf C^ anwenden, erhalten wir
dim(C^^) = n – dim(C^) = n – (n–k) = k = dim(C).
Zusammen folgt C^^ = C.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 48
Kontrollmatrix und Syndrom
Sei C  V ein linearer Code. Eine Matrix H, deren Zeilen eine Basis
des dualen Codes C^ bilden, heißt eine Kontrollmatrix von C.
Da C^ die Dimension n–k hat, ist H eine (n–k)n-Matrix.
Für das effiziente Decodieren ist der Begriff des „Syndroms“ wichtig.
Für jeden Vektor v  V definieren wir sein Syndrom als
s(v) := vHT,
wobei HT die zur Kontrollmatrix H transponierte Matrix ist.
Ein Syndrom ist also ein binärer Vektor der Länge n–k.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 49
Satz über die Kontrollmatrix
1.4.6 Satz. Ist C ein linearer Code mit Kontrollmatrix H, so gilt
C = {v  V | s(v) = 0}.
Beweis. Sei v  V beliebig. Dann gilt
s(v) = 0
 vHT = 0
 v ist orthogonal zu allen Vektoren einer Basis von C^
 v  C^^
 vC
wegen C^^ = C.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 50
Das Syndrom hängt nur von der Nebenklasse ab
1.4.7 Lemma. Sei H eine Kontrollmatrix eines linearen Codes C  V.
Für alle Vektoren v, w  V gilt
s(v) = s(w)  v + C = w + C.
Beweis. Sei v, w  V beliebig. Dann gilt
s(v) = s(w)
 vHT = wHT
 vHT – wHT = 0
 (v – w)HT = 0
 v – w  C (nach 1.4.6)
 v + C = w + C (Kriterium für Gleichheit von Nebenklassen). 
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 51
Eindeutigkeit der Nebenklassenanführer
Sei C  V ein linearer Code. Ein Vektor heißt Anführer einer Nebenklasse von C, wenn er unter allen Vektoren dieser Nebenklasse
minimales Gewicht hat.
Im allgemeinen sind Nebenklassenanführer nicht eindeutig bestimmt.
1.4.8 Satz. Sei C  V ein linearer t-fehlerkorrigierender Code. Dann:
(a) Jeder Vektor von V vom Gewicht  t ist Anführer einer Nebenklasse.
(b) Die Anführer von Nebenklassen, die einen Vektor vom Gewicht  t
enthalten, sind eindeutig bestimmt.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 52
Beweis
Wir beweisen (a) und (b) gemeinsam. Sei v ein Vektor vom Gewicht
 t. Betrachte einen beliebigen Vektor v'  v + C mit v'  v. Es ist zu
zeigen, dass v' mindestens das Gewicht t + 1 hat.
Da v und v' in derselben Nebenklasse von C sind, ist v – v'  C.
Da v  v' ist, gilt v – v'  0, also w(v – v') = d(v – v'‚ 0)  2t + 1 nach
Definition eines t-fehlerkorrigierenden Codes. Daraus folgt
2t + 1  w(v – v') = d(v – v',0) = d(v, v')
 d(v, 0) + d(0, v') = w(v) + w(v')  t + w(v'),
also w(v')  t + 1.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 53
Decodieralgorithmus
Der Empfänger empfängt einen Vektor x.
Wenn  t Fehler aufgetreten sind, ist x = c + e mit c  C und w(e)  t.
Wegen x – e = c  C, liegen x und e in der gleichen Nebenklasse.
Der Empfänger bestimmt zunächst die Nebenklasse, in der x liegt.
Dann bestimmt er den Anführer dieser Nebenklasse.
Da diese Nebenklasse einen Vektor mit Gewicht  t enthält (nämlich
e), ist ihr Anführer eindeutig bestimmt (nach 1.4.8), es ist e.
Schließlich berechnet der Empfänger das Codewort: x – e = c.
Problem: Bestimmung der Nebenklasse von x.
Verbesserung des Algorithmus: „Syndrom-Decodierung“.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 54
Syndrom-Decodierung
Sei C  V ein t-fehlerkorrigierender linearer Code.
Man erstellt eine Liste der Nebenklassenanführer und der zugehörigen
Syndrome. Für einen empfangenen Vektor x
– berechnet man das Syndrom s(x),
– sucht dies in der Liste der Syndrome,
– stellt den zugehörigen Nebenklassenanführer e fest und
– decodiert x zu x + e = c.
Bemerkung. Die Eindeutigkeit der Nebenklassenanführer garantiert,
dass mit der Syndrom-Decodierung richtig decodiert wird, wenn
höchstens t Fehler auftreten.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 55
Beispiel zur Syndrom-Decodierung
Wir betrachten den 1-fehlerkorrigierenden Beispielcode mit 16 Codewörtern (Folie 41).
 1 0 0 1 1 0 1


Er hat die Kontrollmatrix H =  0 1 0 1 0 1 1 .
 0 0 1 0 1 1 1


Die Nebenklassenanführer sind die Vektoren mit Gewicht  1, also die
Vektoren 0000000, 0000001, 0000010, . . .
Zu allen acht Nebenklassenanführern v bestimmen wir die Syndrome
s(v) = vHT und stellen folgende Liste auf.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 56
Beispiel (Fortsetzung)
Nebenklassenanführer
Syndrom
0000000
0000001
0000010
0000100
0001000
0010000
0100000
1000000
000
111
011
101
110
001
010
100
Wird z.B. x = 0010001 empfangen, so berechnet man s(x) = 110.
Danach bestimmt man aus der Liste den Fehlervektor e = 0001000; als
Codewort ergibt sich c = x + e = 0010001 + 0001000 = 0011001.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 57
Hamming-Codes
Sei r  N. Sei H eine binäre r×(2r – 1)-Matrix, deren Spalten sämtliche von 0 verschiedenen binären r-Tupel sind. Sei n := 2r – 1. Der
Hamming-Code der Länge n ist definiert als
Ham(r) := {c = (c1, . . ., cn)  {0, 1}n | cHT = o},
das heißt, genau diejenigen Vektoren c sind Codewörter von Ham(r),
für die cHT der Nullvektor der Länge r ist.
Beispiel: Der Code von Folie 41 ist der Hamming-Code Ham(3).
Da H den Rang r hat, hat Ham(r) die Dimension 2r – 1 – r.
Ham(r) ist also ein linearer [2r – 1, 2r – 1 – r]-Code.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 58
Hamming-Codes sind 1-fehlerkorrigierend
1.4.9 Satz. Die Hamming-Codes sind 1-fehlerkorrigierende Codes.
Beweis. Z.z: d(Ham(r))  3. Angenommen, Ham(r) enthielte einen
Vektor c vom Gewicht 1; c möge an der i-ten Stelle eine 1 haben.
Nach Definition von Ham(r) ist dann cHT = o. Dann muss die i-te
Spalte von H gleich Null sein: Widerspruch. Also ist d(Ham(r))  1.
Angenommen, Ham(r) enthielte einen Vektor, der nur an der i-ten und
an der j-ten Stelle eine 1 hat. Dann müsste die Summe der i-ten und
der j-ten Spalte von H gleich Null sein; also wäre die i-te Spalte
gleich der j-ten Spalte: Widerspruch. Also ist d(Ham(r))  2.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 59
Perfekte Codes
Hamming-Codes sind in gewissen Sinne die besten Codes, die es gibt,
nämlich die, die am dichtesten gepackt sind.
Ein t-fehlerkorrigierender Code C  V heißt perfekt, falls jeder Vektor
aus V einen Abstand  t zu (genau) einem Codewort hat.
Anders ausgedrückt: C ist perfekt, falls
 St(c) = V
cC
ist; wenn also die Kugeln mit Radius t um die Codewörter den
Vektorraum V lückenlos auffüllen.
Wir werden zeigen, dass die Hamming-Codes perfekt sind.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 60
Kugelpackungsgrenze
1.4.10 Lemma. Sei C  V = {0, 1}n ein 1-fehlerkorrigierender Code.
Dann gilt
n
2
|C| 
n +1
mit Gleichheit genau dann, wenn C perfekt ist.
1.4.11 Korollar. Jeder perfekte 1-fehlerkorrigierende Code C  {0, 1}n
hat eine Länge n der Form n = 2r – 1.
Beweis des Korollars. Aus |C|(n + 1) = 2n folgt, dass n + 1 ein Teiler
von 2n sein muss.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 61
Beweis des Lemmas
In einer Kugel S1(c) um ein Codewort c liegen c selbst und alle Vektoren, die Abstand 1 von c haben. Da c genau n Stellen hat, gibt
es genau n Vektoren vom Abstand 1 von c. Also ist |S1(c)| = 1 + n.
Da C ein 1-fehlerkorrigierender Code ist, sind die Kugeln S1(c) um
die Codewörter c paarweise disjunkt. Daher überdecken die Kugeln
vom Radius 1 um die Codewörter genau |C|(n + 1) Vektoren von V.
Da V genau 2n Vektoren hat, gilt offenbar |C|(n + 1)  2n.
Gleichheit gilt genau dann, wenn jeder Vektor aus V in einer Kugel
vom Radius 1 um ein Codewort liegt, also wenn C perfekt ist.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 62
Hamming-Codes sind perfekt
1.4.12 Satz. Die Hamming-Codes sind perfekte 1-fehlerkorrigierende
Codes.
Beweis. Da dim(Ham(r)) = 2r – 1 – r ist, gilt
r
2
|Ham(r)| = 2 1r .
Daraus ergibt sich mit n = 2r – 1:
r
r
2
2
1

r
r
|Ham(r)|(n + 1) = 2
 2 = 2 1 = 2n.
Nach 1.4.10 ist Ham(r) also perfekt.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 63
Syndrom-Decodierung mit Hamming-Codes
Nun ordnen wir die Spalten der Matrix H: Wir interpretieren die Spalten
von H als binäre Darstellung der Zahlen 1, . . ., 2r – 1 und ordnen die
Spalten so an, dass die i-te Spalte si die Zahl i darstellt.
1.4.13 Satz. Sei der Code Ham(r) mit der nach obiger Vorschrift
geordneten Matrix H konstruiert. Dann gilt:
Für jeden Vektor v  V\C ist s(v) die binäre Darstellung der Zahl i, so
dass v – ei  C ist. (Dabei ist ei der Vektor, der nur an der i-ten Stelle
eine Eins hat.)
M.a.W.: Das Syndrom eines mit Fehler behafteten Vektors gibt die
Stelle an, an welcher der Fehler auftrat.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 64
Decodieralgorithmus
Beweis. Da Ham(r) perfekt ist, hat jeder Vektor v  V\C die Form
v = c + ei für ein geeignetes Codewort c. Damit ergibt sich
s(v) = vHT = (c + ei)HT = cHT + eiHT = eiHT = i-te Spalte von H.
Da die i-te Spalte von H der Zahl i entspricht, kann damit der Fehler
lokalisiert werden.

Der Decodieralgorithmus ist damit äußerst einfach:
Für einen empfangenen Vektor x muss man nur s(x) berechnen,
dieses r-Tupel als Zahl i interpretieren und erhält das zugehörige
Codewort als ei + x = c.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 65
Erweiterter Hamming-Code
Aus einem Hamming-Code Ham(r) erhalten wir den erweiterten
Hamming-Code Ham(r)*, indem wir jedes Codewort aus Ham(r) um
eine Stelle so verlängern, dass die Gesamtzahl der Einsen in jedem
Codewort gerade ist.
00000000
11111111
Beispiel: Ham(3)* besteht
11100001
00011110
aus nebenstehenden 16
10011001
01100110
Codewörtern der Länge 8:
10000111
01111000
01010101
10101010
01001011
10110100
00110011
11001100
00101101
11010010
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 66
Eigenschaften des erweiterten Hamming-Codes
1.4.14 Satz. Ham(r)* ist ein linearer [2r, 2r – 1 – r]-Code mit Minimal-
abstand 4.
r
2
Beweis. 1.) Ham(r)* ist ein Unterraum von V* = GF ( 2) :
Seien c1*, c2*  Ham(r)*, und seien c1 und c2 die entsprechenden
Codewörter aus Ham(r). Da c1* + c2* in den ersten 2r – 1 Stellen mit
c1 + c2 übereinstimmt, müssen wir nur folgendes zeigen: die letzte
Stelle von c1* + c2* ist 1 wenn w(c1 + c2) ungerade ist und 0 sonst.
Wenn c1 + c2 ungerades Gewicht hat, dann können wir o.B.d.A.
annehmen, dass c1 ungerades Gewicht hat und c2 gerades Gewicht.
Daher ist die letzte Stelle von c1* gleich 1 und die letzte Stelle von c2*
gleich 0. Also ist die letzte Stelle von c1* + c2* gleich 1.
Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 67
Beweis (Fortsetzung)
Wenn c1 + c2 gerades Gewicht hat, dann haben entweder c1 und c2
beide gerades oder beide ungerades Gewicht. In jedem Fall haben c1*
und c2* den gleichen letzten Eintrag und daher ist die letzte Stelle von
c1* + c2* gleich 0. Also ist in beiden Fällen c1* + c2* ein Codewort und
damit ist Ham(r)* ein Vektorraum.
2.) Ham(r)* hat die gleiche Dimension wie Ham(r): Klar, denn beide
Vektorräume haben dieselbe Anzahl von Elementen.
3.) Ham(r)* hat das Minimalgewicht 4: Da w(Ham(r)) = 3 ist, muss
w(Ham(r)*)  3 sein. Wäre w(Ham(r)*) = 3, so gäbe es einen Vektor c*
aus Ham(r)* vom Gewicht 3; dies ist jedoch nicht möglich, da jeder
Vektor aus Ham(r)* gerades Gewicht hat.
Kapitel 1: Codierungstheorie

© Zschiegner
April 2002
Seite 68
Kontrollmatrix des erweiterten Hamming-Codes
1.4.15 Satz. Man erhält aus einer Kontrollmatrix H von Ham(r) eine
Kontrollmatrix H* von Ham(r)*, indem man
– jede Zeile von H durch eine Stelle ergänzt in der Null steht,
– eine zusätzliche Zeile aus lauter Einsen hinzufügt.
Beispiel: Ham(3)* hat die Kontrollmatrix
1

0
H* = 
0

1

Kapitel 1: Codierungstheorie
0 0 1 1 0 1 0

1 0 1 0 1 1 0
0 1 0 1 1 1 0

1 1 1 1 1 1 1 
© Zschiegner
April 2002
Seite 69
Beweis
Der zu Ham(r)* duale Code ist nach 1.4.4 ein [2r, r + 1]-Code; seine
Kontrollmatrix ist also eine (r + 1)×2r-Matrix. Z.z.: Die Zeilen von H*
sind linear unabhängig und Codewörter des zu Ham(r)* dualen Codes.
Da H eine Kontrollmatrix ist, sind ihre Zeilen linear unabhängig. Also
sind auch die ersten r Zeilen von H* linear unabhängig. Da in der
letzten Spalte von H* in den ersten r Zeilen 0 steht und in der letzten
Zeile 1, sind alle Zeilen von H* linear unabhängig.
Die Zeilen von H sind Codewörter des zu Ham(r) dualen Codes, also
sind nach Konstruktion auch die ersten r Zeilen von H* orthogonal zu
allen Codewörtern von Ham(r)*. Nach Definition hat jedes Codewort
von Ham(r)* gerades Gewicht; daher ist das Produkt eines Codeworts
mit der letzten Zeile von H* ebenfalls gleich Null.

Kapitel 1: Codierungstheorie
© Zschiegner
April 2002
Seite 70
Herunterladen