Téléportation quantique et codage superdense
Kifumi Numata (26 avr. 2024)
Télécharger le PDF du cours original. Attention, certains extraits de code pourraient être obsolètes car il s'agit d'images statiques.
Le temps QPU approximatif pour exécuter cette expérience est de 10 secondes.
1. Introduction
Pour résoudre tout problème quantique à l'échelle utilitaire, nous aurons besoin de déplacer de l'information sur un ordinateur quantique d'un qubit à un autre. Il existe des protocoles bien connus pour ce faire, mais certains des plus fondamentaux ont été formulés dans le contexte de l'envoi d'information entre des parties distantes. Tout au long de cette leçon, nous utiliserons parfois un langage cohérent avec ce contexte, comme « des amis distants qui s'envoient de l'information ». Mais garde à l'esprit que ces protocoles ont une portée plus large en informatique quantique. Dans cette leçon, nous examinons les protocoles de communication quantique suivants :
- Téléportation quantique Utiliser un état intriqué partagé (parfois appelé e-bit) pour envoyer un état quantique inconnu à un ami distant, en nécessitant une communication classique supplémentaire.
- Codage superdense quantique Comment envoyer deux bits d'information en transmettant un seul qubit à un ami distant (là encore en utilisant des qubits intriqués partagés au préalable).
Pour plus de contexte sur ces sujets, nous recommandons la leçon 4 des Bases de l'information quantique sur L'intrication en action.
Dans la description ci-dessus, un « état quantique inconnu » désigne simplement un état de la forme décrite dans la leçon précédente :
où et sont des nombres complexes tels que . Cela nous permet d'écrire l'état quantique sous la forme
Puisque nous voulons pouvoir transférer l'information contenue dans n'importe quel état quantique aléatoire, la génération d'un tel état sera notre point de départ dans cette leçon.
2. Matrices densité
On peut aussi écrire l'état quantique sous forme de matrice densité. Cette représentation est utile pour décrire un mélange probabiliste d'états quantiques purs. Dans le cas d'un seul qubit, on peut écrire
Note que la matrice densité est une combinaison linéaire des matrices de Pauli, comme ci-dessous,
Ou, de manière générale,
où .
Et le vecteur de Bloch est .
Maintenant, créons un état quantique arbitraire à l'aide de nombres aléatoires.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
import numpy as np
# create a random 1-qubit state from a random (theta, varphi) to define r vector
np.random.seed(1) # fixing seed for repeatibility
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
def get_r_vec(theta, varphi):
rx = np.sin(theta) * np.cos(varphi)
ry = np.sin(theta) * np.sin(varphi)
rz = np.cos(theta)
return (rx, ry, rz)
# get r vector
rx, ry, rz = get_r_vec(theta, varphi)
print("theta=" + str(theta), ",varphi=" + str(varphi))
print("(rx, ry, rz) = (" + str(rx) + ", " + str(ry) + ", " + str(rz) + ")")
theta=1.3101132663588946 ,varphi=4.525932273597346
(rx, ry, rz) = (-0.1791150283307452, -0.9494670044331133, 0.2577405946274022)
On peut représenter ce vecteur de Bloch sur la sphère de Bloch.
from qiskit.visualization import plot_bloch_vector
r = [rx, ry, rz]
plot_bloch_vector(r)
3. Tomographie d'état quantique
Si tu mesures l'état quantique uniquement dans la base computationnelle ( et ), l'information de phase (l'information sur les nombres complexes) sera perdue. Mais si on dispose de nombreuses copies de en répétant le processus de préparation (on ne peut pas cloner des états, mais on peut répéter les processus de préparation), on peut estimer les valeurs de en réalisant une tomographie d'état quantique pour la matrice densité . Étant donné la forme :
il s'ensuit que
Dans le cas de ,
La dernière transformation de l'équation est valable pour . On peut donc obtenir en calculant la probabilité de moins la probabilité de .
Estimer la valeur de
Pour estimer , nous créons un état quantique et le mesurons. Nous répétons ensuite la préparation et la mesure de nombreuses fois. Enfin, nous utilisons les statistiques des mesures pour estimer les probabilités ci-dessus et ainsi estimer .
Pour créer l'état quantique aléatoire, nous utiliserons la porte unitaire générale avec les paramètres . (Consulter la porte U pour plus d'informations.)
from qiskit import QuantumCircuit
# create a 1-qubit quantum state psi from theta, varphi parameters
qc = QuantumCircuit(1, 1)
qc.u(theta, varphi, 0.0, 0)
# measure in computational basis
qc.measure(0, 0)
qc.draw(output="mpl")
En utilisant l'AerSimulator, nous allons mesurer dans la base computationnelle pour estimer .
# see if the expected value of measuring in the computational basis
# approaches the limit of rz
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import Sampler
from qiskit.visualization import plot_histogram
# Define backend
backend = AerSimulator()
nshots = 1000 # or 10000
# nshots = 10000
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc], shots=nshots)
result = job.result()
# Extract counts data
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'1': 375, '0': 625}
rz_approx = (counts["0"] - counts["1"]) / nshots
print("rz = ", rz, " and approx of rz = ", rz_approx)
rz = 0.2577405946274022 and approx of rz = 0.25
En utilisant la méthode de tomographie d'état quantique, nous avons estimé la valeur de . Dans ce cas, comme nous avons choisi un paramètre pour l'état « aléatoire », nous connaissons la valeur de et pouvons vérifier notre résultat. Mais par nature, les travaux à l'échelle utilitaire ne sont pas toujours aussi simples à vérifier. Nous aborderons plus en détail la vérification des résultats quantiques plus loin dans ce cours. Pour l'instant, note simplement que notre estimation était raisonnablement précise.
Exercice 1 : Estimer la valeur de
Rappelle-toi que les ordinateurs quantiques IBM® mesurent le long de l'axe (parfois formulé « dans la base » ou « dans la base computationnelle »). Cependant, en appliquant des rotations avant la mesure, nous pouvons aussi mesurer la projection de l'état quantique sur l'axe x. Pour être plus précis, si nous faisons pivoter notre système de sorte que ce qui pointait le long de pointe maintenant le long de , alors nous pouvons conserver le même matériel de mesure le long de , tout en apprenant des informations sur l'état qui pointait le long de un instant auparavant. C'est ainsi que la plupart des ordinateurs quantiques (et tous les ordinateurs quantiques IBM) effectuent des mesures selon plusieurs axes.
Avec cette compréhension, essaie d'écrire du code pour estimer la valeur de en utilisant la tomographie d'état quantique.
Solution :
# create a 1-qubit quantum state psi from theta, varphi parameters
qc = QuantumCircuit(1, 1)
qc.u(theta, varphi, 0.0, 0)
qc.h(0)
qc.measure(0, 0)
qc.draw(output="mpl")
# Define backend
backend = AerSimulator()
nshots = 10000
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc], shots=nshots)
result = job.result()
# Extract counts data
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'1': 5925, '0': 4075}
rx_approx = (counts["0"] - counts["1"]) / nshots
print("rx = ", rx, " and approx of rx = ", rx_approx)
rx = -0.1791150283307452 and approx of rx = -0.185
Exercice 2 : Estimer la valeur de
En utilisant les mêmes arguments logiques que précédemment, nous pouvons faire pivoter le système avant la mesure pour obtenir des informations sur .
Essaie d'écrire toi-même du code pour estimer la valeur de en utilisant la tomographie d'état quantique. Tu peux partir de l'exemple précédent, mais effectuer des rotations différentes. (Pour plus d'informations sur les diverses portes utilisées, notamment sdg, consulte la référence API.)
Solution :
# create a 1-qubit quantum state psi from theta, varphi parameters
qc = QuantumCircuit(1, 1)
qc.u(theta, varphi, 0.0, 0)
qc.sdg(0)
qc.h(0)
qc.measure(0, 0)
qc.draw(output="mpl")
# Define backend
backend = AerSimulator()
nshots = 10000
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc], shots=nshots)
result = job.result()
# Extract counts data
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'1': 9759, '0': 241}
ry_approx = (counts["0"] - counts["1"]) / nshots
print("ry = ", ry, " and approx of ry = ", ry_approx)
ry = -0.9494670044331133 and approx of ry = -0.9518
Nous avons maintenant estimé toutes les composantes de et pouvons écrire le vecteur complet.
print("Estimated vector is (", rx_approx, ",", ry_approx, ",", rz_approx, ").")
print("Original random vector was (" + str(rx) + ", " + str(ry) + ", " + str(rz) + ").")
Estimated vector is ( -0.185 , -0.9518 , 0.25 ).
Original random vector was (-0.1791150283307452, -0.9494670044331133, 0.2577405946274022).
Tu as obtenu une estimation assez précise du vecteur aléatoire original grâce à cette méthode de tomographie d'état quantique.
4. Téléportation quantique
Considérons la situation où un personnage, Alice, souhaite envoyer un état quantique inconnu à son ami Bob, qui est loin. Supposons qu'ils ne peuvent communiquer que par communication classique (par e-mail ou par téléphone). Alice ne peut pas copier l'état quantique (en raison du théorème de non-clonage). Si elle répétait le même processus de préparation de nombreuses fois, elle pourrait accumuler des statistiques comme nous venons de le faire. Mais que se passe-t-il s'il n'y a qu'un seul état inconnu ? Cet état a peut-être émergé d'un processus physique que tu veux étudier. Ou il pourrait faire partie d'un calcul quantique plus grand. Dans ce cas, comment Alice pourrait-elle envoyer l'état à Bob ? Elle le peut, si elle et Bob partagent une précieuse ressource quantique : un état intriqué partagé, comme l'état de Bell introduit dans la leçon précédente : Tu verras parfois aussi cela appelé « paire EPR » ou « e-bit » (unité fondamentale d'intrication). Si Alice partage un tel état intriqué avec Bob, elle peut téléporter l'état quantique inconnu à Bob en effectuant une série d'opérations quantiques et en lui envoyant deux bits d'information classique.
4.1 Le protocole de téléportation quantique
Hypothèse : Alice possède un état quantique inconnu à envoyer à Bob. Alice et Bob partagent un état intriqué à 2 qubits, ou e-bit, chacun ayant physiquement l'un des qubits à son emplacement.
Voici un aperçu de la procédure sans explication. Les détails seront implémentés ci-dessous.
- Alice intrique avec sa partie de l'e-bit en utilisant la porte CNOT.
- Alice applique une porte Hadamard à et mesure ses deux qubits dans la base computationnelle.
- Alice envoie à Bob ses résultats de mesure (soit « 00 », « 01 », « 10 » ou « 11 »)
- Bob effectue un opérateur de correction basé sur les deux bits d'information d'Alice sur sa partie de la paire e-bit.
- Si « 00 », Bob ne fait rien
- Si « 01 », Bob applique la porte X
- Si « 10 », Bob applique la porte Z
- Si « 11 », Bob applique iY = ZX
- La partie de l'e-bit de Bob devient .
Ceci est également développé plus en détail dans Bases de l'information quantique. Mais la situation deviendra plus claire au fur et à mesure que nous l'instancierons dans Qiskit.
4.2 Circuit quantique simulant la téléportation quantique
Comme toujours, nous appliquerons le cadre des Qiskit patterns. Cette sous-section se concentrera uniquement sur la cartographie.
Étape 1 : Mapper le problème sur des circuits et des opérateurs quantiques
Pour décrire le scénario ci-dessus, nous avons besoin d'un circuit à trois qubits : deux pour la paire intriquée partagée par Alice et Bob, et un pour l'état quantique inconnu .
from qiskit import QuantumCircuit
import numpy as np
# create 3-qubits circuit
qc = QuantumCircuit(3, 3)
qc.draw(output="mpl")
Au départ, Alice possède un état quantique inconnu Nous allons le créer en utilisant la porte .
# Create the unknown quantum state using the u-gate. Alice has this.
qc.u(theta, varphi, 0.0, 0)
qc.barrier() # for visual separation
qc.draw(output="mpl")
Nous pouvons visualiser l'état que nous avons créé, mais uniquement parce que nous connaissons les paramètres utilisés dans la porte . Si cet état avait émergé d'un processus quantique complexe, l'état ne serait pas connaissable sans exécuter le processus pour créer l'état de nombreuses fois et collecter des statistiques comme dans la tomographie.
# show the quantum state on bloch sphere
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
out_vector = Statevector(qc)
plot_bloch_multivector(out_vector)