Stabilizer-Codes
Jetzt werden wir Stabilizer-Codes im Allgemeinen definieren. Wir besprechen auch einige ihrer grundlegenden Eigenschaften und wie sie funktionieren – darunter, wie Zustände kodiert werden und wie Fehler mit diesen Codes erkannt und korrigiert werden.
Definition von Stabilizer-Codes
Ein -Qubit-Stabilizer-Code wird durch eine Liste von -Qubit-Pauli-Operationen beschrieben. Diese Operationen werden in diesem Kontext als Stabilizer-Generatoren bezeichnet und müssen die folgenden drei Eigenschaften erfüllen.
-
Die Stabilizer-Generatoren kommutieren paarweise miteinander.
-
Die Stabilizer-Generatoren bilden ein minimales Erzeugendensystem.
-
Mindestens ein Quantenzustandsvektor wird von allen Stabilizer-Generatoren fixiert.
(Es ist nicht offensichtlich, dass die Existenz eines Quantenzustandsvektors , der von allen Stabilizer-Generatoren fixiert wird – also –, äquivalent zu ist. Tatsächlich ist das aber der Fall, und wir werden später in der Lektion sehen, warum.)
Wenn wir eine solche Liste haben, ist der Code-Raum, der durch diese Stabilizer-Generatoren definiert wird, der Unterraum , der alle -Qubit-Quantenzustandsvektoren enthält, die von allen Stabilizer-Generatoren fixiert werden.
Quantenzustandsvektoren in diesem Unterraum sind genau diejenigen, die als gültige Kodierungen von Quantenzuständen betrachtet werden können. Den eigentlichen Kodierungsprozess besprechen wir später.
Der Stabilizer des Codes, der durch die Stabilizer-Generatoren definiert wird, ist die von diesen Operationen erzeugte Menge:
Eine natürliche Sichtweise auf einen Stabilizer-Code ist es, die Stabilizer-Generatoren als Observablen zu betrachten und die Messergebnisse dieser Observablen gemeinsam als Fehlersyndrom zu interpretieren. Gültige Kodierungen sind -Qubit-Quantenzustandsvektoren, bei denen die Messergebnisse als Eigenwerte garantiert alle sind. Jedes andere Syndrom, bei dem mindestens ein auftritt, zeigt an, dass ein Fehler erkannt wurde.
Wir schauen uns gleich mehrere Beispiele an, aber zunächst noch einige Anmerkungen zu den drei Bedingungen für Stabilizer-Generatoren.
Die erste Bedingung ist naheliegend, wenn man die Stabilizer-Generatoren als Observablen interpretiert: Sie impliziert, dass die Reihenfolge der Messungen keine Rolle spielt – die Observablen kommutieren, also kommutieren auch die Messungen. Das legt bestimmte algebraische Einschränkungen für Stabilizer-Codes fest, die für ihre Funktionsweise wichtig sind.
Die zweite Bedingung verlangt, dass die Stabilizer-Generatoren ein minimales Erzeugendensystem bilden, d. h. das Entfernen eines beliebigen Generators würde zu einem kleineren Stabilizer führen. Genau genommen ist diese Bedingung für die operative Funktionsweise von Stabilizer-Codes nicht wirklich wesentlich – und wie wir in der nächsten Lektion sehen werden, macht es manchmal Sinn, über Mengen von Stabilizer-Generatoren nachzudenken, die diese Bedingung tatsächlich nicht erfüllen. Für die Analyse von Stabilizer-Codes und die Erklärung ihrer Eigenschaften werden wir diese Bedingung jedoch voraussetzen. Kurz gesagt stellt sie sicher, dass jede Observable, die wir zur Ermittlung des Fehlersyndroms messen, neue Information über mögliche Fehler liefert – und nicht redundant ist und Ergebnisse produziert, die sich aus den anderen Stabilizer-Generator-Messungen ableiten lassen.
Die dritte Bedingung verlangt, dass mindestens ein nichttrivialer Vektor von allen Stabilizer-Generatoren fixiert wird, was äquivalent dazu ist, dass nicht im Stabilizer enthalten ist. Die Notwendigkeit dieser Bedingung ergibt sich daraus, dass es tatsächlich möglich ist, ein minimales Erzeugendensystem von -Qubit-Pauli-Operationen zu wählen, die alle miteinander kommutieren, ohne dass irgendeiner von ihnen alle nichttrivialen Vektoren fixiert. Wir sind nicht an „Codes" interessiert, für die es keine gültigen Kodierungen gibt, daher schließen wir diese Möglichkeit durch diese Bedingung aus.
Beispiele
Hier sind einige Beispiele für Stabilizer-Codes mit kleinen Werten von In der nächsten Lektion werden wir weitere Beispiele sehen, auch solche, bei denen viel größer sein kann.
3-Bit-Wiederholungscode
Der 3-Bit-Wiederholungscode ist ein Beispiel für einen Stabilizer-Code, bei dem die Stabilizer-Generatoren und sind.
Wir können leicht überprüfen, dass diese beiden Stabilizer-Generatoren die erforderlichen Bedingungen erfüllen. Erstens kommutieren die beiden Stabilizer-Generatoren und miteinander.
Zweitens haben wir ein minimales Erzeugendensystem (in diesem Fall recht trivial).
Und drittens wissen wir bereits, dass und sowie jede Linearkombination dieser Vektoren von und fixiert werden. Alternativ können wir dies mit der äquivalenten Bedingung aus der Definition schlussfolgern.
Diese Bedingungen können bei komplizierteren Stabilizer-Codes viel schwieriger zu überprüfen sein.
Modifizierter 3-Bit-Wiederholungscode
In der vorherigen Lektion haben wir gesehen, dass sich der 3-Bit-Wiederholungscode so modifizieren lässt, dass er gegen Phasenfehler statt gegen Bitfehler schützt. Als Stabilizer-Code lässt sich dieser neue Code einfach beschreiben: seine Stabilizer-Generatoren sind und
Diesmal repräsentieren die Stabilizer-Generatoren -Observablen statt -Observablen und sind daher im Wesentlichen Paritätsprüfungen in der Plus-/Minus-Basis statt in der Standardbasis. Die drei erforderlichen Bedingungen für die Stabilizer-Generatoren lassen sich ähnlich wie beim gewöhnlichen 3-Bit-Wiederholungscode leicht überprüfen.
9-Qubit-Shor-Code
Hier ist der 9-Qubit-Shor-Code, der ebenfalls ein Stabilizer-Code ist, ausgedrückt durch Stabilizer-Generatoren.
In diesem Fall haben wir im Wesentlichen drei Kopien des 3-Bit-Wiederholungscodes, eine für jeden der drei Dreibit-Blöcke, sowie die letzten beiden Stabilizer-Generatoren, die an den Circuit zur Phasenfehlererkennung dieses Codes erinnern.
Eine alternative Betrachtungsweise der letzten beiden Stabilizer-Generatoren ist, dass sie dieselbe Form wie beim 3-Bit-Wiederholungscode für Phasenfehler haben, mit dem Unterschied, dass für eingesetzt wird. Das entspricht der Tatsache, dass einer -Operation auf logischen Qubits entspricht, die mit dem 3-Bit-Wiederholungscode kodiert wurden.
Bevor wir zu anderen Beispielen übergehen, sei darauf hingewiesen, dass Tensorproduktzeichen bei der Beschreibung von Stabilizer-Codes durch Listen von Stabilizer-Generatoren häufig weggelassen werden, da dies das Lesen erleichtert und die Muster besser erkennbar macht. Zum Beispiel sehen die oben genannten Stabilizer-Generatoren für den 9-Qubit-Shor-Code ohne explizit geschriebene Tensorproduktzeichen so aus:
7-Qubit-Steane-Code
Hier ist ein weiteres Beispiel für einen Stabilizer-Code, bekannt als 7-Qubit-Steane-Code. Er hat bemerkenswerte Eigenschaften, und wir werden im Laufe der verbleibenden Lektionen des Kurses immer wieder auf diesen Code zurückkommen.
Zunächst stellen wir einfach fest, dass dies ein gültiger Stabilizer-Code ist. Die ersten drei Stabilizer-Generatoren kommutieren offensichtlich miteinander, da mit sich selbst kommutiert und die Identität mit allem kommutiert; ähnliches gilt für die letzten drei Stabilizer-Generatoren. Es bleibt zu überprüfen, dass je ein -Stabilizer-Generator (d. h. einer der ersten drei) und ein -Stabilizer-Generator (d. h. einer der letzten drei) miteinander kommutieren. Dazu kann man alle 9 möglichen Paarungen durchgehen. In all diesen Fällen tritt ein - und ein -Pauli-Matrix-Paar stets an denselben Positionen eine gerade Anzahl von Malen auf, sodass die beiden Generatoren kommutieren – genau wie und kommutieren. Dies ist auch ein minimales Erzeugendensystem und definiert einen nichttrivialen Code-Raum; diese Tatsachen können von dir selbst nachvollzogen werden.
Der 7-Qubit-Steane-Code ähnelt dem 9-Qubit-Shor-Code darin, dass er ein einzelnes Qubit kodiert und beliebige Fehler auf einem Qubit korrigieren kann, benötigt dafür aber nur 7 statt 9 Qubits.
5-Qubit-Code
Sieben ist nicht die kleinste Anzahl von Qubits, die nötig ist, um ein Qubit zu kodieren und es gegen einen beliebigen Fehler auf einem Qubit zu schützen – hier ist ein Stabilizer-Code, der das mit nur 5 Qubits erreicht.
Dieser Code wird üblicherweise als der 5-Qubit-Code bezeichnet. Er stellt die kleinstmögliche Qubit-Anzahl in einem Quantenfehlerkorrekturcode dar, der die Korrektur eines beliebigen Einzelqubit-Fehlers erlaubt.
Eindimensionale Stabilizer-Codes
Hier ist ein weiteres Beispiel für einen Stabilizer-Code, der allerdings keine Qubits kodiert: der Code-Raum ist eindimensional. Es handelt sich dennoch um einen gültigen Stabilizer-Code gemäß der Definition.
Konkret ist der Code-Raum der eindimensionale Raum, der durch ein E-Bit aufgespannt wird.
Hier ist ein verwandtes Beispiel für einen Stabilizer-Code, dessen Code-Raum der eindimensionale Raum ist, der durch einen GHZ-Zustand aufgespannt wird.
Dimension des Code-Raums
Angenommen, wir haben einen Stabilizer-Code, der durch -Qubit-Stabilizer-Generatoren beschrieben wird. Die wohl naheliegendste Frage zu diesem Code ist: „Wie viele Qubits kodiert er?"
Diese Frage hat eine einfache Antwort. Wenn die -Qubit-Stabilizer-Generatoren die drei Anforderungen der Definition erfüllen (d. h. die Stabilizer-Generatoren kommutieren paarweise, es handelt sich um ein minimales Erzeugendensystem, und der Code-Raum ist nichtleer), dann hat der Code-Raum dieses Stabilizer-Codes die Dimension , sodass Qubits mit diesem Code kodiert werden können.
Intuitiv haben wir Qubits für die Kodierung zur Verfügung, und jeder Stabilizer-Generator „nimmt gewissermaßen ein Qubit weg" in Bezug auf die Anzahl der kodierbaren Qubits. Hinweis: Dies betrifft nicht, welche oder wie viele Fehler erkannt oder korrigiert werden können – es ist lediglich eine Aussage über die Dimension des Code-Raums.
Für den 3-Bit-Wiederholungscode und die modifizierte Version für Phasenfehler gilt zum Beispiel: Qubits und Stabilizer-Generatoren, also kann jeweils 1 Qubit kodiert werden. Als weiteres Beispiel betrachte den 5-Qubit-Code: 5 Qubits und 4 Stabilizer-Generatoren, also hat der Code-Raum wieder Dimension 2, d. h. ein Qubit kann kodiert werden. Als letztes Beispiel: Der Code, dessen Stabilizer-Generatoren und sind, hat einen eindimensionalen Code-Raum, aufgespannt durch den Zustand – was mit Qubits und Stabilizer-Generatoren übereinstimmt.
Schauen wir uns nun an, wie sich diese Tatsache beweisen lässt. Der erste Schritt besteht darin, festzustellen, dass – da die Stabilizer-Generatoren kommutieren und jede Pauli-Operation ihre eigene Inverse ist – jedes Element des Stabilizers als Produkt ausgedrückt werden kann:
wobei Äquivalent dazu wird jedes Element des Stabilizers durch Multiplikation einer Teilmenge der Stabilizer-Generatoren erhalten. Tatsächlich kann jedes Stabilizer-Element auf genau eine solche Weise ausgedrückt werden, was aus der Bedingung folgt, dass ein minimales Erzeugendensystem ist.
Als nächstes definieren wir als die Projektion auf den Raum der -Eigenvektoren von für jedes Diese Projektionen lassen sich durch Mittelung der entsprechenden Pauli-Operationen mit der Identitätsoperation gewinnen:
Der Code-Raum ist der Unterraum aller Vektoren, die von allen Stabilizer-Generatoren – bzw. äquivalent von allen Projektionen – fixiert werden.
Da die Stabilizer-Generatoren alle miteinander kommutieren, müssen auch die Projektionen miteinander kommutieren. Das erlaubt uns, einen Satz aus der linearen Algebra zu nutzen: Das Produkt dieser Projektionen ist die Projektion auf den Schnitt der Unterräume der einzelnen Projektionen. Mit anderen Worten: Das Produkt ist die Projektion auf den Code-Raum
Wir können das Produkt nun mit den Formeln für diese Projektionen ausschreiben und erhalten folgende Darstellung:
Die Projektion auf den Code-Raum eines Stabilizer-Codes ist also als Matrix gleich dem Durchschnitt über alle Elemente des Stabilizers dieses Codes.
Abschließend können wir die Dimension des Code-Raums berechnen, indem wir nutzen, dass die Dimension eines Unterraums gleich der Spur der Projektion auf diesen Unterraum ist. Die Dimension des Code-Raums ist daher:
Diesen Ausdruck können wir mithilfe einiger grundlegender Fakten auswerten.
-
Es gilt und daher
-
Für muss das Produkt gleich mal einer Pauli-Operation sein – aber wir können nicht erhalten, da dies der Minimalität der Menge widersprechen würde, und ist durch die dritte Bedingung ausgeschlossen. Da die Spur jeder Nicht-Identitäts-Pauli-Operation null ist, ergibt sich:
Die Dimension des Code-Raums ist daher wie behauptet :
Nebenbei bemerkt: Wir können nun einsehen, dass die Annahme, dass nicht im Stabilizer enthalten ist, impliziert, dass der Code-Raum mindestens einen Quantenzustandsvektor enthalten muss. Wie wir gerade gezeigt haben, impliziert diese Annahme nämlich, dass der Code-Raum die Dimension hat, die nicht null sein kann. Die Umkehrung ist trivial: Wenn im Stabilizer enthalten ist, kann der Code-Raum keine Quantenzustandsvektoren enthalten, da kein nichttrivialer Vektor von dieser Operation fixiert wird.
Clifford-Operationen und Kodierungen
Als nächstes besprechen wir kurz, wie Qubits mit Stabilizer-Codes kodiert werden können. Dazu müssen wir zunächst Clifford-Operationen einführen.
Clifford-Operationen
Clifford-Operationen sind unitäre Operationen auf beliebig vielen Qubits, die durch Quantencircuits mit einem eingeschränkten Gate-Satz implementiert werden können:
- Hadamard-Gates
- -Gates
- CNOT-Gates
Beachte, dass -Gates nicht enthalten sind, ebenso wenig wie Toffoli-Gates und Fredkin-Gates. Diese Gates sind nicht nur nicht in der Liste enthalten – es ist tatsächlich nicht möglich, sie mit den aufgeführten Gates zu implementieren; sie sind keine Clifford-Operationen. Pauli-Operationen hingegen sind Clifford-Operationen, da sie durch Sequenzen von Hadamard- und -Gates implementiert werden können.
Das ist eine einfache Definition von Clifford-Operationen, erklärt aber nicht, warum sie so definiert werden oder was diese spezielle Sammlung von Gates auszeichnet. Der eigentliche Grund für diese Definition ist, dass – bis auf globale Phasenfaktoren – die Clifford-Operationen genau diejenigen unitären Operationen sind, die Pauli-Operationen stets durch Konjugation in Pauli-Operationen überführen. Genauer gesagt: Eine -Qubit-unitäre Operation ist äquivalent zu einer Clifford-Operation bis auf einen Phasenfaktor genau dann, wenn für jede -Qubit-Pauli-Operation gilt:
für eine -Qubit-Pauli-Operation
(Man beachte, dass für nicht möglich ist, wenn unitär und und Pauli-Operationen sind. Das folgt daraus, dass die Matrix auf der linken Seite der Gleichung sowohl unitär als auch hermitesch ist, und und die einzigen Werte für sind, bei denen die rechte Seite ebenfalls unitär und hermitesch ist.)
Es ist straightforward, die beschriebene Konjugationseigenschaft zu überprüfen, wenn ein Hadamard-, - oder CNOT-Gate ist. Insbesondere gilt dies einfach für Hadamard-Gates:
und für -Gates:
Für CNOT-Gates gibt es 15 Nicht-Identitäts-Pauli-Operationen auf zwei Qubits zu überprüfen. Natürlich können diese einzeln geprüft werden – die Beziehungen zwischen CNOT-Gates und - und -Gates (in Circuit-Form) aus der vorherigen Lektion zusammen mit den Multiplikationsregeln für Pauli-Matrizen bieten jedoch eine Abkürzung zur gleichen Schlussfolgerung.
Sobald wir wissen, dass diese Konjugationseigenschaft für Hadamard-, - und CNOT-Gates gilt, können wir sofort schlussfolgern, dass sie auch für Circuits aus diesen Gates gilt – d. h. für alle Clifford-Operationen.
Es ist schwieriger zu beweisen, dass die Beziehung auch in die andere Richtung gilt: dass eine unitäre Operation , die die Konjugationseigenschaft für Pauli-Operationen erfüllt, (bis auf eine globale Phase) nur mit Hadamard-, - und CNOT-Gates implementiert werden kann. Das wird in dieser Lektion nicht erklärt, ist aber wahr.
Clifford-Operationen sind nicht universell für Quantencomputing; im Gegensatz zu universellen Gate-Sätzen ist es mit Clifford-Operationen nicht möglich, beliebige unitäre Operationen mit beliebiger Genauigkeit zu approximieren. Tatsächlich gibt es für einen gegebenen Wert von nur endlich viele -Qubit-Clifford-Operationen (bis auf Phasenfaktoren). Clifford-Operationen auf Standardbasiszuständen, gefolgt von Standardbasismessungen, erlauben keine Berechnungen, die über klassische Algorithmen hinausgehen – denn wir können Berechnungen dieser Form effizient klassisch simulieren. Diese Tatsache ist als Gottesman-Knill-Theorem bekannt.
Kodierer für Stabilizer-Codes
Ein Stabilizer-Code definiert einen Code-Raum einer bestimmten Dimension, und wir haben die Freiheit, diesen Code-Raum nach Belieben zu nutzen – nichts zwingt uns, Qubits auf eine bestimmte Weise in diesen Code-Raum zu kodieren. Es ist jedoch stets möglich, eine Clifford-Operation als Kodierer zu verwenden, wenn wir das möchten. Genauer gesagt: Für jeden Stabilizer-Code, der die Kodierung von Qubits in Qubits erlaubt, gibt es eine -Qubit-Clifford-Operation derart, dass für jeden -Qubit-Quantenzustandsvektor gilt:
ist ein Quantenzustandsvektor im Code-Raum unseres Codes, den wir als Kodierung von interpretieren können.
Das ist vorteilhaft, da Clifford-Operationen im Vergleich zu beliebigen unitären Operationen relativ einfach sind, und es gibt Möglichkeiten, ihre Implementierung mit Techniken zu optimieren, die denen aus dem Beweis des Gottesman-Knill-Theorems ähneln. Daher müssen Circuits zur Kodierung von Zuständen mit Stabilizer-Codes nie besonders groß sein. Insbesondere kann eine Kodierung für einen -Qubit-Stabilizer-Code stets mit einer Clifford-Operation durchgeführt werden, die Gates benötigt. Das liegt daran, dass jede Clifford-Operation auf Qubits durch einen Circuit dieser Größe implementiert werden kann.
Hier ist zum Beispiel ein Kodierer für den 7-Qubit-Steane-Code. Es handelt sich tatsächlich um eine Clifford-Operation, und in diesem Fall werden nicht einmal -Gates benötigt.
Fehlererkennung
Für einen -Qubit-Stabilizer-Code, der durch Stabilizer-Generatoren beschrieben wird, funktioniert die Fehlererkennung folgendermaßen.
Zur Fehlererkennung werden alle Stabilizer-Generatoren als Observablen gemessen. Es gibt Stabilizer-Generatoren und damit Messergebnisse, jedes entweder oder (oder ein binärer Wert, wenn wir mit und mit assoziieren). Wir interpretieren die Ergebnisse gemeinsam als Vektor oder Zeichenkette – als Syndrom. Das Syndrom zeigt an, dass kein Fehler erkannt wurde, während mindestens ein im Syndrom einen erkannten Fehler signalisiert.
Angenommen, ist eine -Qubit-Pauli-Operation, die einen hypothetischen Fehler darstellt. (Wir betrachten hier nur Pauli-Operationen als Fehler, da die Diskretisierung von Fehlern für beliebige Stabilizer-Codes genauso funktioniert wie für den 9-Qubit-Shor-Code.) Es gibt drei Fälle, die bestimmen, ob als Fehler erkannt wird.
Fälle der Fehlererkennung
-
Die Operation ist proportional zu einem Element des Stabilizers.
In diesem Fall muss mit jedem Stabilizer-Generator kommutieren, sodass wir das Syndrom erhalten. Das bedeutet, dass nicht als Fehler erkannt wird.
-
Die Operation ist nicht proportional zu einem Element des Stabilizers, kommutiert aber trotzdem mit jedem Stabilizer-Generator.
Dies ist ein Fehler, der Vektoren im Code-Raum auf nichttriviale Weise verändert. Da jedoch mit jedem Stabilizer-Generator kommutiert, ist das Syndrom , sodass vom Code nicht erkannt wird.
-
Die Operation antikommutiert mit mindestens einem der Stabilizer-Generatoren.
Das Syndrom unterscheidet sich von , sodass der Fehler vom Code erkannt wird.
Im ersten Fall ist der Fehler kein Problem, da diese Operation nichts an den Vektoren im Code-Raum ändert, außer möglicherweise eine irrelevante globale Phase einzufügen: für jeden kodierten Zustand Im Wesentlichen handelt es sich dabei nicht um einen echten Fehler – jede nichttriviale Wirkung von findet außerhalb des Code-Raums statt – daher ist es gut, dass nicht als Fehler erkannt wird, denn es muss nichts dagegen unternommen werden.
Der zweite Fall ist intuitiv gesehen der problematische. Die Antikommutation eines Fehlers mit einem Stabilizer-Generator führt dazu, dass ein im Syndrom erscheint und einen Fehler signalisiert – aber das passiert in diesem Fall nicht. Wir haben also einen Fehler , der Vektoren im Code-Raum auf nichttriviale Weise verändert, aber vom Code unerkannt bleibt. Beim 3-Bit-Wiederholungscode fällt zum Beispiel die Operation in diese Kategorie.
Die Tatsache, dass ein solcher Fehler einige Vektoren im Code-Raum auf nichttriviale Weise ändern muss, lässt sich wie folgt begründen. Aus der Annahme, dass mit kommutiert, aber nicht proportional zu einem Stabilizer-Element ist, lässt sich schlussfolgern, dass wir einen neuen, gültigen Stabilizer-Code erhalten würden, wenn wir zusammen mit als Stabilizer-Generator hinzufügen. Der Code-Raum dieses neuen Codes hat jedoch nur die halbe Dimension des ursprünglichen Code-Raums, woraus wir schließen können, dass die Wirkung von auf den ursprünglichen Code-Raum nicht proportional zur Identitätsoperation sein kann.
Im letzten der drei Fälle – wenn der Fehler mit mindestens einem Stabilizer-Generator antikommutiert – enthält das Syndrom mindestens ein , was anzeigt, dass etwas nicht stimmt. Wie bereits besprochen, identifiziert das Syndrom im Allgemeinen nicht eindeutig, sodass für jedes Syndrom eine Korrekturopertion gewählt werden muss, die den Fehler möglicherweise korrigiert oder auch nicht. Wir besprechen diesen Schritt gleich im letzten Teil der Lektion.
Distanz eines Stabilizer-Codes
Als terminologische Anmerkung: Wenn wir von der Distanz eines Stabilizer-Codes sprechen, meinen wir das minimale Gewicht einer Pauli-Operation , die in die zweite Kategorie oben fällt – d. h. die den Code-Raum auf nichttriviale Weise verändert, aber vom Code nicht erkannt wird. Wenn gesagt wird, dass ein Stabilizer-Code ein -Stabilizer-Code ist (mit doppelten eckigen Klammern), bedeutet das:
- Kodierungen haben eine Länge von Qubits,
- der Code erlaubt die Kodierung von Qubits, und
- die Distanz des Codes ist
Als Beispiel betrachten wir den 7-Qubit-Steane-Code. Hier sind die Stabilizer-Generatoren für diesen Code:
Dieser Code hat Distanz 3, was sich wie folgt begründen lässt.
Betrachte zunächst eine beliebige Pauli-Operation mit Gewicht höchstens 2, die mit allen sechs Stabilizer-Generatoren kommutiert. Wir werden zeigen, dass die Identitätsoperation sein muss – die (wie immer) ein Element des Stabilizers ist. Das beweist, dass die Distanz des Codes strikt größer als 2 ist. Angenommen, hat die Form
wobei und möglicherweise Nicht-Identitäts-Pauli-Matrizen sind. Das ist nur ein Fall, und das folgende Argument muss für alle anderen möglichen Positionen der Nicht-Identitäts-Pauli-Matrizen in den Tensorfaktoren von wiederholt werden – aber das Argument ist für alle möglichen Positionen im Wesentlichen dasselbe.
Die Operation kommutiert mit allen sechs Stabilizer-Generatoren, also insbesondere mit diesen beiden:
Der Tensorfaktor in unserem Fehler wird dabei durch die Identitätsmatrix in beiden Stabilizer-Generatoren abgedeckt (deshalb wurden sie ausgewählt). Da in den fünf rechtesten Positionen von Identitätsmatrizen stehen, schlussfolgern wir, dass mit und kommutieren muss – andernfalls würde mit einem der beiden Generatoren antikommutieren. Die einzige Pauli-Matrix, die mit und kommutiert, ist jedoch die Identitätsmatrix, also
Da wir das nun wissen, können wir zwei weitere Stabilizer-Generatoren wählen, die in der zweiten Position von links ein bzw. ein haben, und ziehen einen ähnlichen Schluss: Damit ist die Identitätsoperation.
Es gibt also keine Möglichkeit, dass ein Fehler mit Gewicht höchstens 2 von diesem Code unerkannt bleibt – es sei denn, der Fehler ist die Identitätsoperation (die im Stabilizer ist und daher kein echter Fehler ist). Andererseits gibt es Gewicht-3-Pauli-Operationen, die mit allen sechs Stabilizer-Generatoren kommutieren, aber nicht proportional zu Stabilizer-Elementen sind, etwa und Damit ist bewiesen, dass dieser Code die Distanz 3 hat.
Fehlerkorrektur
Das letzte Thema dieser Lektion ist die Korrektur von Fehlern bei Stabilizer-Codes. Wir gehen davon aus, dass wir einen Stabilizer-Code haben, der durch -Qubit-Stabilizer-Generatoren beschrieben wird.
Die -Qubit-Pauli-Operationen als Fehler, die kodierte Zustände beeinflussen könnten, werden nach dem von ihnen erzeugten Syndrom in gleich große Gruppen eingeteilt. Es gibt verschiedene Syndrome und Pauli-Operationen, also gibt es Pauli-Operationen, die jedes Syndrom erzeugen. Jede dieser Operationen könnte für das entsprechende Syndrom verantwortlich sein.
Unter den Pauli-Operationen, die dasselbe Syndrom erzeugen, gibt es einige, die als äquivalent betrachtet werden sollten. Insbesondere sind zwei Pauli-Operationen, deren Produkt proportional zu einem Stabilizer-Element ist, effektiv äquivalent als Fehler.
Anders ausgedrückt: Wenn wir eine Korrekturopertion anwenden, um einen Fehler zu korrigieren, ist die Korrektur erfolgreich, solange die Zusammensetzung proportional zu einem Stabilizer-Element ist. Da der Stabilizer Elemente hat, korrigiert jede Korrekturopertion genau verschiedene Pauli-Fehler. Das lässt inäquivalente Klassen von Pauli-Operationen, die als Fehler betrachtet werden, die mit jedem möglichen Syndrom konsistent sind.
Das bedeutet, dass wir nicht jeden von einem Stabilizer-Code erkannten Fehler korrigieren können – es sei denn, (in diesem Fall haben wir einen trivialen, eindimensionalen Code-Raum). Stattdessen müssen wir für jedes Syndrom genau eine Korrekturopertion wählen, in der Hoffnung, nur eine Klasse von äquivalenten Fehlern zu korrigieren, die dieses Syndrom erzeugen.
Eine naheliegende Strategie für die Wahl der Korrekturopertion für jedes Syndrom ist, die Pauli-Operation mit dem niedrigsten Gewicht zu wählen, die als Fehler dieses Syndrom erzeugt. Es kann tatsächlich mehrere Operationen geben, die für den niedrigstgewichtigen Fehler zu einem gegebenen Syndrom gleichwertig sind – in diesem Fall kann eine beliebige davon gewählt werden. Die Idee ist, dass Pauli-Operationen mit niedrigerem Gewicht wahrscheinlichere Erklärungen für das gemessene Syndrom darstellen. Bei manchen Rauschmodellen ist das möglicherweise nicht der Fall, und eine alternative Strategie besteht darin, den wahrscheinlichsten Fehler zu berechnen, der das gegebene Syndrom verursacht, basierend auf dem gewählten Rauschmodell. Für diese Lektion halten wir es jedoch einfach und betrachten nur Korrekturen mit niedrigstem Gewicht.
Bei einem Stabilizer-Code mit Distanz erlaubt diese Strategie stets die Korrektur von Fehlern mit einem Gewicht, das strikt kleiner als die Hälfte von ist – also höchstens Das zeigt beispielsweise, dass der 7-Qubit-Steane-Code jeden Gewicht-1-Pauli-Fehler korrigieren kann, und durch die Diskretisierung von Fehlern bedeutet das, dass der Steane-Code einen beliebigen Fehler auf einem Qubit korrigieren kann.
Um zu verstehen, wie das funktioniert, betrachten wir das Diagramm unten. Der linke Kreis stellt alle Pauli-Operationen dar, die das Syndrom erzeugen – das Syndrom, das anzeigt, dass keine Fehler aufgetreten sind und alles in Ordnung ist. Darunter befinden sich Elemente des Stabilizers (bzw. genauer gesagt Operationen, die proportional zu Stabilizer-Elementen sind) sowie nichttriviale Fehler, die den Code-Raum verändern, aber vom Code nicht erkannt werden. Nach der Definition der Distanz muss jede Pauli-Operation in dieser Kategorie Gewicht mindestens haben, da als das minimale Gewicht dieser Operationen definiert ist.
Der rechte Kreis stellt die Pauli-Operationen dar, die ein anderes Syndrom erzeugen, einschließlich eines Fehlers mit Gewicht strikt kleiner als .
Die für das Syndrom gewählte Korrekturopertion ist die Pauli-Operation mit dem niedrigsten Gewicht in der Menge, die durch den rechten Kreis im Diagramm dargestellt wird (oder eine davon im Gleichstandsfall). Es kann also sein, dass , aber nicht notwendigerweise. Was wir jedoch mit Sicherheit sagen können: kann kein größeres Gewicht als haben, da unter den Operationen in dieser Menge das minimale Gewicht hat – und daher hat Gewicht strikt kleiner als
Betrachten wir nun, was passiert, wenn die Korrekturopertion auf den Zustand angewendet wird, den wir nach dem Auftreten des Fehlers erhalten. Wenn die ursprüngliche Kodierung war, erhalten wir Unser Ziel ist es zu zeigen, dass proportional zu einem Element des Stabilizers ist, was bedeutet, dass die Korrektur erfolgreich ist und wir (bis auf eine globale Phase) den ursprünglichen kodierten Zustand zurückerhältst.
Erstens: Da und dasselbe Syndrom erzeugen, muss die Zusammensetzung mit jedem Stabilizer-Generator kommutieren. Wenn insbesondere ein beliebiger Stabilizer-Generator ist, dann muss gelten:
für denselben Wert von , da dies der -te Eintrag des Syndroms ist, das sowohl als auch erzeugen. Daher gilt:
also kommutiert mit Wir haben damit gezeigt, dass im linken Kreis liegt, da es das Syndrom erzeugt.
Zweitens muss das Gewicht der Zusammensetzung höchstens gleich der Summe der Gewichte von und sein – was aus einem kurzen Nachdenken über Produkte von Pauli-Operationen folgt – und daher ist das Gewicht von strikt kleiner als Das impliziert, dass proportional zu einem Element des Stabilizers unseres Codes ist, was wir zeigen wollten. Indem wir unsere Korrekturoperationen als Vertreter mit niedrigstem Gewicht der Menge von Fehlern wählen, die jeweils ein Syndrom erzeugen, sind wir daher garantiert, alle Pauli-Fehler mit Gewicht kleiner als die Hälfte der Distanz des Codes zu korrigieren.
Es gibt jedoch ein Problem. Bei Stabilizer-Codes im Allgemeinen ist es ein rechentechnisch schwieriges Problem, die Pauli-Operation mit dem niedrigsten Gewicht zu berechnen, die ein gegebenes Syndrom erzeugt. (Das gilt übrigens auch für klassische Codes, die wir in diesem Kontext als Stabilizer-Codes betrachten können, bei denen in den Stabilizer-Generatoren als Tensorfaktoren nur - und -Matrizen vorkommen.) Im Gegensatz zum Kodierungsschritt werden Clifford-Operationen uns dieses Mal also nicht zu Hilfe kommen.
Die Lösung besteht darin, spezifische Codes zu wählen, für die gute Korrekturen effizient berechnet werden können – dafür gibt es kein einfaches Rezept. Kurz gesagt ist die Entwicklung von Stabilizer-Codes, für die gute Korrekturoperationen effizient berechenbar sind, ein Teil der Kunst des Quantencode-Designs. Diese Kunst werden wir in der nächsten Lektion in Aktion sehen.