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 — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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"))
On peut faire évoluer les états composés à l'aide d'opérations composées, comme on s'y attendrait — tout comme nous l'avons vu pour les systèmes individuels 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, auquel cas seuls les qubits correspondant à ces indices sont mesuré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: