[PYTHON] Grundlagen der Quanteninformationstheorie: Quantenfehlerkorrektur (Shor Code)

\def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}

Einführung

Als das Prinzip der Quantenberechnung in den 1980er Jahren zum ersten Mal geklärt wurde, gab es keine Theorie der Fehlerkorrektur, wie sie in der klassischen digitalen Verarbeitung verwendet wurde, oder es war äußerst schwierig, diese Theorie zu etablieren, sodass Quantencomputer realistisch sind. Es scheint, dass einige Leute es für unmöglich hielten. Bei klassischen Bits muss nur der Fehler berücksichtigt werden, bei dem die Bits invertiert werden, während bei Quantenbits die Änderung unendliche Freiheitsgrade aufweist, sodass Fehler mit unendlichen Mustern behandelt werden müssen. Wenn Sie sich eine Bloch-Kugel vorstellen, gibt es unendlich viele Möglichkeiten, den Quantenzustand zu verschieben. Sie müssen darüber nachdenken, den ursprünglichen Zustand aus dem verschobenen Zustand genau wiederherzustellen. Darüber hinaus können Quantenzustände nicht wie klassische Informationen unschuldig dupliziert werden und werden bei der Messung gebrochen. Es scheint, dass man dachte, dass die Schwierigkeit nicht seltsam war. Peter Shor war der erste, der es brach. Durch Verwendung des von diesem Kurzfilm vorgeschlagenen "Shor-Codes" ist es möglich, jeden Fehler zu korrigieren, der auf ein Quantenbit einwirkt. Dieser "willkürliche" Ort ist unglaublich. Darüber hinaus kann es mit einer relativ einfachen Quantenschaltung realisiert werden. Dieses Mal möchte ich, nachdem ich die Theorie erklärt habe, ihre Leistung mit dem Quantenberechnungssimulator qlazy realisieren.

Die folgenden Dokumente wurden als Referenz verwendet.

  1. Neilsen, Chan "Quantencomputer und Quantenkommunikation (3)" Ohm (2005)
  2. Tomita "Quanteninformationstechnik" Morikita Publishing (2017)
  3. Nakayama "Quantenalgorithmus" Gihodo Publishing (2014)

Bestätigung der Theorie

Klassische Fehlerkorrektur (Wiederholungscode)

Als vorbereitende Übung, bevor ich mich mit der Geschichte der Quantenfehlerkorrektur befasse, werde ich die Grundidee der Fehlerkorrektur in klassischen Informationen überprüfen. Überlegen Sie nun, ein Informationsbit über einen verrauschten klassischen Kanal zu übertragen. Angenommen, dieser Kanal bewirkt, dass die Bits mit einer Wahrscheinlichkeit von p invertiert werden. Das heißt, wenn das Eingangsbit 0 ist, wird das Bit mit einer Wahrscheinlichkeit p zu 1 invertiert und bleibt mit einer Wahrscheinlichkeit 1-p 0. Wenn das Eingangsbit 1 ist, wird das Bit mit der Wahrscheinlichkeit p auf 0 invertiert und bleibt mit der Wahrscheinlichkeit 1-p 1. Ein solcher Kanal wird als "binärer symmetrischer Kanal" bezeichnet. Wenn Sie diesen Kanal so verwenden, wie er ist, ohne an irgendetwas zu denken, ist die Fehlerrate natürlich p. Ist es nicht möglich, die Fehlerrate zu reduzieren, indem eine Verarbeitung unter der Voraussetzung dieses Kanals durchgeführt wird?

Die grundlegende und bekannte Methode besteht darin, die Bits zu duplizieren und sie absichtlich redundant zu machen. Zum Beispiel wird die gegebene 1-Bit-Information wie unten gezeigt in 3 Bit konvertiert (codiert).

\begin{align}
0 &\rightarrow 000 \\
1 &\rightarrow 111 \\
\end{align}

Dies wird nacheinander über den klassischen Kanal übertragen. Die Informationsmenge wird verdreifacht, aber die Idee ist, dass es keine andere Wahl gibt, als Fehler zu korrigieren. Die Bitfolge 000 kann auf der Empfangsseite 010 sein, da das Rauschen die Bits wahrscheinlich invertiert. Dies liegt jedoch daran, dass das mittlere Bit invertiert ist und ich denke, es ist tatsächlich 000. Mit anderen Worten, es ist eine Methode, eine Mehrheitsentscheidung zu treffen und anzunehmen, dass viele Bits die ursprünglichen Bits sind. Es wird als "Wiederholungscode" bezeichnet, da es die Eingabebits wiederholt und codiert. Wie Sie sehen können, ist es möglich, dass der Eingang 000 ist und das Rauschen 110 ergibt. Ich finde es jedoch gut, wenn die durchschnittliche Gesamtfehlerrate gering ist. Wie wird die durchschnittliche Fehlerrate speziell berechnet? Die Inversion von 0 oder 1 Bit kann korrigiert werden. Wenn Sie also nur die Wahrscheinlichkeit berechnen, dass 2 oder 3 Bits invertiert werden, erhalten Sie die gewünschte Fehlerrate. Die Wahrscheinlichkeit, 3 gleichzeitig umzudrehen, beträgt $ p ^ 3 $, und die Wahrscheinlichkeit, 2 umzudrehen, beträgt $ 3p ^ 2 (1-p) $ für 3 Muster. Addiere dies, um $ p ^ 3 + 3p ^ 2 (1-p) = 3p ^ 2 - 2p ^ 3 $ zu erhalten. Die Fehlerrate, wenn nichts getan wurde, war $ p $, daher ist die Bedingung, dass die Fehlerrate kleiner ist, wenn der Fehler korrigiert wird, $ p> 3p ^ 2 - 2p ^ 3 $, dh $ p <1 / Es wird 2 $ sein. Mit anderen Worten, wenn der Wert von $ p $ weniger als $ 1/2 $ beträgt, wird der Effekt dieses sich wiederholenden Codes angezeigt.

Bitinversionscode von 3 Quantenbits

Codierung

Quantenbits werden auf ähnliche Weise codiert. Wenn der Zustand eines Quantenbits beispielsweise $ \ ket {\ psi} = a \ ket {0} + b \ ket {1} $ ist, dann ist es $ a \ ket {000} + b \ ket {111} Überlegen Sie, ob es wie $ konvertiert (codiert) werden kann. Wie Sie leicht sehen können, kann dies durch Durchlaufen der folgenden Quantenschaltung realisiert werden.

|psi> --*--*-- ...
        |  |
  |0> --X----- ...
           |  
  |0> -----X-- ...

In diesem Zustand kann der ursprüngliche Zustand wiederhergestellt werden, selbst wenn ein Bit invertiert und in $ \ ket {000} \ rightarrow \ ket {010} $ geändert wird. Ich werde das von nun an erklären (die Punkte in der Abbildung zeigen an, dass es sich um Rauschkanäle handelt und so weiter).

Fehlererkennung (Syndromdiagnose)

Zuerst müssen wir wissen, welches Bit invertiert wurde. Dieses Verfahren wird als "Fehlererkennung" oder "Syndromdiagnose" bezeichnet. Im Fall von 3 Bits können Sie dies herausfinden, indem Sie die folgende Projektionsoperation ausführen.

\begin{align}
P_0 &= \ket{000} \bra{000} + \ket{111} \bra{111} \\
P_1 &= \ket{100} \bra{100} + \ket{011} \bra{011} \\
P_2 &= \ket{010} \bra{010} + \ket{101} \bra{101} \\
P_3 &= \ket{001} \bra{001} + \ket{110} \bra{110} \tag{1}
\end{align}

$ P_0 $ ist ein Projektionsoperator für Messungen, die erkennen, dass nichts falsch ist. $ P_1 $ ist eine Projektionsmessung, die erkennt, dass das erste Bit falsch ist. Unten ist $ P_2 $ eine Projektionsmessung, die einen Fehler im zweiten Bit und $ P_3 $ im dritten Bit erkennt. Wenn das Ergebnis des Rauschens $ a \ ket {100} + b \ ket {011} $ ist, ist nur $ \ bra {\ psi} P_1 \ ket {\ psi} $ 1 und alle anderen 0. Sie sehen also, dass $ P_1 $ sicherlich ein Operator für die Fehlererkennung im ersten Bit ist.

Zusätzlich zu diesem Beispiel gibt es eine Projektionsmessung zur Diagnose des Syndroms. Ich habe in Gleichung (1) vier Operatoren verwendet, aber es gibt einen Suguremono, der mit zwei durchgeführt werden kann. Lassen Sie mich zunächst schließen. Wie man die Beobachterblasen $ Z_1 Z_2 $ und $ Z_2 Z_3 $ misst, wobei die Pauli $ Z $ -Operatoren, die auf das erste, zweite und dritte Quantenbit angewendet werden, $ Z_1, Z_2 bzw. Z_3 $ sind. ist. Selbst wenn gesagt wird, dass es verrückt ist, kann es in einem Zustand von "Hmm?" Sein, also werde ich eine kleine Erklärung hinzufügen.

Pauli $ Z $ kann geschrieben werden als $ Z = \ ket {0} \ bra {0} - \ ket {1} \ bra {1} $

\begin{align}
Z_1 Z_2 &= (\ket{0}_{1}\bra{0}_{1}-\ket{1}_{1}\bra{1}_{1})(\ket{0}_{2}\bra{0}_{2}-\ket{1}_{2}\bra{1}_{2}) \\
&= \ket{00}\bra{00} + \ket{11}\bra{11} - \ket{01}\bra{01} - \ket{10}\bra{10} \\
&= (\ket{00}\bra{00} + \ket{11}\bra{11}) \otimes I_3 - (\ket{01}\bra{01} + \ket{10}\bra{10}) \otimes I_3 \tag{2}
\end{align}

Kann erweitert werden. Wie Sie sehen können, wenn Sie auf diese Gleichung starren, gibt die Messung dieses Beobachters 1 aus, wenn das erste und das zweite Quantenbit gleich sind (als "gerade Parität" bezeichnet). Wenn umgekehrt das erste und das zweite Quantenbit unterschiedlich sind (als "ungerade Parität" bezeichnet), wird -1 ausgegeben [^ 1]. Das heißt, Sie können die Parität des ersten und zweiten Quantenbits überprüfen, indem Sie eine Messung von $ Z_1 Z_2 $ durchführen. In ähnlicher Weise zeigt eine Messung von $ Z_2 Z_3 $ die Parität des zweiten und dritten Quantenbits.

[^ 1]: Hier kann der Ausdruck "Messen der Beobachterblase" etwas verwirrend sein, daher werde ich eine kleine Erklärung hinzufügen. Beobachterblase ist buchstäblich "beobachtbare Menge". Im Rahmen der Quantenmechanik können physikalisch beobachtbare Größen als Hermeet-Operator ausgedrückt werden. Der repräsentative Spieler ist Hamiltonian, der als Elmeet-Operator die physikalische Energiemenge ausgedrückt hat. Das Messen einer physikalischen Größe entspricht dem Lösen des entsprechenden Eigenwertproblems des Beobachterblasen-Hermeat-Operators. Es wird zum entsprechenden Eigenvektor (eindeutiger Zustand). Was derzeit als Beobachterblase angegeben wird, ist Pauli $ Z $ (Produkt). Das Messen von Pauli $ Z $ bedeutet physikalisch das Messen des Energiewertes des Systems, der durch Hamiltonian $ H = Z $ gegeben ist. Mit anderen Worten handelt es sich um eine 1-Spin-Systemmessung in Richtung der Z-Achse. Mit anderen Worten, Sie können es sich als die Messung von Quantenbits vorstellen, die in Quantenschaltungen bekannt ist. Schließlich ist "Messen der Beobachterblase" von $ Z_1 Z_2 $ nichts, da das erste Quantenbit rechnerisch gemessen wird, um einen Wert von -1 oder 1 und das zweite Quantenbit zu erhalten. Ist auf rechnerischer Basis zu messen, um einen Wert von -1 oder 1 zu erhalten und das Produkt daraus zu nehmen. Zu diesem Zeitpunkt kann die Reihenfolge der ersten und zweiten Messung entweder sein (da sie als Operatoren ausgetauscht werden können). Übrigens bedeutet das Messen der Beobachterblase mit der Bezeichnung Pauli $ X $, dass die Messung in Richtung der X-Achse in Form von Quantenbits durchgeführt wird. Messen Sie also nach dem Anwenden des Adamal-Gates in Richtung der Z-Achse. Entspricht dem Tun.

Die Tabelle ist wie folgt.

Z_1 Z_2Messwert (Parität) Z_2 Z_3Messwert (Parität) Invertiertes Bit
+1 (gerade) +1 (gerade) Keiner
+1 (gerade) -1 (ungerade) Der dritte
-1 (ungerade) +1 (gerade) Zuerst
-1 (ungerade) -1 (ungerade) Der Zweite

In der ersten Zeile sind die 1. und 2. gerade Parität und die 2. und 3. gerade Parität, so dass anscheinend geschätzt werden kann, dass es keine invertierten Bits gibt.

In der zweiten Zeile sind die erste und die zweite gerade Parität, und die zweite und dritte sind ungerade Parität, so dass es scheint, dass geschätzt werden kann, dass die dritte invertiert ist.

In der 3. Zeile sind die 1. und 2. ungerade Parität und die 2. und 3. gerade Parität, so dass die 1. wahrscheinlich invertiert ist.

In der letzten 4. Zeile sind die 1. und 2. ungerade Parität und die 2. und 3. ungerade Parität, so dass es wahrscheinlich ist, dass die 2. in der Mitte invertiert ist.

Daher ist es möglich, die Anzahl des invertierten Quantenbits zu schätzen. Wenn Sie höchstens ein invertierendes Quantenbit haben, können Sie vollständig bestimmen, welche Zahl das invertierende Bit ist.

Welche Art von Quantenschaltung kann diese Syndromdiagnose realisiert werden? Sie müssen es nur messen

|psi> --*--*-- ... --M--
        |  |
  |0> --X----- ... --M--
           |  
  |0> -----X-- ... --M--

Es kann als enden. Das ist aber nicht gut. Das Quantenbit, das ich korrigieren möchte, wird durch Messung zerstört. Um den Quantenzustand, den Sie korrigieren möchten, nicht zu zerstören, fügen Sie daher ein Hilfsquantenbit (Hilfs) hinzu, wie unten gezeigt, lassen Sie den Zielquantenzustand dort entweichen und messen Sie diesen Zustand nicht. Ich kann nicht

|psi> --*--*-- ... --*------------
        |  |         |
  |0> --X----- ... -----*--*------
           |         |  |  |
  |0> -----X-- ... -----------*---
                     |  |  |  |
               |0> --X--X--------M1
                           |  |
               |0> --------X--X--M2

Hier wird die Messung von $ Z_1 Z_2 $ als M1 und die Messung von $ Z_2 Z_3 $ als M2 [^ 2] ausgedrückt.

[^ 2]: Das Zielbit wird gemessen, nachdem zwei CNOTs mit dem ersten und dem zweiten Quantenbit als Steuerbits übergeben wurden (Messung von M1), aber warum habe ich $ Z_1 Z_2 $ gemessen? Wird es sein? Wenn Sie $ \ ket {x} \ ket {y} \ ket {0} \ rightarrow \ ket {x} \ ket {y} \ ket {x \ oplus y} $, $ x $ und $ y $ schreiben Wenn sie gleich sind, sind sie $ \ ket {x} \ ket {y} \ ket {0} $, und der gemessene Wert von M1 ist +1. Wenn sie unterschiedlich sind, sind sie $ \ ket {x} \ ket {y} \ ket {1} $. Der gemessene Wert von M1 ist -1.

Wiederherstellung

Nachdem das invertierte Quantenbit durch die Syndromdiagnose identifiziert wurde, besteht der nächste Schritt darin, das Quantenbit erneut zu invertieren und wiederherzustellen. Schaltet das X-Gatter gemäß den Werten von M1 und M2 ein / aus.

|psi> --*--*-- ... --*------------X---
        |  |         |            ||
  |0> --X----- ... -----*--*------X---
           |         |  |  |      ||
  |0> -----X-- ... -----------*---X---
                     |  |  |  |   ||
               |0> --X--X---------M1
                           |  |   ||
               |0> --------X--X---M2

Ich habe versucht, die Steuerung des Tors gemäß dem Messergebnis mit einem doppelten vertikalen Balken auszudrücken (es ist schwer zu verstehen und keine formale Schreibweise, aber bitte fühlen Sie es, schwitzen Sie). X-Gate eines der drei Quantenbits mit dem in der obigen Tabelle gezeigten Muster. Dadurch wird der ursprüngliche Zustand wiederhergestellt [^ 3].

[^ 3]: Natürlich wird derzeit angenommen, dass die Anzahl der aufgrund von Rauschen zu invertierenden Quantenbits 1 oder weniger beträgt, sodass sie nicht wiederhergestellt werden können, wenn 2 oder mehr Bits invertiert werden.

Anstatt das Gate entsprechend dem Messergebnis zu manipulieren, können Sie dies auch mit CNOT und Toffoli tun.

              [Lärm]
|psi> --*--*-- ... --*-------------------X--X--
        |  |         |                   |  |
  |0> --X----- ... -----*--*----------------X--
           |         |  |  |             |  |
  |0> -----X-- ... -----------*-------X-----X--
                     |  |  |  |       |  |  |
               |0> --X--X----------------*--*--
                           |  |       |     |
               |0> --------X--X-------*-----*--

     [Codierung]     [Syndromdiagnose]  [Korrektur]

Verstehst du das?

Wenn im Stadium der Syndromdiagnose die erste Ansila +1 ($ \ ket {0} ) und die zweite Ansila +1 ( \ ket {0} $) ist, wird sie als [Korrektur] bezeichnet. Da die Steuerbits des Schaltungsabschnitts beide $ \ ket {0} $ sind, wird nichts getan.

Wenn die erste Ansila +1 ($ \ ket {0} ) und die zweite Ansila -1 ( \ ket {1} $) ist, ist nur die zweite Ansila der Korrekturschaltung $ \ ket {1 Da es zu} $ wird, wird das X-Gatter an das dritte Quantenbit angelegt und invertiert.

Wenn die erste Ansila -1 ($ \ ket {1} ) und die zweite Ansila +1 ( \ ket {0} $) ist, ist nur die erste Ansila der Korrekturschaltung $ \ ket {1 } $, also ist das erste Quantenbit X-gated und invertiert.

Wenn die erste Ansila -1 ($ \ ket {1} ) und die zweite Ansila -1 ( \ ket {1} $) ist, sind beide Ansilas in der Korrekturschaltung $ \ ket {1} $ Daher ist das zweite Quantenbit X-gesteuert und invertiert.

Jetzt können wir die Bits für alle Fehlermuster wiederherstellen.

Entschlüsselung

Führen Sie abschließend die Umkehrung der Codierung durch, um den ursprünglichen Zustand vollständig wiederherzustellen.

              [Lärm]
|psi> --*--*-- ... --*-------------------X--X---*--*-- |psi>
        |  |         |                   |  |   |  |
  |0> --X----- ... -----*--*----------------X------X-- |0>
           |         |  |  |             |  |   |
  |0> -----X-- ... -----------*-------X-----X---X----- |0>
                     |  |  |  |       |  |  |
               |0> --X--X----------------*--*--
                           |  |       |     |
               |0> --------X--X-------*-----*--

     [Codierung]     [Syndromdiagnose]  [Korrektur]   [Entschlüsselung]

Dies vervollständigt die Fehlerkorrekturschaltung für die Inversion von 1 Quantenbit.

Es ist jedoch nicht gut, dass zusätzliche 2 Quantenbits als Ansila benötigt werden. Die Schaltung, die konzipiert wurde, ist unten gezeigt, weil wir Ancilla wenn möglich eliminieren wollen. Die Idee ist, dass nur das erste Quantenbit wiederhergestellt werden muss, so dass das zweite und dritte nicht wiederhergestellt werden müssen. Stellen Sie jedoch sicher, dass zwischen mindestens dem ersten und dem anderen Quantenbit keine Verschränkung besteht.

|psi> --*--*-- ... --*--*--X-- |psi>
        |  |         |  |  |
  |0> --X----- ... -----X--*--
           |         |     |
  |0> -----X-- ... --X-----*--

Wie wär es damit. Es ist ziemlich einfach, aber ist es wirklich richtig? Lassen Sie uns mit einer Formel überprüfen. Der Eingabestatus ist $ \ ket {\ psi} = a \ ket {0} + b \ ket {1} $. Es ist klar, dass der Status zum Zeitpunkt der Codierung $ a \ ket {000} + b \ ket {111} $ sein wird. Sehen wir uns also die Änderung unmittelbar danach an.

Wenn keine zu invertierenden Quantenbits vorhanden sind

\begin{align}
a\ket{000} + b\ket{111} &\rightarrow a\ket{000} + b\ket{110} \rightarrow a\ket{000} + b\ket{100} \rightarrow a\ket{000} + b\ket{100} \\
&= (a\ket{0} + b\ket{1}) \otimes \ket{00}  \tag{3}
\end{align}

Wenn das erste Quantenbit aufgrund von Rauschen invertiert wird

\begin{align}
a\ket{100} + b\ket{011} &\rightarrow a\ket{101} + b\ket{011} \rightarrow a\ket{111} + b\ket{011} \rightarrow a\ket{011} + b\ket{111} \\
&= (a\ket{0} + b\ket{1}) \otimes \ket{11}  \tag{4}
\end{align}

Wenn das zweite Quantenbit aufgrund von Rauschen invertiert wird

\begin{align}
a\ket{010} + b\ket{101} &\rightarrow a\ket{010} + b\ket{100} \rightarrow a\ket{010} + b\ket{110} \rightarrow a\ket{010} + b\ket{110} \\
&= (a\ket{0} + b\ket{1}) \otimes \ket{10}  \tag{5}
\end{align}

Wenn das dritte Quantenbit aufgrund von Rauschen invertiert wird

\begin{align}
a\ket{001} + b\ket{110} &\rightarrow a\ket{001} + b\ket{111} \rightarrow a\ket{001} + b\ket{101} \rightarrow a\ket{001} + b\ket{101} \\
&= (a\ket{0} + b\ket{1}) \otimes \ket{01}  \tag{6}
\end{align}

Das zweite und dritte Quantenbit werden also nicht unbedingt auf $ \ ket {00} $ zurückgesetzt, aber zumindest das erste Quantenbit ist in allen Mustern $ \ ket {\ psi} = a \ ket {. Es ist auf 0} + b \ ket {1} $ zurückgekehrt und nicht mit anderen Quantenbits (= in einem Produktzustand) verwickelt.

Phaseninversionscode von 3 Quantenbits

Als nächstes folgt die Fehlerkorrektur, wenn in einem Quantenbit eine Phaseninversion vorliegt. Die Bitinversion kann durch das X-Gatter ausgedrückt werden, aber die Phaseninversion ist die Wirkung des Z-Gatters. Mit anderen Worten ist die Änderung $ a \ ket {0} + b \ ket {1} \ rightarrow a \ ket {0} -b \ ket {1} $. Ich möchte mich von diesem Zustand erholen. Was soll ich tun? Eigentlich gibt es ein einfaches Rezept. Alles was Sie tun müssen, ist das Adamal-Tor zu benutzen. Die Aktion von Adamal Gate ist

\begin{align}
\ket{0} &\rightarrow \ket{+} = \frac{1}{2} (\ket{0} + \ket{1})  \\
\ket{1} &\rightarrow \ket{-} = \frac{1}{2} (\ket{0} - \ket{1})  \tag{7}
\end{align}

Die Phaseninversion von $ a \ ket {0} + b \ ket {1} \ rightarrow a \ ket {0} -b \ ket {1} $ ist also

\begin{align}
& \frac{1}{2} (a+b) \ket{+} \frac{1}{2} (a-b) \ket{-} \\
& \rightarrow \frac{1}{2} (a+b) \ket{-} \frac{1}{2} (a-b) \ket{+}  \tag{8}
\end{align}

Wird ausgedrückt als. Mit anderen Worten, Phaseninversion ist nichts anderes als Bitinversion an der Basis von $ \ {\ ket {+}, \ ket {-} \} $. Daher ist es in der zuvor erwähnten bitinvertierenden Schaltung ausreichend, Adamal nach dem Codieren anzuwenden, es in den Rauschkanal zu legen und Adamal unmittelbar vor dem Decodieren anzuwenden, um es wiederherzustellen.

|psi> --*--*--H-- ... --H--*--*--X-- |psi>
        |  |               |  |  |
  |0> --X-----H-- ... --H-----X--*--
           |               |     |
  |0> -----X--H-- ... --H--X-----*--

Damit ist die Fehlerkorrektur für die Phaseninversion abgeschlossen.

Shor Zeichen

"Shor Code" realisiert gleichzeitig eine Fehlerkorrektur der Bitinversion und der Phaseninversion. Bei der Fehlerkorrektur der Phaseninversion wird 1 Quantenbit im Anfangszustand auf 3 Quantenbits redundant gemacht, und auf jedes wird Adamar angewendet. Da die Bitinversionsfehlerkorrektur auch für jedes Quantenbit durchgeführt wird, wird jedes für 3 Quantenbits redundant gemacht. Infolgedessen sind insgesamt 9 Quantenbits erforderlich. Im Schaltplan

|psi> --*--*--H----*--*-- ... --*--*--X--H--*--*--X---- |psi>
        |  |       |  |         |  |  |     |  |  |
        |  | |0> --X----- ... -----X--*--   |  |  |
        |  |       |  |         |     |     |  |  |
        |  | |0> -----X-- ... --X-----*--   |  |  |
        |  |                                |  |  |
  |0> --X-----H----*--*-- ... --*--*--X--H-----X--*--
           |       |  |         |  |  |     |     |
           | |0> --X----- ... -----X--*--   |     |
           |          |         |     |     |     |
           | |0> -----X-- ... --X-----*--   |     |
           |                                |     |
  |0> -----X--H----*--*-- ... --*--*--X--H--X-----*--
                   |  |         |  |  |
             |0> --X----- ... -----X--*--
                      |         |     |
             |0> -----X-- ... --X-----*--

Es wird sein. Jetzt können Sie den ursprünglichen Zustand gegen den Fehler der Bitinversion und der Phaseninversion wiederherstellen (natürlich nehmen wir an, dass nur eines der Quantenbits durch Rauschen invertiert wird. ist). Tatsächlich hat der auf diese Weise konstruierte Funktionscode jedoch eine noch stärkere Wirkung. Nicht nur leicht verständliche diskrete Fehler wie Bitinversion und Phaseninversion, sondern auch beliebige kontinuierliche Änderungen (Fehler) können richtig korrigiert werden.

Angenommen, der codierte Status lautet $ \ ket {\ psi} $. Wenn nur dieses erste Quantenbit dem vom Kraus-Operator $ \ {E_ {i} \} $ beschriebenen Rauschen ausgesetzt wäre, wäre die Änderung:

\ket{\psi}\bra{\psi} \rightarrow \sum_{i} E_{i} \ket{\psi}\bra{\psi} E_{i}^{\dagger}  \tag{9}

Sie können so schreiben. Hier verwendet $ E_i $ die Pauli-Operatoren $ X_1, Z_1 $, die mit dem ersten Quantenbit und dem komplexen Koeffizienten $ \ {e_ {ij} \} $ arbeiten.

E_i = e_{i0} I + e_{i1} X_1 + e_{i2} Z_1 + e_{i3} X_1 Z_1  \tag{10}

Kann mit [^ 5] erweitert werden.

[^ 5]: Hier ist $ X_1 Z_1 $ gleich $ Y_1 $ ohne den Koeffizienten, sodass $ E_i $ mit dem Pauli-Operator erweitert werden kann. Diese Erweiterung ist für jede zweidimensionale Matrix möglich.

Die Quantenzustände konzentrieren sich in Gleichung (9) nur auf einen $ i $ -Term und lauten $ \ ket {\ psi}, X_ {1} \ ket {\ psi}, Z_ {1} \ ket {\ psi} , X_ {1} Z_ {1} \ ket {\ psi} $ wechselt in den überlagerten Zustand. Das heißt, der Zustand $ \ ket {\ psi} $ selbst, die Bitinversion des Zustands $ \ ket {\ psi} $, die Phasenumkehrung des Zustands $ \ ket {\ psi} $, das Bit des Zustands $ \ ket {\ psi} $ -Es ist eine Überlagerung von vier Zuständen, die als Phaseninversion bezeichnet wird. Darauf kann eine Syndromdiagnose angewendet werden, um herauszufinden, welche der vier war. Einmal gefunden, besteht der nächste Schritt darin, den Quantenzustand wiederherzustellen, indem das Gate gemäß dem Fehlermuster durchlaufen wird. Gleichung (9) ist die Summe aller $ i $, aber dasselbe Argument erlaubt eine Fehlerkorrektur für andere $ i $ und dasselbe Argument für andere Quantenbitnummern als die erste. Ermöglicht die Fehlerkorrektur.

Simulation

Implementierung

Simulieren wir nun den Schaltplan der Fehlerkorrektur mit dem Code von Short. Hier ist der gesamte Python-Code.

import random
from qlazypy import DensOp

def create_densop():

    de_ini = DensOp(qubit_num=9).h(0)
    de_fin = de_ini.clone()
    return de_ini, de_fin
    
def noise(self, kind='', prob=0.0, qid=[]):

    qchannel = {'bit_flip':self.bit_flip,
                'phase_flip':self.phase_flip,
                'bit_phase_flip':self.bit_phase_flip,
                'depolarize':self.depolarize,
                'amp_dump':self.amp_dump,
                'phase_dump':self.phase_dump}
    [qchannel[kind](i,prob=prob) for i in qid]
    return self

def code(self):

    self.cx(0,3).cx(0,6)
    self.h(0).h(3).h(6)
    self.cx(0,1).cx(0,2)
    self.cx(3,4).cx(3,5)
    self.cx(6,7).cx(6,8)
    return self
    
def correct(self):

    self.cx(0,2).cx(0,1)
    self.cx(3,5).cx(3,4)
    self.cx(6,8).cx(6,7)
    self.ccx(2,1,0).ccx(5,4,3).ccx(8,7,6)
    self.h(0).h(3).h(6)
    self.cx(0,3).cx(0,6)
    self.ccx(6,3,0)
    return self

if __name__ == '__main__':

    # add custom gate
    DensOp.add_method(code)
    DensOp.add_method(noise)
    DensOp.add_method(correct)

    # settings
    kind = 'depolarize' # bit_flip,phase_flip,bit_phase_flip,depolarize,amp_dump,phase_dump
    prob = 1.0
    qid = [0]
    print("== settings ==")
    print("* kind of noise        =", kind)
    print("* probability of noise =", prob)
    print("* noisy channels       =", qid)

    # error correction (shor code)
    de_ini, de_fin = create_densop()
    de_fin.code()
    de_fin.noise(kind=kind, prob=prob, qid=qid)
    de_fin.correct()

    # evaluate fidelity
    fid = de_fin.fidelity(de_ini, qid=[0])
    print("== result ==")
    print("* fidelity = {:.6f}".format(fid))

    # free all densops
    DensOp.free_all(de_ini, de_fin)

Ich werde erklären, was Sie in der richtigen Reihenfolge tun. Schauen Sie sich zunächst den Hauptverarbeitungsabschnitt an.

# add custom gate
DensOp.add_method(code)
DensOp.add_method(noise)
DensOp.add_method(correct)

Registrieren Sie nun die erforderliche Verarbeitung als benutzerdefiniertes Gate. Der Funktionscode, das Rauschen und die korrekte Funktion werden oben definiert, damit sie als Methoden der QState-Klasse verwendet werden können.

# settings
kind = 'depolarize' # bit_flip,phase_flip,bit_phase_flip,depolarize,amp_dump,phase_dump
prob = 1.0
qid = [0]

In werden die Parameter für die Simulation eingestellt. Art repräsentiert das Rauschmuster, das Sie anwenden möchten. In 'bit_flip' (Bitinversion), 'phase_flip' (Phaseninversion), 'bit_phase_flip' (Bitphaseninversion), 'depolarize' (Depolarisation), 'amp_dump' (Amplituden-Dumping), 'phase_dump' (Phasendämpfung) Wählen Sie den Musternamen aus, unter dem Sie anwenden möchten. Die im vorherigen Artikel beschriebenen typischen Quantenkanäle (https://qiita.com/SamN/items/9d86224a35c4b6c031b8) können auf den Dichteoperator angewendet werden (die Anwendung von Quantenkanälen auf den Dichteoperator ist v0.0.34). Hinzugefügt). prob repräsentiert die Wahrscheinlichkeit (Intensität) des Hinzufügens von Rauschen in jedem Quantenkanal. qid ist eine Liste, die festlegt, auf welche Quantenbits Rauschen angewendet werden soll. Im obigen Beispiel wird es auf das 0. Quantenbit angewendet. Sie können auch mehrere Bitnummern angeben.

de_ini, de_fin = create_densop()

Erstellen Sie dann entsprechend einen Quantenzustand (Dichteoperator). Wie Sie der Funktionsdefinition entnehmen können, werden insgesamt 9 Quantenbits auf $ \ ket {0} $ initialisiert, und nur das 0. ist Adamal-gated. Es muss nicht Adamar sein, aber es ist hier angemessen. Sie können es entsprechend dem erwarteten Eingabestatus entsprechend ändern. Auch hier werden zwei genau dieselben Quantenzustände (Dichteoperatoren), de_ini und de_fin, ausgegeben, aber danach wird nur de_fin verarbeitet und schließlich mit dem ursprünglichen Zustand de_ini verglichen. Ich versuche eine auszugeben.

de_fin.code()

Dann verschlüsseln Sie es. Wenn Sie sich die Funktionsdefinition ansehen, wird dies offensichtlich sein. Die Quantenschaltung bis kurz vor dem Eintritt des Rauschens ist ehrlich implementiert.

de_fin.noise(kind=kind, qid=qid, prob=prob)

Dann wird der durch Art definierte Quantenkanal auf die durch qid definierte Quantenzahl mit der Intensität der Wahrscheinlichkeit prob angewendet. Der Inhalt der Funktionsdefinition mag auf den ersten Blick verwirrend erscheinen, führt jedoch in Wirklichkeit nur die Operation de_ini.depolarize (0, prob = 1.0) aus. Im Quantenschaltbild entspricht es den gepunkteten Teilen.

dde_fin.correct()

Fehlerkorrektur und Entschlüsselung werden also zusammen durchgeführt. Wie Sie anhand der Funktionsdefinition sehen können (auch hier handelt es sich nur um eine einfache Implementierung).

fid = de_fin.fidelity(de_ini, qid=[0])
print("== result ==")
print("* fidelity = {:.6f}".format(fid))

Berechnen Sie nun die Wiedergabetreue für das 0. Quantenbit und zeigen Sie sie an, um den Anfangszustand mit dem fehlerkorrigierten Zustand zu vergleichen.

DensOp.free_all(de_ini, de_fin)

Geben Sie zum Schluss den verwendeten Speicher frei. Sie können das von der Klassenmethode free_all angegebene Argument sofort freigeben (hinzugefügt in v0.0.33).

Dies ermöglicht es, eine Fehlerkorrektursimulation für das 0. Quantenbit durchzuführen, wenn eine Depolarisation mit einer Wahrscheinlichkeit von 1 durchgeführt wird (dh es wird Rauschen hinzugefügt, das die Richtung vollständig verschiebt).

Ausführungsergebnis

Das Ausführungsergebnis wird angezeigt.

== settings ==
* kind of noise        = depolarize
* probability of noise = 1.0
* noisy channels       = [0]
== result ==
* fidelity = 1.000000

In Bezug auf das Rauschen von 1 Quantenbit konnte ich den Fehler vollständig korrigieren.

Darüber hinaus war eine Fehlerkorrektur auch für andere Quantenkanäle als die Polarisationseliminierung möglich, und es war in Ordnung, dass jedes Quantenbit Rauschen enthielt. Das Folgende ist ein Beispiel.

== settings ==
* kind of noise        = amp_dump
* probability of noise = 1.0
* noisy channels       = [5]
== result ==
* fidelity = 1.000000

Es funktionierte jedoch nicht, wenn zwei oder mehr Rauschkanäle vorhanden waren. Es ist wie folgt.

== settings ==
* kind of noise        = depolarize
* probability of noise = 1.0
* noisy channels       = [0, 2]
== result ==
* fidelity = 0.866025

Wie wäre es, die Wahrscheinlichkeit auf 0,5 zu setzen?

== settings ==
* kind of noise        = depolarize
* probability of noise = 0.5
* noisy channels       = [0, 2]
== result ==
* fidelity = 0.968246

Das war auch nutzlos. Wie oben erläutert, kann nur 1 Quantenbitfehler mit dem Funktionscode vollständig korrigiert werden. Ich verstehe das.

abschließend

Dieses Mal habe ich "Shors Code" aufgegriffen und erklärt, die einfachste und zugänglichste Methode unter verschiedenen vorgeschlagenen Methoden zur Quantenfehlerkorrektur. Es ist interessant, dass ich eine Fehlerkorrekturschaltung hätte machen sollen, die Bitinversion und Phaseninversion unterstützt, aber aus irgendeinem Grund war es eine Schaltung, die alle kontinuierlichen Fehler behandeln kann. Ich denke, dass es effektiv ist, dass kontinuierliche Operationen am Quantenzustand tatsächlich durch Überlagerung diskreter Pauli-Operatoren ausgedrückt werden können.

Es war also eine Einführung in die Grundlagen der Quantenfehlerkorrektur. Vorerst plane ich, die Grundlagen weiter zu verstehen und gleichzeitig die verschiedenen Aspekte der Quantenfehlerkorrektur zu genießen.

das ist alles

Recommended Posts

Grundlagen der Quanteninformationstheorie: Quantenfehlerkorrektur (Shor Code)
Grundlagen der Quanteninformationstheorie: Quantenfehlerkorrektur (CSS-Code)
Grundlagen der Quanteninformationstheorie: Quantenfehlerkorrektur (Stabilisatorcode: 4)
Grundlagen der Quanteninformationstheorie: Quantenfehlerkorrektur (klassischer linearer Code)
Grundlagen der Quanteninformationstheorie: Topologische Oberflächencodes
Grundlagen der Quanteninformationstheorie: Entropie (2)
Grundlagen der Quanteninformationstheorie: Universelle Quantenberechnung durch Oberflächencode (1)
Grundlagen der Quanteninformationstheorie: Horebaud-Grenzen
Grundlagen der Quanteninformationstheorie: Spurenentfernung
Grundlagen der Quanteninformationstheorie: Quantenzustands-Tomographie
Grundlagen der Quanteninformationstheorie: Datenkomprimierung (2)
Grundlagen der Quanteninformationstheorie: Logische Operation durch Oberflächencode (Brading)
Grundlagen der Quanteninformationstheorie: Fehlertolerante Quantenberechnung
Lesen Sie "Grundlagen des Quantenglühens", Tag 5
Lesen Sie "Grundlagen des Quantenglühens", Tag 6
Grundlagen der Tableau-Grundlagen (Visualisierung mit geografischen Informationen)