Implémentation avec Qiskit
Dans la leçon précédente, nous avons découvert les classes Statevector et Operator de Qiskit, et nous les avons utilisées pour simuler des opérations et des mesures sur des qubits individuels.
Dans cette section, nous allons utiliser ces classes pour explorer le comportement de plusieurs qubits.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.1.1
Commençons par importer les classes Statevector et Operator, ainsi que la fonction racine carrée de NumPy.
À partir de maintenant, en règle générale, nous prendrons soin d'effectuer tous les imports nécessaires en premier dans chaque leçon.
from qiskit.quantum_info import Statevector, Operator
from numpy import sqrt
Produits tensoriels
La classe Statevector dispose d'une méthode tensor, qui renvoie le produit tensoriel de ce Statevector avec un autre, passé en argument.
L'argument est interprété comme le facteur tensoriel de droite.
Par exemple, ci-dessous nous créons deux vecteurs d'état représentant et et utilisons la méthode tensor pour créer un nouveau vecteur,
Remarque : ici, nous utilisons la méthode from_label pour définir les états et plutôt que de les définir nous-mêmes.
zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))
Les autres labels autorisés incluent "+" et "-" pour les états plus et moins, ainsi que "r" et "l" (abréviation de "right" et "left", c'est-à-dire droite et gauche) pour les états
Ici, "+" , "-" ou "right" et "left" proviennent du contexte du spin en mécanique quantique, dans lequel une composante du spin peut pointer vers la gauche ou vers la droite lors d'une expérience ; cela ne fait pas référence au qubit le plus à droite ou le plus à gauche dans des systèmes à plusieurs qubits. Voici un exemple du produit tensoriel de et
plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))
Une alternative consiste à utiliser l'opération ^ pour les produits tensoriels, ce qui donne naturellement les mêmes résultats.
display((plus ^ minus_i).draw("latex"))
La classe Operator dispose également d'une méthode tensor (ainsi qu'une méthode from_label), comme on peut le voir dans les exemples suivants.
H = Operator.from_label("H")
Id = Operator.from_label("I")
X = Operator.from_label("X")
display(H.tensor(Id).draw("latex"))
display(H.tensor(Id).tensor(X).draw("latex"))
De même que pour les vecteurs, l'opération ^ est équivalente.
display((H ^ Id ^ X).draw("latex"))
Les états composés peuvent être fait évoluer à l'aide d'opérations composées, comme on pourrait s'y attendre — tout comme nous l'avons vu pour les systèmes simples dans la leçon précédente. Par exemple, le code suivant calcule l'état pour (qui a déjà été défini ci-dessus).
display(phi.evolve(H ^ Id).draw("latex"))
Voici du code qui définit une opération et calcule pour Pour être précis, il s'agit d'une opération pour laquelle le qubit de gauche est le contrôle et le qubit de droite est la cible. Le résultat est l'état de Bell
CX = Operator([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])
psi = plus.tensor(zero)
display(psi.evolve(CX).draw("latex"))
Mesures partielles
Dans la leçon précédente, nous avons utilisé la méthode measure pour simuler une mesure d'un vecteur d'état quantique.
Cette méthode renvoie deux éléments : le résultat de mesure simulé, et le nouveau Statevector compte tenu de cette mesure.
Par défaut, measure mesure tous les qubits du vecteur d'état.
On peut également fournir une liste d'entiers en argument, ce qui entraîne la mesure uniquement des indices de qubits spécifiés.
Pour illustrer cela, le code ci-dessous crée l'état
et mesure le qubit numéro 0, qui est le qubit le plus à droite. (Qiskit numérote les qubits en commençant par 0, de droite à gauche. Nous reviendrons sur cette convention de numérotation dans la prochaine leçon.)
w = Statevector([0, 1, 1, 0, 1, 0, 0, 0] / sqrt(3))
display(w.draw("latex"))
result, state = w.measure([0])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))
result, state = w.measure([0, 1])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))
Measured: 0
State after measurement:
Measured: 00
State after measurement: