Aller au contenu principal

Bibliothèque de circuits

Versions des packages

Le code de cette page a été développé avec les dépendances suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

qiskit[all]~=2.3.0

Le SDK Qiskit inclut une bibliothèque de circuits populaires à utiliser comme blocs de construction dans tes propres programmes. Utiliser des circuits prédéfinis permet de gagner du temps en recherche, en écriture de code et en débogage. La bibliothèque comprend des circuits populaires en informatique quantique, des circuits difficiles à simuler classiquement, et des circuits utiles pour le benchmarking du matériel quantique.

Cette page liste les différentes catégories de circuits que la bibliothèque propose. Pour une liste complète des circuits, consulte la documentation de l'API de la bibliothèque de circuits.

Portes standard

La bibliothèque de circuits inclut également des portes quantiques standard. Certaines sont des portes plus fondamentales (comme la UGate), et d'autres sont des portes multi-qubits qui nécessitent généralement d'être construites à partir de portes à un ou deux qubits. Pour ajouter des portes importées à ton circuit, utilise la méthode append ; le premier argument est la porte, et l'argument suivant est une liste de qubits auxquels appliquer la porte.

Par exemple, le code suivant crée un circuit avec une porte de Hadamard et une porte multi-contrôlée-X.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
from qiskit.circuit.library import HGate, MCXGate

mcx_gate = MCXGate(3)
hadamard_gate = HGate()

qc = QuantumCircuit(4)
qc.append(hadamard_gate, [0])
qc.append(mcx_gate, [0, 1, 2, 3])
qc.draw("mpl")

Sortie de la cellule de code précédente

Consulte Standard gates dans la documentation de l'API de la bibliothèque de circuits.

Tu ne sais pas comment s'appelle ta porte ? Essaie de demander à Qiskit Code Assistant.

Circuits N-locaux

Ces circuits alternent des couches de portes de rotation à un qubit avec des couches de portes d'intrication multi-qubits.

Cette famille de circuits est populaire dans les algorithmes quantiques variationnels car elle peut produire une grande variété d'états quantiques. Les algorithmes variationnels ajustent les paramètres des portes pour trouver des états qui possèdent certaines propriétés (par exemple, des états qui représentent une bonne solution à un problème d'optimisation). À cette fin, de nombreux circuits de la bibliothèque sont paramétrés, ce qui signifie qu'on peut les définir sans valeurs fixes.

Le code suivant importe un circuit n_local, dans lequel les portes d'intrication sont des portes à deux qubits. Ce circuit entrelace des blocs de portes RX paramétrées à un qubit, suivis de blocs d'intrication de portes CZ à deux qubits. Le code suivant crée un circuit à trois qubits, avec des portes RX à un qubit et des portes CZ à deux qubits.

from qiskit.circuit.library import n_local

two_local = n_local(3, "rx", "cz")
two_local.draw("mpl")

Sortie de la cellule de code précédente

Tu peux obtenir un objet de type liste des paramètres du circuit via l'attribut parameters.

two_local.parameters
ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])

Tu peux aussi utiliser cela pour assigner des valeurs réelles à ces paramètres à l'aide d'un dictionnaire de la forme { Parameter: nombre }. Pour illustrer cela, le code suivant assigne la valeur 0 à chaque paramètre du circuit.

bound_circuit = two_local.assign_parameters(
{p: 0 for p in two_local.parameters}
)
bound_circuit.decompose().draw("mpl")

Sortie de la cellule de code précédente

Pour plus d'informations, consulte N-local gates dans la documentation de l'API de la bibliothèque de circuits, ou suis le cours de conception d'algorithmes variationnels sur IBM Quantum Learning.

Circuits d'encodage de données

Ces circuits paramétrés encodent des données sur des états quantiques pour être traités par des algorithmes d'apprentissage automatique quantique. Parmi les circuits pris en charge par Qiskit :

  • L'encodage d'amplitude, qui encode chaque nombre dans l'amplitude d'un état de base. Cela permet de stocker 2n2^n nombres dans un seul état, mais peut être coûteux à mettre en œuvre.
  • L'encodage en base, qui encode un entier kk en préparant l'état de base correspondant k|k\rangle.
  • L'encodage angulaire, qui définit chaque nombre dans les données comme un angle de rotation dans un circuit paramétré.

La meilleure approche dépend des spécificités de ton application. Sur les ordinateurs quantiques actuels, cependant, on utilise souvent des circuits d'encodage angulaire comme le zz_feature_map.

from qiskit.circuit.library import zz_feature_map

features = [0.2, 0.4, 0.8]
feature_map = zz_feature_map(feature_dimension=len(features))

encoded = feature_map.assign_parameters(features)
encoded.draw("mpl")

Sortie de la cellule de code précédente

Consulte Data encoding circuits dans la documentation de l'API de la bibliothèque de circuits.

Circuits d'évolution temporelle

Ces circuits simulent l'évolution d'un état quantique dans le temps. Utilise les circuits d'évolution temporelle pour étudier des effets physiques tels que le transfert de chaleur ou les transitions de phase dans un système. Les circuits d'évolution temporelle constituent également un bloc de construction fondamental des fonctions d'onde chimiques (comme les états d'essai unitary coupled-cluster) et de l'algorithme QAOA utilisé pour les problèmes d'optimisation.

from qiskit.circuit.library import PauliEvolutionGate
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp

# Prepare an initial state with a Hadamard on the middle qubit
state = QuantumCircuit(3)
state.h(1)

hamiltonian = SparsePauliOp(["ZZI", "IZZ"])
evolution = PauliEvolutionGate(hamiltonian, time=1)

# Evolve state by appending the evolution gate
state.compose(evolution, inplace=True)

state.draw("mpl")

Sortie de la cellule de code précédente

Lis la documentation de l'API PauliEvolutionGate.

Circuits de benchmarking et de théorie de la complexité

Les circuits de benchmarking nous donnent une idée de la qualité réelle de fonctionnement de notre matériel, et les circuits de théorie de la complexité nous aident à comprendre la difficulté des problèmes que nous souhaitons résoudre.

Par exemple, le benchmark « quantum volume » mesure avec quelle précision un ordinateur quantique exécute un type de circuit quantique aléatoire. Le score de l'ordinateur quantique augmente avec la taille du circuit qu'il peut exécuter de manière fiable. Cela prend en compte tous les aspects de l'ordinateur, notamment le nombre de qubits, la fidélité des instructions, la connectivité des qubits, et la pile logicielle qui transpile et post-traite les résultats. Pour en savoir plus sur le quantum volume, consulte l'article original sur le quantum volume.

Le code suivant montre un exemple de circuit quantum volume construit dans Qiskit qui s'exécute sur quatre qubits (les blocs unitary sont des portes à deux qubits aléatoires).

from qiskit.circuit.library import quantum_volume

quantum_volume(4).draw("mpl")

Sortie de la cellule de code précédente

La bibliothèque de circuits inclut également des circuits supposés difficiles à simuler classiquement, comme les circuits IQP (instantaneous quantum polynomial). Ces circuits intercalent certaines portes diagonales (dans la base computationnelle) entre des blocs de portes de Hadamard.

Parmi les autres circuits, on trouve grover_operator pour une utilisation dans l'algorithme de Grover, et le circuit fourier_checking pour le problème de vérification de Fourier. Consulte ces circuits dans Particular quantum circuits dans la documentation de l'API de la bibliothèque de circuits.

Circuits arithmétiques

Les opérations arithmétiques sont des fonctions classiques, comme l'addition d'entiers et les opérations bit à bit. Elles peuvent être utiles avec des algorithmes tels que l'estimation d'amplitude pour des applications financières, et dans des algorithmes comme l'algorithme HHL, qui résout des systèmes d'équations linéaires.

À titre d'exemple, essayons d'additionner deux nombres de trois bits en utilisant un circuit « ripple-carry » pour effectuer une addition en place (FullAdderGate). Cet additionneur additionne deux nombres (qu'on appellera « A » et « B ») et écrit le résultat dans le registre qui contenait B. Dans l'exemple suivant, A=2 et B=3.

from qiskit.circuit.library import FullAdderGate
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister

adder = FullAdderGate(3) # Adder of 3-bit numbers

# Create the number A=2
reg_a = QuantumRegister(3, "a")
number_a = QuantumCircuit(reg_a)
number_a.initialize(2) # Number 2; |010>

# Create the number B=3
reg_b = QuantumRegister(3, "b")
number_b = QuantumCircuit(reg_b)
number_b.initialize(3) # Number 3; |011>

# Create a circuit to hold everything, including a classical register for
# the result
qregs = [
QuantumRegister(1, "cin"),
QuantumRegister(3, "a"),
QuantumRegister(3, "b"),
QuantumRegister(1, "cout"),
]
reg_result = ClassicalRegister(3)
circuit = QuantumCircuit(*qregs, reg_result)

# Compose number initializers with the adder. Adder stores the result to
# register B, so we'll measure those qubits.
circuit = (
circuit.compose(number_a, qubits=reg_a)
.compose(number_b, qubits=reg_b)
.compose(adder)
)
circuit.measure(reg_b, reg_result)
circuit.draw("mpl")

Sortie de la cellule de code précédente

La simulation du circuit montre qu'il produit 5 pour les 1024 shots (c'est-à-dire qu'il est mesuré avec une probabilité de 1.0).

from qiskit.primitives import StatevectorSampler

result = StatevectorSampler().run([circuit]).result()

print(f"Count data:\n {result[0].data.c0.get_int_counts()}")
Count data:
{5: 1024}

Consulte Arithmetic dans la documentation de l'API de la bibliothèque de circuits.

Prochaines étapes

Recommandations