In diesem Artikel werden wir die Quantenteleportation mit Python sehen.

Wie oft begannen die Handlungsstränge der Episoden von Rick und Morty damit, dass Rick und Morty durch ihr Portal in eine verrückte alternative Dimension gingen? Ohne das Portal hätten wir vielleicht nicht die Lieblings-Animations-TV-Show aller. Aber haben Sie sich jemals Gedanken darüber gemacht, wie dieses Portal funktioniert? Darüber werden wir heute sprechen, Quantenteleportation.

Was ist die Notwendigkeit für Quantenteleportation?

Abgesehen davon, dass es absolut genial wäre? Nun, wie wir bereits wissen, sind Quantencomputer klassischen Computern nicht wirklich ähnlich. Ein solcher Unterschied zwischen den beiden ist das Kopieren von Daten. Wenn Sie die Aufgabe Ihres Freundes kopieren müssen, klicken Sie einfach auf die Daten und erstellen eine Kopie davon, richtig? Nun, die Sache mit Quantenbits ist, dass sie im Quantenzustand bleiben, bis sie unbeobachtet bleiben. Sobald wir sie beobachten (oder anklicken), kollabieren sie in einen der bekannten Zustände. Dies wird auch No-Cloning-Theorem genannt . Um Daten auf einen Quantencomputer zu kopieren, benötigen wir daher den Prozess der Quantenteleportation. Mit technologischen Fortschritten hat sich die Quantenteleportation jedoch zu einer Anwendung für vollständig sichere Übertragungen entwickelt. 

Die Theorie hinter dem Algorithmus

Nehmen wir der Einfachheit halber an, dass es zwei Freunde gibt, Kartik und Sharanya. Sharanya möchte irgendeine Form von Quantendaten, möglicherweise ein Qubit, an Kartik senden. Da sie den Zustand des Qubits aufgrund des No-Cloning-Theorems nicht beobachten kann, nimmt sie die Hilfe des sogenannten „Portals“ in Anspruch, um die Daten zu übertragen. Was das Portal also im Grunde macht, ist, dass es eine Verschränkung zwischen einem Qubit von Sharanya und einem eigenen Qubit erzeugt und das verschränkte Paar nach Kartik schickt. Dann müsste Kartik einige Aktionen ausführen, um die Verschränkung zu entfernen und die Ausgabe zu erhalten. 

Für diejenigen unter Ihnen, die keine Ahnung haben, was Quantenverschränkung ist, heißt es kurz gesagt, dass wir erwarten können, dass das andere Qubit auch einen Einfluss hat, wenn etwas mit einem Qubit passiert, selbst wenn die beiden Qubits sind nirgendwo nahe beieinander. Eine weitere interessante Sache, die zu beachten ist, warum dies Quantenteleportation genannt wird, ist, dass Sharanya nicht mehr genau das gleiche Qubit hat wie sie, das jetzt bei Kartik ist.  

Sich nähern:

Schritt 1: Das Portal erstellt ein verschränktes Paar von Qubits, ein spezielles Paar, das als Bells Paar bekannt ist. Um ein Bell-Paar mit Quantum Circuits zu erstellen, müssen wir ein Qubit nehmen und es mit einem Hadamard-Gatter in den (|+> oder |->) Zustand versetzen und dann ein CNOT-Gatter auf dem anderen Qubit verwenden, was sein wird gesteuert durch das erste Qubit. Eines der Qubits wird Sharanya (z. B. Q1) übergeben, das andere Kartik (z. B. Q2). 

Schritt 2: Angenommen, das Qubit, das Sharanya senden möchte, ist |Ψ> = |∝> + |β>. Sie muss ein CNOT-Gatter auf Q1 anwenden, das von |Ψ> gesteuert wird. Ein CNOT-Gatter ist im Grunde die " wenn dies, dann das" -Bedingung der Quantenwelt. 

Schritt 3 : Sharanya misst die zwei Qubits, die sie hat, und speichert sie in zwei klassischen Bits. Sie sendet diese Informationen dann an Kartik (eine Übertragung kann erfolgen, da klassische Bits gesendet werden). Da Qubits 2 n klassische Bits verarbeiten können, können wir sagen, dass die Ausgaben, die Sharanya mit ihrer Berechnung erhält, immer eine probabilistische Antwort sein werden, die 00, 01, 10 und 11 (alle Permutationen von 0 und 1) enthält. 

Schritt 4 : Jetzt muss Kartik nur noch bestimmte Transformationen an dem Qubit durchführen, das er hat, Q2, das Teil eines verschränkten Paares ist. Dieser Teil stammt aus der Quantenmechanik, Sie können ihn also einfach als Tatsache kennen, oder die Komplexität des Artikels wird um ein Vielfaches zunehmen. Wenn Kartik also eine 00 bekommt, muss er ein I-Gate beantragen. Für 01 muss ein X-Gate angewendet werden, für 10 muss ein Z-Gate angewendet werden und für 11 muss ein ZX-Gate angewendet werden. 

Und da haben wir es. Kartik hat jetzt ein Qubit im selben Zustand wie der Zustand, in dem Sharanya ihr Qubit ursprünglich hatte. 

Modul benötigt

Qiskit :   Qiskit ist ein Open-Source-Framework für Quantencomputing. Es bietet Tools zum Erstellen und Manipulieren von Quantenprogrammen und deren Ausführung auf Prototypen von Quantengeräten auf IBM Q Experience oder auf Simulatoren auf einem lokalen Computer. Mal sehen, wie wir eine einfache Quantenschaltung erstellen und auf einem echten Quantencomputer testen oder lokal in unserem Computer simulieren können .

Einbau :

pip install qiskit

Schrittweise Umsetzung

Schritt 1: Erstellen des Quantenschaltkreises, auf dem wir Operationen durchführen werden. 

QuantumCircuit akzeptiert zwei Argumente, die Anzahl der Qubits, die wir nehmen möchten, und die Anzahl der klassischen Bits, die wir nehmen möchten. 

Python

from qiskit import *
  
circuit = QuantumCircuit(3, 3)
%matplotlib inline
  
# Whenever during any point of the program we
# want to see how our circuit looks like,
# this is what we will be doing.
circuit.draw(output='mpl')

Ausgabe: 

So sieht unsere Schaltung gerade aus. Wir haben drei Quantenbits und drei klassische Bits, die verwendet werden, um die Werte dieser Qubits zu messen, wann immer wir wollen. Im Moment haben sie keinen Wert in sich. 

Schritt 2: Anwenden eines X-Gates auf das Qubit, das wir teleportieren müssen. Wir werden auch eine Barriere hinzufügen, nur um die Strecke klarer zu machen. 

Was wir bisher getan haben, ist, dass wir 3 Qubits haben. Was wir tun werden, ist, dass wir q1 verwenden, um Daten von q0 nach q3 zu transportieren. Dazu verwenden wir ein X-Gatter, um q0 in den Zustand 1 zu versetzen 

Python

circuit.x(0)  # used to apply an X gate.
  
# This is done to make the circuit look more 
# organized and clear.
circuit.barrier()
circuit.draw(output='mpl')

Ausgabe:

So sieht unsere Schaltung gerade aus. Auf einem der Qubits haben wir ein X-Tor hinzugefügt, das durch das X angezeigt wird. Eine Barriere wird hinzugefügt, um die Schaltung besser zu organisieren, während wir weiterhin Tore und andere Dinge hinzufügen. Die klassischen Bits sind noch unberührt. 

Schritt 3: Erzeugen einer Verschränkung zwischen Q1 und Q2 durch Anwenden eines Hadamard-Gatters auf Q1 und eines CX-Gatters auf Q1 und Q2, so dass das Verhalten von Q1 das Verhalten von Q2 beeinflusst. 

Hier erzeugen wir eine Verschränkung, sodass das Verhalten des ersten Qubits das Verhalten des zweiten Qubits beeinflusst. 

Python

# This is how we apply a Hadamard gate on Q1.
circuit.h(1)
  
# This is the CX gate, which takes two parameters,
# one being the control qubit and the
# other being the target qubit.
circuit.cx(1, 2)
circuit.draw(output='mpl')

Ausgabe:

Hier können wir sehen, dass nach diesem Schritt unsere Schaltung so aussieht. Wir haben ein Hadamard-Gate, das auf Q1 angewendet wird, dargestellt durch das 'H'-Symbol, und ein kontrolliertes NICHT(CX)-Gate auf Q1 und Q2. Die klassischen Bits sind noch unberührt. 

Erzeugen einer Verschränkung zwischen Q0 und Q1 durch Anwenden eines Hadamard-Gatters auf Q0 und eines CX-Gatters auf Q0 und Q1, sodass das Verhalten von Q1 das Verhalten von Q0 beeinflusst. Im Wesentlichen haben wir also ein System, bei dem das Verhalten eines der Qubits das Verhalten aller Qubits beeinflusst. Q1 kann als das Portal betrachtet werden, von dem wir oben gesprochen haben. Wir werden nun auch die Qubits auf die klassischen Bits projizieren und die Werte von Q0 und Q1 messen. 

Python

# The next step is to create a controlled
# gate between qubit 0 and qubit 1.
# Also we will be applying a Hadamard gate to q0.
circuit.cx(0, 1)
circuit.h(0)
  
# Done for clarification of the circuit again.
circuit.barrier()
  
# the next step is to do the two measurements
# on q0 and q1.
circuit.measure([0, 1], [0, 1])
  
# circuit.measure can take any number of arguments,
# and has the following parameters:
# [qubit whos value is to be measured,
# classical bit where the value is stored]
circuit.draw(output='mpl')

Ausgabe: 

Hier können wir sehen, wie unsere Schaltung aussieht. Mit Hilfe von Barrieren können Sie leicht unterscheiden, was in diesem Schritt getan wurde. Wir haben ein Hadamard-Gatter auf Q0 angewendet, dargestellt durch das 'H'-Symbol, und ein kontrolliertes NOT(CX)-Gatter auf Q0 und Q1. Die klassischen Bits werden jetzt verwendet, wobei die schwarzen Symbole zeigen, dass wir den Wert von Q0 und Q1 genommen und in klassischem Bit 1 und klassischem Bit 2 gespeichert haben. 

Die eigentliche Erklärung erfordert ein Verständnis der Quantenmechanik, sodass man einfach verstehen kann, dass wir für eine 00-Messung der klassischen Bits ein I-Gatter anwenden müssen. Für 01 muss ein X-Gate angewendet werden, für 10 muss ein Z-Gate angewendet werden und für 11 muss ein ZX-Gate angewendet werden. Da wir nicht wissen, welcher Wert in klassischen Bits gespeichert wird, wenden wir die allgemeineren Steuer-X-Gatter und Steuer-Z-Gatter an. 

Der letzte Schritt besteht darin, zwei weitere Gatter hinzuzufügen, ein gesteuertes x-Gatter und ein gesteuertes z-Gatter (wir haben diesen Schritt im obigen Text besprochen, der angibt, welche Gatter für verschiedene Messungen anzuwenden sind). 

Python

circuit.barrier()
circuit.cx(1, 2)
circuit.cz(0, 2)
circuit.draw(output='mpl')

Ausgabe: 

Dies ist die letzte erforderliche Schaltung für die Quantenteleportation. Nach der Barriere können wir sehen, dass ein kontrolliertes X-Gate auf Q1 und Q2 angewendet wurde, sodass das Verhalten von Q2 das Verhalten von Q1 beeinflusst. Außerdem wurde ein Steuer-Z-Gate wie gezeigt zwischen Q0 und Q2 angewendet. 

Jetzt, da unsere Schaltung erstellt wurde, müssen wir diese Schaltung nur noch an einen Simulator übergeben, damit wir die Ergebnisse der Schaltung zurückerhalten können. Sobald wir die Ergebnisse zurückerhalten, zeichnen wir ein Histogramm aus den Werten der klassischen Bits, die wir erhalten haben. Sie können sich das, was wir jetzt getan haben, als einen von uns erstellten abstrakten Datentyp vorstellen, und der folgende Code ist die Hauptfunktion, in der wir ihn verwenden werden. Jeder Schritt wurde zum einfachen Verständnis des Lesers ausführlich erklärt. 

Python

# The first step is to call a simulator
# which we will use to perform simulations.
from qiskit.tools.visualization import plot_histogram
sim = Aer.get_backend('qasm_simulator')
  
# here, like before, we have given the
# classical bit 2 the value of the Quantum bit 2.
circuit.measure(2, 2)
  
# Now, we run the execute function,
# which takes our quantum circuit,
# the backend which we are using and
# the number of shots we want
# (shots are to increase accuracy and
# mitigate errors in Quantum Computing).
# All of this is stored in a variable called result
  
result = execute(circuit, backend=sim, shots=1000).result()
counts = result.get_counts()
  
# This counts variable shows that for each possible combination,
# how many times the circuit gave a similar output
# (for example, 111 came x times, 101 came y times etc.)
  
# importing plot_histogram which will help us visualize the results.
plot_histogram(counts)

Ausgabe: 

Wie beweist das, dass unser Algorithmus funktioniert hat? 

Nun, lass uns hier sehen. Für 3 Qubits können wir Zustände wie 100, 101, 111, 001 usw. haben (8 davon, um genau zu sein, grundlegendes P&C-Zeug). Wenn ich nun einen Wert von der x-Achse nehme, wird er folgendermaßen gelesen: 

[100] = [Wert gespeichert in klassischem Bit 2, gespeicherter Wert in klassischem Bit 1, gespeicherter Wert in klassischem Bit 0]

Wir haben gesagt, dass wir den gleichen Zustand auf dem ersten Qubit auf dem zweiten Qubit erzeugen werden. Der Zustand des ersten Qubits (das, das Sharanya hatte (Q0)) war 1. Und sehen Sie hier, wir haben nur die Permutationen erhalten, bei denen der Wert des zweiten klassischen Bits 1 ist, was beweist, dass der Wert des zweiten Qubits (derjenige, den Kartik hatte (Q2)) war auch 1!