CSS-Codes
Klassische lineare Codes
Klassische fehlerkorrigierende Codes wurden erstmals in den 1940er Jahren untersucht, und seitdem sind viele verschiedene Codes bekannt. Die am häufigsten untersuchten und verwendeten Codes gehören zur Kategorie der sogenannten linearen Codes. Was das Wort „linear" in diesem Zusammenhang genau bedeutet, wird gleich klar werden. Einfach ausgedrückt sind lineare Codes Stabilisatorcodes, die jedoch klassischer Natur sind. CSS-Codes sind im Wesentlichen Paare klassischer linearer Codes, die zu einem Quantenfehlerkorrekturcode kombiniert werden. Um die folgende Diskussion zu verstehen, müssen wir einige grundlegende Eigenschaften klassischer linearer Codes kennen.
Sei das binäre Alphabet für diese gesamte Diskussion. Wenn wir von einem klassischen linearen Code sprechen, meinen wir eine nichtleere Menge binärer Zeichenketten der Länge (für eine positive ganze Zahl ), die genau eine grundlegende Eigenschaft erfüllen muss: Sind und binäre Zeichenketten in , so muss auch in liegen. Dabei bezeichnet das bitweise Exklusiv-ODER von und , wie es uns im Kurs „Grundlagen der Quantenalgorithmen" mehrfach begegnet ist.
Im Wesentlichen betrachten wir bei linearen klassischen Codes binäre Zeichenketten der Länge als -dimensionale Vektoren mit Einträgen aus und fordern, dass der Code selbst einen linearen Unterraum bildet. Statt der gewöhnlichen Vektoraddition über den reellen oder komplexen Zahlen verwenden wir dabei Addition modulo , also das Exklusiv-ODER. Das heißt: Sind und zwei Codewörter in , so muss auch modulo 2, also , ein Codewort in sein. Beachte insbesondere, dass dies auch dann gilt, wenn . Daraus folgt, dass die Nullzeichenkette enthalten muss, da das bitweise Exklusiv-ODER einer beliebigen Zeichenkette mit sich selbst die Nullzeichenkette ergibt.
Beispiel: der 3-Bit-Wiederholungscode
Der 3-Bit-Wiederholungscode ist ein Beispiel für einen klassischen linearen Code. Konkret gilt , und für die Linearitätsbedingung gibt es genau zwei mögliche Wahlen für und zwei für . Es ist einfach nachzuprüfen, dass bei allen vier möglichen Paaren das bitweise Exklusiv-ODER stets ein Codewort ergibt:
Beispiel: der -Hamming-Code
Hier ist ein weiteres Beispiel für einen klassischen linearen Code: der -Hamming-Code. Er war einer der allerersten entdeckten klassischen fehlerkorrigierenden Codes und besteht aus diesen 16 binären Zeichenketten der Länge 7. (Manchmal versteht man unter dem -Hamming-Code den Code mit den gespiegelten Zeichenketten, aber wir betrachten hier den Code mit den nachfolgend angezeigten Zeichenketten.)
Hinter der Auswahl dieser Zeichenketten steckt eine einfache Logik, die aber für diese Lektion zweitrangig ist und hier nicht erklärt wird. Es genügt festzuhalten, dass dies ein klassischer linearer Code ist: Das XOR beliebiger zwei dieser Zeichenketten ergibt stets eine weitere Zeichenkette im Code.
Die Notation (in einfachen eckigen Klammern) hat eine ähnliche Bedeutung wie die doppelte Eckklammer-Notation für Stabilisatorcodes aus der vorherigen Lektion, gilt hier aber für klassische lineare Codes. Konkret bedeutet dies: Codewörter haben Bits, es lassen sich Bits kodieren (da es Codewörter gibt), und es handelt sich um einen Code mit Distanz , d.h. zwei verschiedene Codewörter unterscheiden sich in mindestens Positionen — es müssen also mindestens Bits umgekippt werden, um ein Codewort in ein anderes umzuwandeln. Die Tatsache, dass es sich um einen Code mit Distanz handelt, impliziert, dass er bis zu einem Bit-Flip-Fehler korrigieren kann.
Beschreibung klassischer linearer Codes
Die gerade genannten Beispiele sind sehr einfache klassische lineare Codes, doch selbst beim -Hamming-Code wirkt die bloße Auflistung der Codewörter etwas rätselhaft. Es gibt bessere und effizientere Möglichkeiten, klassische lineare Codes zu beschreiben, darunter die folgenden zwei.
-
Generatoren. Eine Möglichkeit, einen klassischen linearen Code zu beschreiben, ist eine minimale Liste von Codewörtern, die den Code erzeugen, d.h. durch Auswahl aller möglichen Teilmengen dieser Codewörter und deren XOR-Verknüpfung erhält man den gesamten Code.
Genauer gesagt erzeugen die Zeichenketten den klassischen linearen Code , wenn
wobei für und für , und diese Liste heißt minimal, wenn das Entfernen einer der Zeichenketten einen kleineren Code erzeugt. Eine natürliche Sichtweise auf diese Beschreibung ist, dass eine Basis für als Unterraum bildet — wir betrachten Zeichenketten als Vektoren mit binärwertigen Einträgen und arbeiten in einem Vektorraum, in dem modulo gerechnet wird.
-
Paritätsprüfungen. Eine weitere natürliche Beschreibung eines klassischen linearen Codes sind Paritätsprüfungen — also eine minimale Liste binärer Zeichenketten, für die genau die Zeichenketten im Code sind, deren binäres Skalarprodukt mit jeder dieser Paritätsprüfzeichenketten null ist. (Ähnlich wie das bitweise Exklusiv-ODER ist das binäre Skalarprodukt mehrfach im Kurs „Grundlagen der Quantenalgorithmen" vorgekommen.)
Das heißt: Die Zeichenketten sind Paritätsprüfzeichenketten für den klassischen linearen Code , wenn
und diese Menge von Zeichenketten ist minimal, wenn das Entfernen einer davon zu einem größeren Code führt. Sie heißen Paritätsprüfzeichenketten, weil genau dann binäres Skalarprodukt null mit hat, wenn die Bits von an den Positionen, an denen eine 1 hat, eine gerade Parität aufweisen. Um zu prüfen, ob eine Zeichenkette im Code liegt, genügt es also, die Parität bestimmter Teilmengen der Bits von zu überprüfen.
Ein wichtiger Hinweis: Das binäre Skalarprodukt ist im formalen Sinne kein inneres Produkt. Insbesondere bedeutet ein binäres Skalarprodukt von null zwischen zwei Zeichenketten nicht, dass sie im üblichen Sinne orthogonal sind. So ist beispielsweise das binäre Skalarprodukt der Zeichenkette mit sich selbst null — eine Paritätsprüfzeichenkette eines klassischen linearen Codes kann also selbst im Code liegen.
Klassische lineare Codes über dem binären Alphabet enthalten stets eine Anzahl von Zeichenketten, die eine Potenz von ist — und für einen einzelnen klassischen linearen Code, der auf die beiden beschriebenen Weisen dargestellt wird, gilt stets . Konkret gilt: Haben wir eine minimale Menge von Generatoren, kodiert der Code Bits und hat genau Codewörter; haben wir eine minimale Menge von Paritätsprüfzeichenketten, gibt es Codewörter. Jeder Generator verdoppelt also die Größe des Coderaums, während jede Paritätsprüfzeichenkette die Größe halbiert.
Zum Beispiel ist der 3-Bit-Wiederholungscode ein linearer Code, der auf beide Arten beschrieben werden kann. Es gibt genau einen Generator, der funktioniert: . Alternativ lässt sich der Code durch zwei Paritätsprüfzeichenketten beschreiben, z.B. und — die aus früheren Diskussionen dieses Codes bekannt vorkommen dürften — oder auch und bzw. und . (Generatoren und Paritätsprüfzeichenketten sind für einen gegebenen klassischen linearen Code im Allgemeinen nicht eindeutig.)
Als zweites Beispiel betrachten wir den -Hamming-Code. Hier ist eine mögliche Liste von Generatoren:
Und hier ist eine mögliche Liste von Paritätsprüfungen für diesen Code:
Hier sehen wir übrigens, dass alle Paritätsprüfzeichenketten selbst im Code liegen.
Eine abschließende Bemerkung zu klassischen linearen Codes, die sie mit dem Stabilisatorformalismus verbindet: Paritätsprüfzeichenketten entsprechen Stabilisatorgeneratoren, die nur aus - und Identitäts-Pauli-Matrizen bestehen. Die Paritätsprüfzeichenketten und des 3-Bit-Wiederholungscodes entsprechen zum Beispiel genau den Stabilisatorgeneratoren und , was mit den Diskussionen über Pauli-Observablen aus der vorherigen Lektion übereinstimmt.
Definition der CSS-Codes
CSS-Codes sind Stabilisatorcodes, die durch die Kombination bestimmter Paare klassischer linearer Codes entstehen. Das funktioniert nicht für beliebige zwei klassische lineare Codes — die beiden Codes müssen eine bestimmte Beziehung zueinander haben. Dennoch eröffnet diese Konstruktion viele Möglichkeiten für Quantenfehlerkorrekturcodes, die zum Teil auf über 75 Jahre klassischer Codierungstheorie aufbauen.
Im Stabilisatorformalismus sind Stabilisatorgeneratoren, die nur - und Identitäts-Pauli-Matrizen enthalten, äquivalent zu Paritätsprüfungen, wie wir es gerade beim 3-Bit-Wiederholungscode gesehen haben. Als weiteres Beispiel betrachten wir die folgenden Paritätsprüfzeichenketten für den -Hamming-Code:
Diese Paritätsprüfzeichenketten entsprechen den folgenden Stabilisatorgeneratoren (ohne Tensorproduktsymbole), die man erhält, indem man jede durch und jede durch ersetzt. Das sind drei der sechs Stabilisatorgeneratoren des 7-Qubit-Steane-Codes.
Stabilisatorgeneratoren dieser Art — bei denen nur Pauli-- und Identitäts-Tensorfaktoren auftreten (- und -Pauli-Matrizen kommen nicht vor) — nennen wir -Stabilisatorgeneratoren.
Daneben gibt es Stabilisatorgeneratoren, bei denen nur - und Identitäts-Pauli-Matrizen als Tensorfaktoren auftreten. Solche Generatoren sind den -Stabilisatorgeneratoren analog, beschreiben aber Paritätsprüfungen in der -Basis statt der Standardbasis. Generatoren dieser Form heißen -Stabilisatorgeneratoren — hier sind weder - noch -Pauli-Matrizen erlaubt.
Betrachten wir als Beispiel die verbleibenden drei Stabilisatorgeneratoren des 7-Qubit-Steane-Codes:
Sie folgen exakt demselben Muster des -Hamming-Codes wie die -Stabilisatorgeneratoren, diesmal wird aber statt für jede eingesetzt. Allein aus diesen drei Stabilisatorgeneratoren erhält man einen Code, der die 16 hier gezeigten Zustände enthält — sie entstehen durch Anwendung von Hadamard-Operationen auf die Standardbasiszustände, die den Zeichenketten im -Hamming-Code entsprechen. (Natürlich enthält der Coderaum auch Linearkombinationen dieser Zustände.)
CSS-Codes lassen sich nun in sehr einfachen Worten definieren.
Das heißt, CSS-Codes sind Stabilisatorcodes, für die Stabilisatorgeneratoren existieren, in denen keine Pauli--Matrizen vorkommen und bei denen und nie im gleichen Stabilisatorgenerator auftreten.
Um das klarzustellen: Nach dieser Definition ist ein CSS-Code einer, bei dem es möglich ist, ausschließlich - und -Stabilisatorgeneratoren zu wählen — aber wir müssen im Hinterkopf behalten, dass es bei Stabilisatorcodes Freiheit in der Wahl der Generatoren gibt. Es wird also im Allgemeinen verschiedene Wahlen von Stabilisatorgeneratoren für einen CSS-Code geben, die keine - oder -Stabilisatorgeneratoren sind (zusätzlich zu mindestens einer Wahl, bei der sie es sind).
Hier ist ein sehr einfaches Beispiel für einen CSS-Code, der sowohl einen -Stabilisatorgenerator als auch einen -Stabilisatorgenerator enthält:
Es ist offensichtlich, dass dies ein CSS-Code ist: Der erste Stabilisatorgenerator ist ein -Stabilisatorgenerator und der zweite ein -Stabilisatorgenerator. Natürlich muss ein CSS-Code auch ein gültiger Stabilisatorcode sein — das heißt, die Stabilisatorgeneratoren müssen kommutieren, eine minimale Erzeugermenge bilden und mindestens einen Quantenzustandsvektor fixieren. Diese Anforderungen sind für diesen Code leicht zu überprüfen. Wie in der vorherigen Lektion erwähnt, ist der Coderaum dieses Codes der eindimensionale Raum, der vom Bell-Zustand aufgespannt wird. Dass beide Stabilisatorgeneratoren diesen Zustand fixieren, ergibt sich aus den folgenden zwei Ausdrücken für ein E-Bit sowie einer Interpretation dieser Stabilisatorgeneratoren als Paritätsprüfungen in der - und der -Basis.
Der 7-Qubit-Steane-Code ist ein weiteres Beispiel für einen CSS-Code.
Hier haben wir drei -Stabilisatorgeneratoren und drei -Stabilisatorgeneratoren, und wir haben bereits überprüft, dass es sich um einen gültigen Stabilisatorcode handelt.
Und der 9-Qubit-Shor-Code ist ein weiteres Beispiel:
Diesmal haben wir sechs -Stabilisatorgeneratoren und nur zwei -Stabilisatorgeneratoren. Das ist in Ordnung — zwischen den beiden Generatortypen muss keine Balance oder Symmetrie bestehen (obwohl das häufig der Fall ist).
Noch einmal sei betont, dass CSS-Codes gültige Stabilisatorcodes sein müssen; insbesondere muss jeder -Stabilisatorgenerator mit jedem -Stabilisatorgenerator kommutieren. Nicht jede Kombination von - und -Stabilisatorgeneratoren definiert also einen gültigen CSS-Code.
Fehlererkennung und -korrektur
Bezüglich der Fehlererkennung und -korrektur haben CSS-Codes im Allgemeinen eine ähnliche Eigenschaft wie der 9-Qubit-Shor-Code: - und -Fehler können vollständig unabhängig voneinander erkannt und korrigiert werden. Die -Stabilisatorgeneratoren beschreiben einen Code, der gegen Bit-Flips schützt, und die -Stabilisatorgeneratoren beschreiben einen Code, der unabhängig davon gegen Phasen-Flips schützt. Das funktioniert, weil -Stabilisatorgeneratoren zwangsläufig mit -Fehlern und -Korrekturen kommutieren — sie sind also für beide völlig unsichtbar — und dasselbe gilt entsprechend für -Stabilisatorgeneratoren, Fehler und Korrekturen.
Als Beispiel betrachten wir den 7-Qubit-Steane-Code:
Die Grundidee dieses Codes ist nun klar: Er ist ein -Hamming-Code für Bit-Flip-Fehler und ein -Hamming-Code für Phasen-Flip-Fehler. Dass die - und -Stabilisatorgeneratoren kommutieren, ist gewissermaßen ein glücklicher Umstand — wäre das nicht so, wäre es kein gültiger Stabilisatorcode. Tatsächlich gibt es jedoch viele bekannte Beispiele klassischer linearer Codes, die auf ähnliche Weise zu einem gültigen Stabilisatorcode führen.
Angenommen, wir haben einen CSS-Code, bei dem die -Stabilisatorgeneratoren die Korrektur von bis zu Bit-Flip-Fehlern ermöglichen und die -Stabilisatorgeneratoren die Korrektur von bis zu Phasen-Flip-Fehlern. Für den Steane-Code gilt beispielsweise und , da der -Hamming-Code einen Bit-Flip korrigieren kann. Durch die Diskretisierung von Fehlern folgt daraus, dass dieser CSS-Code beliebige Fehler auf einer Anzahl von Qubits bis zum Minimum von und korrigieren kann. Denn beim Messen des Syndroms kollabiert ein beliebiger Fehler auf dieser Anzahl von Qubits probabilistisch in eine Kombination von -Fehlern, -Fehlern oder beidem — und dann werden -Fehler und -Fehler unabhängig voneinander erkannt und korrigiert.
Zusammengefasst: Haben wir zwei klassische lineare Codes (oder zwei Kopien eines einzelnen klassischen linearen Codes), die kompatibel sind — also - und -Stabilisatorgeneratoren definieren, die kommutieren — so erbt der CSS-Code, den wir durch ihre Kombination erhalten, die Fehlerkorrektur-Eigenschaften dieser beiden Codes im beschriebenen Sinne.
Dabei gibt es jedoch einen Preis zu zahlen: Wir können nicht so viele Qubits kodieren wie Bits in den beiden klassischen Codes. Das liegt daran, dass die Gesamtzahl der Stabilisatorgeneratoren des CSS-Codes die Summe der Paritätsprüfungen der beiden klassischen linearen Codes ist, und jeder Stabilisatorgenerator halbiert die Dimension des Coderaums. Zum Beispiel erlaubt der -Hamming-Code die Kodierung von vier klassischen Bits (da er nur drei Paritätsprüfzeichenketten hat), während der 7-Qubit-Steane-Code nur ein Qubit kodiert (da er sechs Stabilisatorgeneratoren hat).
Coderäume von CSS-Codes
Zum Abschluss unserer Diskussion über CSS-Codes betrachten wir die Coderäume dieser Codes. Das gibt uns Gelegenheit, die Beziehung, die zwischen zwei klassischen linearen Codes gelten muss, damit sie kompatibel sind und zu einem CSS-Code kombiniert werden können, genauer zu untersuchen.
Betrachte einen beliebigen CSS-Code auf Qubits und sei die Menge der -Bit-Paritätsprüfzeichenketten, die den -Stabilisatorgeneratoren dieses Codes entsprechen. Der klassische lineare Code, der allein durch die -Stabilisatorgeneratoren beschrieben wird und den wir nennen, hat dann folgende Form:
Mit anderen Worten enthält der klassische lineare Code genau die Zeichenketten, deren binäres Skalarprodukt mit jeder der Paritätsprüfzeichenketten null ist.
Entsprechend sei die Menge der -Bit-Paritätsprüfzeichenketten, die den -Stabilisatorgeneratoren unseres Codes entsprechen. Der klassische lineare Code der -Stabilisatorgeneratoren hat dann diese Form:
Die -Stabilisatorgeneratoren allein beschreiben also einen Code, der diesem ähnlich ist, aber in der -Basis statt der Standardbasis.
Nun führen wir zwei neue klassische lineare Codes ein, die aus denselben Zeichenketten und abgeleitet werden, diesmal aber als Generatoren statt als Paritätsprüfzeichenketten. Wir erhalten die folgenden zwei Codes:
Diese werden als duale Codes der zuvor definierten Codes bezeichnet: ist der duale Code von und ist der duale Code von . Es mag im Moment nicht offensichtlich sein, warum diese dualen Codes relevant sind, aber sie spielen aus mehreren Gründen eine wichtige Rolle, darunter die zwei in den folgenden Absätzen erläuterten.
Erstens lassen sich die Bedingungen, die zwei klassische lineare Codes und erfüllen müssen, um kompatibel zu sein (also zu einem CSS-Code kombiniert werden zu können), mithilfe der dualen Codes einfach beschreiben. Konkret muss gelten: , was äquivalent ist zu . Mit anderen Worten: Der duale Code enthält die Zeichenketten der -Stabilisatorgeneratoren, und ihre Enthaltensein in ist äquivalent dazu, dass das binäre Skalarprodukt jeder dieser Zeichenketten mit denen der -Stabilisatorgeneratoren null ist. Das wiederum ist äquivalent dazu, dass jeder -Stabilisatorgenerator mit jedem -Stabilisatorgenerator kommutiert. Alternativ kann man durch Vertauschen der Rollen von - und -Stabilisatorgeneratoren und Ausgehen von der Inklusion zur gleichen Schlussfolgerung gelangen.
Zweitens lassen sich mithilfe der dualen Codes die Coderäume eines gegebenen CSS-Codes leicht beschreiben. Insbesondere wird der Coderaum von Vektoren der folgenden Form aufgespannt:
Mit anderen Worten sind diese Vektoren gleichgewichtete Superpositionen über die Zeichenketten des dualen Codes des den -Stabilisatorgeneratoren entsprechenden Codes, verschoben (d.h. bitweise XOR-verknüpft) mit Zeichenketten aus dem Code der -Stabilisatorgeneratoren. Zur Klarstellung: Verschiedene Wahlen der Verschiebung — dargestellt durch die Zeichenkette in diesem Ausdruck — können zum selben Vektor führen. Diese Zustände sind also nicht alle verschieden, aber zusammen spannen sie den gesamten Coderaum auf.
Hier ist eine intuitive Erklärung, warum solche Vektoren sowohl im Coderaum liegen als auch ihn aufspannen. Betrachte den -Qubit-Standardbasiszustand für eine beliebige -Bit-Zeichenkette und projiziere diesen Zustand auf den Coderaum. Sei also die Projektion auf den Coderaum unseres CSS-Codes und betrachte den Vektor . Es gibt zwei Fälle:
-
Fall 1: Das bedeutet, dass jeder -Stabilisatorgenerator unseres CSS-Codes auf trivial wirkt. Die -Stabilisatorgeneratoren hingegen flippen jeweils einige Bits von . Insbesondere transformiert für jeden Generator von der entsprechende -Stabilisatorgenerator in . Indem wir die Projektion als Mittelwert über die Elemente des Stabilisators charakterisieren (wie in der vorherigen Lektion gesehen), erhalten wir folgende Formel:
-
Fall 2: Das bedeutet, dass mindestens eine der den -Stabilisatorgeneratoren entsprechenden Paritätsprüfungen fehlschlägt, d.h. ist Eigenvektor zum Eigenwert mindestens eines -Stabilisatorgenerators. Der Coderaum des CSS-Codes ist der Schnitt der -Eigenräume der Stabilisatorgeneratoren. Als -Eigenvektor mindestens eines -Stabilisatorgenerators ist daher orthogonal zum Coderaum:
Wenn wir nun über alle -Bit-Zeichenketten laufen, die Fälle mit verwerfen und die verbleibenden normieren, erhalten wir die zuvor beschriebenen Vektoren — was zeigt, dass sie den Coderaum aufspannen.
Mithilfe der Symmetrie zwischen - und -Stabilisatorgeneratoren lässt sich der Coderaum auch auf eine ähnliche, aber andere Art beschreiben. Er wird von Vektoren der folgenden Form aufgespannt:
Im Wesentlichen wurden und in jedem Auftreten vertauscht — aber wir müssen auch die Standardbasis gegen die -Basis tauschen, weshalb die Hadamard-Operationen hinzukommen.
Als Beispiel betrachten wir den 7-Qubit-Steane-Code. Die Paritätsprüfzeichenketten für die - und -Stabilisatorgeneratoren sind dieselben: , und . Die Codes und sind daher gleich; beide sind der -Hamming-Code.
Auch die dualen Codes und sind daher gleich. Wir haben drei Generatoren und erhalten acht Zeichenketten:
Alle diese Zeichenketten sind im -Hamming-Code enthalten, sodass die CSS-Bedingung erfüllt ist: bzw. äquivalent .
Da die Hälfte aller Zeichenketten in enthält, gibt es nur zwei verschiedene Vektoren , die durch Wahl von entstehen. Das ist zu erwarten, da der 7-Qubit-Steane-Code einen zweidimensionalen Coderaum hat. Wir können die beiden so erhaltenen Zustände nutzen, um die logischen Zustände und wie folgt zu kodieren:
Wie üblich ist diese Wahl nicht zwingend — wir können den Coderaum nach Belieben zur Kodierung von Qubits verwenden. Diese Kodierung ist jedoch konsistent mit dem Beispiel eines Kodierungsschaltkreises für den 7-Qubit-Steane-Code aus der vorherigen Lektion.