Wie kann man Verwicklungen bei der Emulation von Quantenberechnungen verfolgen?

9

Ich versuche, eine Quantenberechnungsbibliothek als mein Universitätsprojekt aufzubauen. Ich lerne immer noch alle Aspekte des Quantum Computing-Bereichs. Ich weiß, dass es bereits effiziente Bibliotheken für die Quantenemulation gibt. Ich möchte nur meine eigenen erstellen, um einige der Kernkonzepte des Quantum Computing zu verstehen.

Ich weiß, dass n Qubits mit einem komplexen Array mit 2n Elementen gespeichert werden können . Ein n Qubit-Gate ist auch ein 2n×2n 2D-Array. Das Folgende sind meine Zweifel (hauptsächlich im Zusammenhang mit Verstrickungen):

  1. Wann muss ich das Tensorprodukt von Gates finden (wie IHI für ein 3 Qubit-System)? Ist es immer notwendig, das Tensorprodukt der Ordnung zu berechnen 2n×2n, auch wenn die Qubits nicht verwickelt sind?

  2. Kann ich mit nur einem 2n Element-Array (in dem ich die Koeffizienten speichere) tatsächlich irgendwie berechnen, welche Qubits verwickelt sind? Oder muss ich eine andere Datenstruktur erstellen, um die Verschränkungsinformationen meines n zu speichern?n Qubits (über welche Qubits verschränkt sind)?

  3. Ist meine 2. Frage tatsächlich relevant? Muss ich die Verschränkungsinformationen überhaupt nachverfolgen? Ich meine, ich weiß nicht, ob das Multiplizieren von Gates mit Koeffizienten ausreicht (selbst wenn das System verwickelt ist). Möglicherweise ist es nur zum Zeitpunkt der Messung relevant.

Midhun XDA
quelle
1
Es hängt von ob die Optimierung zur Verfolgung des Verschränkungsmusters verfrüht ist oder nicht. Wenn Sie nur 3 Qubits haben, gewinnen Sie nicht viel, wenn Sie diese Anstrengungen unternehmen, sodass dies eine "vorzeitige Optimierung" wäre. Fragen Sie sich also, wie skalierbar dies tatsächlich sein muss. n
AHusain
1
@MidhunXDA "Ich weiß, was physisch passiert, aber ich kann das nicht in eine mathematische Form umwandeln." Soweit mir bekannt ist, gibt es mehrere physikalische Prozesse, die zur Quantenberechnung führen. Ich denke, es wäre eine gute Idee, wenn Sie einen dieser physikalischen Prozesse, die Sie emulieren möchten, genau beschreiben (oder alle, wenn Sie der Meinung sind, dass dies immer noch im Rahmen der Frage liegt). Ich denke, dass die Angabe der Frage klarer und leichter zu beantworten ist.
Diskrete Eidechse
1
Bitte teilen Sie dies in mehrere Fragen auf - ich sehe mindestens drei verschiedene.
Heidekraut
3
@heather Ich stimme dem Poster zu, dass dies wirklich alle Fragen sind, die verschiedene Aspekte derselben Sache sind. Ich sehe nicht wirklich, wie ich die Frage verbessern kann, aber ich glaube, ich verstehe sie gut genug, um eine Antwort zu geben.
DaftWullie
2
@heather ich stark Moderatoren empfehlen nicht gestellten Fragen zu halten , indem sie sich außer in extremen Fällen (sprich: eklatant Wegthema oder Spam). Diese Frage ist zwar etwas weit gefasst, kann aber in einem einzigen Beitrag angemessen beantwortet werden. FWIW gibt es hier grundsätzlich zwei Fragen: 1) Wann sind Tensorprodukte von Gates zu berechnen? 2) Wie ist dabei der Effekt der Verschränkung zu berücksichtigen?
Sanchayan Dutta

Antworten:

5

Es ist sicherlich ausreichend, immer die vollständige Einheitsmatrix zu berechnen und sie dann auf den 2 n -Eintrittszustandsvektor anzuwenden. Wenn Sie sich dafür entscheiden, ist es das2n×2n2n alles müssen, da alle Verschränkungsinformationen in diesem Vektor enthalten sind. Eine schnelle und einfache Möglichkeit, um festzustellen, ob ein bestimmtes Qubit verwickelt ist, besteht darin, die Teilspur Ihres (reinen) Zustandsvektors über alle anderen Qubits zu ziehen. Wenn die resultierende Matrix Rang 1 hat, befindet sich dieses Qubit in einem trennbaren Zustand, andernfalls ist es verwickelt.

Ich gehe davon aus, dass der Punkt Ihrer Frage wirklich lautet: "Wie können diese enormen Rechenkosten vermieden werden?". Im Allgemeinen ist dies nicht möglich. Wenn Sie die volle Leistung des Quantencomputers nutzen, benötigen Sie immer die 2n Zustandsvektor mit Einträgen. Es gibt jedoch verschiedene Tricks, die den Rechenaufwand reduzieren, beispielsweise die Verzögerung der Notwendigkeit eines so großen Zustandsvektors, indem die Verschränkung verfolgt wird.

Effizienzverbesserungen

Die größte Einsparung, die Sie im Vergleich zur obigen naiven Implementierung erzielen können, besteht darin, die einheitlichen Matrizen zu vermeiden . Wenn Sie beispielsweise nur 1- oder 2-Qubit-Gatter verwenden, bedeutet die einfache Verwendung der geringen Anzahl von Matrizen, dass Sie nur O ( 2 n ) -Speicher anstelle von O ( 2 2 n ) benötigen .2n×2nÖ(2n)Ö(22n)

Dann gibt es andere Taktiken, die Sie anwenden können. Stellen Sie sich zum Beispiel vor, Sie möchten das Zwei-Qubit-Einheitsgatter auf die Qubits i und j anwenden . Sie können Gruppen von 4 Elementen aus dem Zustandsvektor nehmen ( | x 1 , 2 , ... n i , j | y i , j für feste x { 0 , 1 } n - 2 durch all verschiedene Einnahme y { 0 , 1U.ij|x1,2,ni,j|yi,jx{0,1}n2das auf dem ursprünglichen Zustandsvektor festgelegt ist.y{0,1}2) und nur das Einheits- U auf diesen 4-Element-Vektor anwenden . Wenn Sie dies für jedes x wiederholen, wird U zurückgegeben4×4UxU

Ich stelle mir vor, es gibt andere Strategien, die man sich ausdenken könnte. Diejenige, die sich aus der ursprünglichen Frage ergab, war die Verfolgung von Verstrickungen. Dies führt zu Speicher- und Geschwindigkeitsverbesserungen zu Beginn einer Berechnung, ist jedoch letztendlich gleichwertig, da (vermutlich) alles im Quantencomputer verwickelt wird.

Verschränkungsverfolgung

Nehmen wir an, dass Ihre Berechnung nur aus einer einheitlichen Entwicklung und Messung der Menge von Qubits besteht, dh es gibt keine Dekohärenz, Wahrscheinlichkeitskarten usw. Nehmen wir weiter an, dass Sie von einem vollständig trennbaren Zustand wie | ausgehen 0 n . Zu diesem Zeitpunkt ist jedes Qubit trennbar, und es reicht aus, n verschiedene Register zu führen, die jeweils den Zustand eines trennbaren Qubits übermitteln. Wenn Ihr erstes Gate nur eine Single-Qubit-Operation U auf Qubit istn|0nnU , aktualisieren Sie einfach den auf Qubit i gespeicherten Statusals | ψ iU |ii , und Sie haben nichts anderes zu berühren.|ψiU|ψi

Wenn Sie beispielsweise ein Zwei-Qubit-Gate zwischen den Qubits i und j ausführen möchten, müssen Sie die Zustände an beiden Standorten kombinieren. Sie ersetzen also jeweils zwei Register der Dimension 2 durch ein Register der Dimension 4, das den Zustand V | enthält ψ i| ψ j . Das Problem ist, dass Sie diesen Status jetzt nicht mehr aufteilen können, sodass Sie diese beiden Qubits für immer in einem Register aufbewahren müssen. Wenn Sie jemals ein 1-Qubit-Gatter U haben , das auf Qubit i angewendet werden soll , müssen Sie jetzt | anwenden ψ i , jU IVijV|ψi|ψjUi . Wenn Sie dann das nächste Mal ein 2-Qubit-Gate zwischen beispielsweise j möchten|ψi,jUI|ψi,jjund , Sie müssen die Leerzeichen für kombinierenk und k. Diese Leerzeichen werden weiter wachsen, aber wenn ein Gate nur auf einem Leerzeichen lokalisiert ist, müssen Sie es nur dort anwenden (indem Sie I- Operatoren verwenden, um es auf den Rest der Qubits aufzufüllen), und Sie müssen nichts mit dem tun andere Räume.(i,j)kI

Wenn Sie solche Dinge tun, haben Sie (zumindest für die ersten Schritte Ihres Algorithmus) kein einziges -Elementregister. Sie müssen eine Reihe verschiedener Register haben und verfolgen, welche Qubits von welchem ​​Register in einem separaten Array beschrieben werden. Jedes Mal, wenn Sie die Leerzeichen einiger Qubits kombinieren, aktualisieren Sie dieses zusätzliche Array.2n

Hier ist ein sehr grober Pseudocode, der mir helfen kann, meine Bedeutung zu vermitteln:

#initialise variables
entangled_blocks={{1},{2},{3},...,{n}}
quantum_states={{1,0},{1,0},...,{1,0}}

#apply action of each gate
for each gate
   for each gate_target
       target_block=entangled_blocks entry containing gate_target
   next gate_target
   if all target_blocks equal then
      apply gate on target_block (pad with identity on other qubits)
   else
      new_entangled_block=union(target_blocks)
      new_state_vec=tensor_product(quantum_states for each target block)
      apply gate on new_state_vec (pad with identity on other qubits)
      replace all target_blocks in entangled_blocks with new_entangled_block
      replace all quantum_states(all target blocks) with new_state_vec
   end if
next gate

Andere Optionen

(Auf keinen Fall erschöpfend)

Vielleicht möchten Sie mehr über Matrix-Produktzustände erfahren, die eine gute Möglichkeit darstellen, Informationen über nicht zu verwickelte Zustände zu kapseln, und die möglicherweise eine alternative Route für Sie darstellen, je nachdem, was genau Sie erreichen möchten.

DaftWullie
quelle
Was ich erreichen will, ist natürlich Effizienz. Außerdem möchte ich genau wissen, wie all diese Prozesse funktionieren (weil ich ein Noobie bin). In der Praxis ist es also besser, alle Qubit-Koeffizienten zusammen in einem einzigen Array (Datensatz) zu speichern, oder? Danke für die Antwort.
Midhun XDA
2n×2n2n
@MidhunXDA In Bezug auf die Effizienz ist alles im Wesentlichen gleichwertig, da ein Quantencomputer schließlich dazu führt, dass sich alles verwickelt. Um zu erfahren, was los ist, beginnen Sie wahrscheinlich besser mit dem einzelnen Array, das dem Zustandsvektor entspricht. Durch die Verwendung der Verschränkungsverfolgung können Sie jedoch einige Geschwindigkeits- und Speicherverbesserungen erzielen, die etwas längere Simulationen ermöglichen sollten.
DaftWullie
@NorbertSchuch Ich sagte, es sei "ausreichend", das zu tun, was wahr ist. Ich habe einige weitere Details hinzugefügt, wie dies vermieden werden kann. Sie kennen wahrscheinlich andere, bessere Taktiken.
DaftWullie