Nachdem wir in den letzten drei Kapiteln einen Code rein als Untermenge $C \subseteq \cube^n$ betrachtet haben und die Fragen der Codierung und Fehlererkennung hinangestellt haben, kehren wir nun zu der ursprünglichen Sichtweise zurück, dass nämlich der Code durch die Codierungsfunktion

\begin{align*} E : \cube^k \rightarrow \cube^n \end{align*}

gegeben ist. Wir werden nun die Menge $\cube$ als Köper mit zwei Elementen $\F_2$ auffassen, mit Multiplikation $\cdot$ und Addition modulo 2. Dann sind $\F^k$ und $\F^n$ Vektorräume über $\F$, d.h. wir können Vektoren addieren, z.B.

\begin{align*} \begin{bmatrix} 0\\1\\1\\1 \end{bmatrix} + \begin{bmatrix}1\\0\\1\\0\end{bmatrix} = \begin{bmatrix}1\\1\\0\\1\end{bmatrix} \end{align*}

Wir können nun den Fall untersuchen, dass die Codierungsfunktion $E$ linear ist.

Definition (Linearer Code). Ein linearer Code ist gegeben durch eine lineare Abbildung $E: \F_2^k \rightarrow \F_2^n$. Dies ist ein Code der Blocklänge $n$. Die Dimension des Codes ist $k$. Die Rate des Codes ist $k/n$. Wir können die Abbildung $E$ durch eine Matrix $G \in \F_2^{n \times k}$ mit $n$ Zeilen und $k$ Spalten darstellen, die Generatormatrix des Codes. Wir nennen $E$ einen $[n,k]$-Code.

Erinnern wir uns an einen ganz einfachen Parity-Check-Code $E : \cube^k \rightarrow \cube^n$ mit $k=n-1$: wir hängen dem Urwort $\x$ die seine Parität an, also $(x_1\dots x_{k}) \mapsto (x_1, \dots, x_k, x_1 \oplus \dots \oplus x_k)$. Dies ist ein linearer Code mit der Generatormatrix

\begin{align*} \begin{bmatrix} 1 & & \\ & 1 & \\ & & \ddots\\ & & & 1\\ 1 & 1 & \dots & 1 \end{bmatrix} \end{align*}

Dieser Code ist ein $[n,n-1]$-Code mit Abstand 2.

Übungsaufgabe Zeigen Sie: wenn $E: \F_2^k \rightarrow \F_2^n$ ein linearer Code ist, dann ist der Abstand $\Delta(E)$ gleich

\begin{align*} \min_{\x \in \F_2^k \setminus \{\zero\}} |E(\x)| \ , \end{align*}

wobei $|\y|$ die Anzahl der Stellen in $\y$ ist, die nicht $0$ sind.

Generatormatrix in systematischer Form

Der obige Parity-Check-Code, also der $[n,n-1]$-Code mit Abstand 2, hatte die schöne Eigenschaft, dass jedes Codeword $E(\x)$ aus dem Urwort $\x$ besteht, gefolgt von Parity-Check-Bits. Das ist nicht immer so. Betrachten wir beispielsweise den $[7,4]$-Code mit der Generatormatrix

\begin{align*} G := \begin{bmatrix} 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 \end{bmatrix} \end{align*}

Sie werden das Urwort $\x \in \F_2^4$ in seinem Bild $G\x$ nicht unmittelbar wiedererkennen:

\begin{align*} \begin{bmatrix} 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 \end{bmatrix} \cdot \begin{bmatrix}x_1 \\ x_2 \\ x_3 \\ x_4\end{bmatrix} & = \begin{bmatrix} x_1 + x_2 + x_3 \\ x_1 + x_2 \\ x_2 + x_3 \\ x_4 \\ x_3 + x_4 \\ x_2 \\ x_1 + x_3 + x_4 \end{bmatrix} \end{align*}

Wenn Sie allerdings mit dem Gaussschen Eliminierungsverfahren vertraut sind, wird es Sie nicht wundern, dass man die Generatormatrix immer so umformen kann, dass das Urwort ein Präfix des Codewortes ist. Wir demonstrieren dies am Beispiel der obigen Matrix. Konkret wollen wir erreichen, dass die obersten vier Zeilen die Identitätsmatrix bilden. Die Gausssche Eliminierung lässt sich über dem Körper $\F_2$ viel besser demonstrieren als über $\Q$, da man nicht mit unhandlichen Brüchen hantieren muss.

Bezeichnen wir die vier Spalten der obigen Matrix mit $\mathbf{c}_1$, $\mathbf{c}_2$, $\mathbf{c}_3$ und $\mathbf{c}_4$. Die Matrix $G$ können wir also als $[\mathbf{c_1}|\mathbf{c_2}|\mathbf{c_3}|\mathbf{c_4}]$ schreiben. In dieser Notation wird aus dem Urwort $\x = [x_1, x_2, x_3, x_4]^T$ das Codewort $x_1 \mathbf{c}_1 + x_2 \mathbf{c}_2 + x_3 \mathbf{c}_3 + x_4 \mathbf{c}_4$, also

\begin{align*} E : \begin{bmatrix}x_1 \\ x_2 \\ x_3 \\ x_4 \end{bmatrix} \mapsto x_1 \mathbf{c}_1 + x_2 \mathbf{c}_2 + x_3 \mathbf{c}_3 + x_4 \mathbf{c}_4 \end{align*}

Ich möchte nun $G$ so umformen, dass die obersten vier Zeilen der Matrix die Identitätsmatrix $I_4$ bilden. Als erstes arbeite ich an der ersten Zeile und möchte sie von derzeit $[1, 1, 1, 0]$ nach $[1, 0,0,0]$ umbauen. Dafür addieren wir die erste Spalte zur zweiten, ersetzen also $G = [\mathbf{c_1}|\mathbf{c_2}|\mathbf{c_3}|\mathbf{c_4}]$ durch $G_1 := [\mathbf{c_1}|\mathbf{c_1} + \mathbf{c_2}|\mathbf{c_3}|\mathbf{c_4}]$. Aber Moment: jetzt haben wir eine neue Generatormatrix. Haben wir auch einen neuen Code? Nun ja, wenn wir die Codierungsfunktion betrachten, dann ist $\x \mapsto G_1 \x$ natürlich eine andere Funktion als $\x \mapsto G \x$. Wenn wir allerdings den Code als Untermenge $C = \img(G) \subseteq \F_2^7$ betrachten, dann ändert dieser sich nicht:

Behauptung. $\img(G) = \img(G_1)$.

Ich könnte natürlich sagen "das ist grundlegende lineare Algebra", aber vielleicht ist es nicht schlecht, es sich noch einmal ins Gedächtnis zu rufen, warum das so ist.

Beweis. Als erstes zeigen wir $\img(G) \subseteq \img(G_1)$. Sei $\y \in \img(G)$, also $\y = G \x$ für ein $\x \in \F_2^4$. Setzen wir $\mathbf{u} := [x_1 - x_2, x_2, x_3, x_4]^T$. Dann gilt

\begin{align*} G_1 \mathbf{u} = G_1 \begin{bmatrix}x_1- x_2 \\ x_2 \\ x_3\\ x_4\end{bmatrix} & = (x_1-x_2) \mathbf{c_1} + x_2 (\mathbf{c_1} + \mathbf{c_2}) + x_3 \mathbf{c_3} + x_4 \mathbf{c_4}\\ & = x_1 \mathbf{c_1} + x_2 \mathbf{c_2} + x_3 \mathbf{c_3} + x_4 \mathbf{c_4}\\ & = G \x \ , \end{align*}

und somit ist $\y = G\x = G_1 \mathbf{u}$ auch in $\img(G_1)$. Für die Inklusion $\img(G_1) \subseteq \img(G)$ nehmen wir $\y = G_1 \x$ und rechnen das einfach aus:

\begin{align*} \y = G_1 \x = [\mathbf{c_1}|\mathbf{c_1} + \mathbf{c_2}|\mathbf{c_3}|\mathbf{c_4}] \begin{bmatrix}x_1 \\ x_2 \\ x_3 \\ x_4 \end{bmatrix} = x_1 \mathbf{c_1} + x_2 \mathbf{c}_1 + x_2 \mathbf{c}_2 + x_3 \mathbf{c_3} + x_4 \mathbf{c_4} = [\mathbf{c_1}|\mathbf{c_2}|\mathbf{c_3}|\mathbf{c_4}] \cdot \begin{bmatrix}x_1 + x_2\\x_2\\x_3\\x_4\end{bmatrix} \end{align*} und somit gilt $\y \in \img(G)$. Dies zeigt also, dass $\img(G) = \img(G_1)$ ist. \(\square\)

Obwohl wir so getan haben, am konkreten Beispiel von $G \in \F_2^{7 \times 4}$ zu arbeiten, wird der Leser bestimmt bestätigen können, dass diese Methode ganz allgemein funktioniert: wenn wir $G_1$ aus $G$ bilden, indem wir eine Spalte zu einer anderen addieren, dann gilt $\img(G) = \img(G_1)$.

\begin{align*}G = \begin{bmatrix} 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 \end{bmatrix} \longrightarrow \begin{bmatrix} 1 & 1+1 & 1 & 0 \\ 1 & 1+1 & 0 & 0 \\ 0 & 0+1 & 1 & 0 \\ 0 & 0+0 & 0 & 1 \\ 0 & 0+0 & 1 & 1 \\ 0 & 0+1 & 0 & 0 \\ 1 & 1+0 & 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} =: G_1 \end{align*}

Wir entfernen nun die 1 an der dritten Stelle der ersten Zeile, indem wir die erste Spalte auf zur dritten addieren.

\begin{align*} G_1 = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} \rightarrow \begin{bmatrix} 1 & 0 & 1+1 & 0 \\ 1 & 0 & 1+0 & 0 \\ 0 & 1 & 0+1 & 0 \\ 0 & 0 & 0+0 & 1 \\ 0 & 0 & 0+1 & 1 \\ 0 & 1 & 0+0 & 0 \\ 1 & 1 & 1+1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 \end{bmatrix} =: G_2 \end{align*}

Wir haben also die erste Zeile erfolgreich in $[1, 0, 0, 0]$ umgeformt. Als nächstes wollen wir die zweite Zeile in $[0, 1, 0, 0]$ umformen. Hier haben wir allerdings ein Problem: die ersten beiden Zeilen haben an der zweiten Stelle eine 0. Wir kriegen da also keine 1 hin. Wir könnten nun unser Ziel ändern und die dritte Zeile zu $[0,1,0,0]$ machen. Dann würden wir oben zwar nicht die Identitätsmatrix hinkriegen, aber so etwas ähnliches (eine Permutationsmatrix). Übersichtlicher wird es allerdings, wenn wir für Position $(2,2)$ eine 1 "beschaffen", in dem wir zum Beispiel Zeile 2 und 3 vertauschen.

\begin{align*} G_2 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ \textcolor{red} 1 & \textcolor{red}0 & \textcolor{red}1 & \textcolor{red}0 \\ \textcolor{blue}0 & \textcolor{blue}1 & \textcolor{blue}1 &\textcolor{blue} 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 \end{bmatrix} \mapsto \begin{bmatrix} 1 & 0 & 0 & 0 \\ \textcolor{blue}0 & \textcolor{blue}1 & \textcolor{blue}1 &\textcolor{blue} 0 \\ \textcolor{red} 1 & \textcolor{red}0 & \textcolor{red}1 & \textcolor{red}0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 \end{bmatrix} =: G_3 \end{align*}

Jetzt haben wir an Position (2,2) eine 1 und können fortfahren. Aber halt: ändert dieser Schritt, also das Vertauschen zweier Zeilen, unseren Code? In der Tat ja, allerdings nicht wesentlich. Definieren wir $\pi_{(23)}: \F_2^7 \rightarrow F_2^7$ als

\begin{align*} \pi_{(23)}: \begin{bmatrix}y_1 \\ y_2 \\ y_3 \\ y_4 \\ y_5 \\ y_6 \\ y_7\end{bmatrix} \mapsto \begin{bmatrix}y_1 \\ y_3 \\ y_2 \\ y_4 \\ y_5 \\ y_6 \\ y_7\end{bmatrix} \ , \end{align*}

also die Abbildung, die die zweite und die dritte Koordinate vertauscht, und definieren wir für eine Menge $U \subseteq \F_2^7$ die Menge $\pi_{(23)}(U) := \{\pi_{(23)}(\mathbf{u}) \ | \ \mathbf{u} \in U \}$, dann gilt

\begin{align*} \img(G_2) = \pi_{(23)}(\img(G_3)) \ . \end{align*}

Wir erhalten als Bild $\img(G_3)$ also einen neuen Code $C'$, der im allgemeinen nicht identisch zu $C = \img(G)= \img(G_1) = \img(G_2)$ ist, sondern aus diesem durch Vertauschen zweier Koordinaten hervorgeht. Es sollte offensichtlich sein, dass $|C'| = |C|$ und $\Delta(C) = \Delta(C')$ gilt und ganz allgemein alle interessanten kombinatorischen Eigenschaften erhalten bleiben. Machen wir weiter:

\begin{align*} G_3 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 \end{bmatrix} \stackrel{\textnormal{zweite auf dritte addieren}}{\rightarrow} \begin{bmatrix} 1 & 0 & 0+0 & 0 \\ 0 & 1 & 1+1 & 0 \\ 1 & 0 & 0+1 & 0 \\ 0 & 0 & 0+0 & 1 \\ 0 & 0 & 0+1 & 1 \\ 0 & 1 & 1+0 & 0 \\ 1 & 1 & 1+0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} =: G_4 \end{align*}

Indem wir die zweite Spalte auf die dritte addieren, haben wir die 1 un der zweiten Zeile an dritter Stelle eliminiert. Oberhalb davon, also in der ersten Zeile, geschieht nichts, weil diese Einträge ja bereits 0 geworden sind. Wir haben also die Sicherheit, dass getane Arbeit in den oberen Zeilen nicht wieder zerstört wird. Mit der dritten Zeile nun haben wir Glück: sie hat eine 1 an der dritten Stelle. Wir müssen also keine Koordinaten vertauschen. Wir eliminieren die 1 an Stelle 1 der dritten Zeile, indem wir die dritte Spalte auf die erste addieren:

\begin{align*} G_4 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} \rightarrow \begin{bmatrix} 1 + 0 & 0 & 0 & 0 \\ 0 + 0 & 1 & 0 & 0 \\ 1 + 1 & 0 & 1 & 0 \\ 0 + 0 & 0 & 0 & 1 \\ 0 + 1 & 0 & 1 & 1 \\ 0 + 1 & 1 & 1 & 0 \\ 1 + 1 & 1 & 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \end{bmatrix} =: G_5 \end{align*}

Durch reines Glück ist die vierte Zeile bereits $[0,0,0,1]$ und wir sind nun fertig. Unsere Matrix hat die Form $\begin{bmatrix}I_4 \\ \hline P \end{bmatrix}$ wie gewünscht.

Gausssche Umformungsschritte. Rekapitulieren wir kurz, welche Umformungsschritte wir angewandt haben:

  1. Spaltenaddition. Wir addieren eine Spalte zu einer anderen. Dadurch ändert sich $\img(G)$ nicht.
  2. Zeilen vertauschen. Wir vertauschen Zeile $i$ mit Zeile $j$. Dadurch ändert sich $\img(G)$, es wird nämlich zu $\pi_{(ij)}(\img(G))$, aber alle interessanten kombinatorischen Eigenschaften (insbesondere Mindestabstand $\Delta$) bleiben erhalten.

Im allgemeinen Fall werden wir nicht unbedingt über $\F_2$ arbeiten, sondern über einem allgemeinen Körper $\mathbb{K}$, meist einem endlichen. Für diesen Fall brauchen wir noch eine dritte Umformungsoperation:

  1. Skalarmultiplikation. Wir ersetzen eine Spalte $\mathbf{c}$ durch $\lambda \mathbf{c}$ für ein $\lambda \in \mathbb{K} \setminus \{0\}$.

Für $\F_2$ ist der dritte Schritt trivial, weil es neben $0$ nur ein Körperelement gibt, die 1.

Können wir steckenbleiben? Wie allgemein ist obiges Verfahren? Kann man steckenbleiben? Wir beschränken uns hier wieder auf den Fall $\F_2$, da der von der Notation her einfacher ist aber alle essentiellen Argumente enthält.

Im allgemeinen haben wir bereits durch die Umformungsschritte erreicht, dass Zeilen $1$ bis $i-1$ die Einheitszeilenvektoren $\mathbf{e}_1, \dots, \mathbf{e}_{i-1}$ sind. Wenn es nun eine weitere Zeile $\mathbf{u}$ gibt, die an der $i$-ten Stelle eine $1$ hat, also $u_i =1$, dann können wir in einem ersten Schritt per Vertauschung sicherstellen, dass dies Zeile $i$ ist. In einem zweiten Schritt entfernen wir alle anderen Einser von Zeile $i$: für jedes $j \ne i$ mit $u_j = 1$ ersetzen wir Spalte $\mathbf{c}_j$ durch $\mathbf{c}_i + \mathbf{c}_j$. Dadurch wird Stelle $j$ von $\mathbf{u}$ zu 0.

Nun ist also die $i$-te Zeile von $\mathbf{u}$ zu $\mathbf{e}_i$, dem Zeileneinheitsvektor, geworden. Was ist oberhalb von Zeile $i$ geschehen? Wir haben Spalte $\mathbf{c}_i$ auf viele andere Spalten addiert. Da aber Zeilen 1 bis $i-1$ die Einheitszeilenvektoren $\mathbf{e}_1, \dots, \mathbf{e}_{i-1}$ sind, sind die oberen $i-1$ Einträge von $\mathbf{c}_i$ alle $0$. Die Additionsschritte haben also in den ersten $i-1$ Zeilen keinen Effekt.

Wir sehen: wir können nur steckenbleiben, wenn es keine Zeile $\mathbf{u}$ gibt mit $u_i = 1$. Das heißt aber, dass $\mathbf{c}_i = \mathbf{0}$. In Fachsprache: die Spalten von $G$ sind nicht linear unabhängig; $G$ hat nicht vollen Spaltenrang. Konkret heißt das, dass

\begin{align*} G \cdot \x & = G\cdot \begin{bmatrix}x_1 \\ \vdots \\ x_i \\ \vdots\\ x_n\end{bmatrix} = x_1 \mathbf{c_1} + \dots + x_i \mathbf{c_i} + \dots + x_n \mathbf{c_n} \\ & = x_1 \mathbf{c_1} + \dots + (x_i+1) \mathbf{c_i} + \dots + x_n \mathbf{c_n} \tag{weil $\mathbf{c}_i = \zero$} \\ & = G \cdot \z \ , \end{align*}

wobei sich $\x$ und $\z$ nur an Stelle $i$ unterscheiden. Die Abbildung $\x \mapsto G \cdot \x$ ist also nicht einmal injektiv, insbesondere ist der Minimalabstand des Codes $0$! Wir sehen: solange $G \in \F_2^{n \times k}$ vollen Spaltenrang $k$ hat, kommt das Umformungsverfahren zu einem Ende und liefert uns eine neue Generatormatrix in der Form $\begin{bmatrix}I_k \\ \hline M\end{bmatrix}$.

Wir können also jede Generatormatrix $G \in \F_2^{n \times k}$ umformen in eine Matrix $G' = \begin{bmatrix}I_k \\ M\end{bmatrix}$, so dass sich $\img(G)$ und $\img(G')$ nur in der Anordnung ihrer Koordinaten unterscheiden.

Theorem (Generatormatrix in systematischer Form). Sei $G \in \F_2^{n \times k}$ einer Generatormatrix mit Spaltenrang $k$. Dann gibt es $G' = \begin{bmatrix}I_k \\ M\end{bmatrix}$ und eine Permutation $\pi: [n] \rightarrow [n]$ mit

\begin{align*} \img(G') = \pi(\img(G)) \ , \end{align*}

wobei $A \subseteq \F_2^n$ die Notation $\pi(A) := \{(a_{\pi(1)}a_{\pi(2)}\dots a_{\pi(n)}) \ | \ \mathbf{a} \in A\}$ verwenden.

Insbesondere gilt $\Delta(G') = \Delta(G)$ und $R(G) = R(G')$, das heißt, in allen Parametern, die uns im Moment interessieren, sind $G$ und $G'$ gleichwertig.

Fehlererkennung: die Parity-Check-Matrix

Wenn nun $G$ in systematischer Form vorliegt, können wir für ein gegebenes $\x \in \F_2$ auch direkt überprüfen, ob $\x \in \img(G)$ liegt, ob also $\x$ ein Codewort ist:

def checkLinearCodeWord$\left(\x = [x_1 \\ \dots \\ x_n]^T,G = \begin{bmatrix}I_k \\ M\end{bmatrix}\right)$: // prüft, ob $\x$ ein Codewort ist
  1. $\mathbf{u} := [x_1, \dots, x_k]$, $\mathbf{v} = [x_{k+1},\dots, x_n]$
  2. if $M \cdot \mathbf{u} = \mathbf{v}$ return true else return false

Wenn $\x$ ein gültiges Codewort ist, dann sind die ersten $k$ Koordinaten das Urwort $\mathbf{u}$ (da $G$ in systematischer Form vorliegt). Wir erhalten die "richtigen" weiteren $n-k$ Koordinaten durch $M \cdot \mathbf{u}$. Der Algorithmus muss also nur prüfen, ob diese identisch mit den tatsächlich vorliegenden Koordinaten $x_{k+1} \dots x_{n}$ sind. Der Algorithmus prüft also, ob $M \cdot \mathbf{u} - \mathbf{v} = \mathbf{0}$ ist. Da $\x = \begin{bmatrix}\mathbf{u}\\ \mathbf{v}\end{bmatrix}$ gilt, können wir das kompakt wie folgt schreiben:

\begin{align*} [M | -I_{(n-k) \times (n-k)}] \x = \zero \end{align*}

Die Matrix $P := [M | -I_{(n-k) \times (n-k)}] \in F_2^{(n-k) \times n}$ ist die Parity-Check-Matrix des Codes.

Theorem Sei $G \in F_2^{n \times k}$ die Generatormatrix eines Codes und habe $G$ vollen Rang $k$. Dann gibt es eine Matrix $P \in F_2^{(n-k)\times n}$, die Parity-Check-Matrix mit der Eigenschaft

\begin{align*} \x \in \img(G) \Longleftrightarrow P \cdot \x = \zero \in F_2^{n-k} \end{align*}

für alle $\x \in \F_2^n$.

Wir erhalten die Parity-Check-Matrix, indem wir $G$ in systematische Form $G' = \begin{bmatrix}I_k \\ M\end{bmatrix}$ bringen. Die Parity-Check-Matrix ist dann $P' = [M | -I_{(n-k)\times(n-k)}]$. Eine Parity-Check-Matrix $P$ für den Code $\img(G)$ erhalten wir dann, indem wir Spalten von $P'$ entsprechend permutieren, die Vertauschungen also rückgängig machen.