Aller au contenu principal

Pratique avec Qiskit : Hello World - Qiskit Patterns

Dans ce notebook, tu vas parcourir un workflow Qiskit Patterns et utiliser le Sampler primitive de Qiskit.

Ce tutoriel s’appuie en partie sur le contenu de IBM Quantum Documentation : Hello World.

Liens utiles :

  1. Crée un compte IBM Cloud pour accéder à IBM Quantum Platform.
  2. Nous utiliserons une plateforme en ligne pour configurer un environnement de codage. Tu peux utiliser QBraid ou Google Colab.
  3. Après ce notebook, nous examinerons le protocole de téléportation quantique.

Plus de liens - communauté Qiskit et ressources pour aller plus loin :

Installer Qiskit

Tu peux utiliser un environnement jupyter lab en ligne (voir le guide Online lab environments) ou installer Qiskit localement.

Suis le guide d’installation de Qiskit Install the Qiskit SDK and the Qiskit Runtime client pour effectuer les étapes suivantes :

  • Installe Qiskit en incluant les packages de visualisation supplémentaires : pip install qiskit[visualization]

  • Installe qiskit-ibm-runtime : pip install qiskit-ibm-runtime

  • Installe jupyter : pip install jupyter Vérifie que la version de Python utilisée dans ton environnement est python>=3.10, afin de t’assurer qu’elle est compatible avec la dernière version de Qiskit :

# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version

print(python_version())
3.13.7

Si tu dois mettre à jour Python et que tu ne sais pas comment faire, consulte ce guide sur la mise à jour de Python selon ton système d’exploitation : How to update Python

%pip install qiskit[visualization]
%pip install qiskit-ibm-runtime
%pip install
%pip install qiskit-aer
zsh:1: no matches found: qiskit[visualization]
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-ibm-runtime in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.43.0)
Requirement already satisfied: requests>=2.19 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.32.5)
Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (1.3.0)
Requirement already satisfied: numpy>=1.13 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.3.3)
Requirement already satisfied: urllib3>=1.21.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.5.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.9.0.post0)
Requirement already satisfied: ibm-platform-services>=0.22.6 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (0.69.0)
Requirement already satisfied: pydantic>=2.5.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.12.2)
Requirement already satisfied: qiskit>=1.4.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.2.1)
Requirement already satisfied: packaging in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (25.0)
Requirement already satisfied: ibm_cloud_sdk_core<4.0.0,>=3.24.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (3.24.2)
Requirement already satisfied: PyJWT<3.0.0,>=2.10.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.2->ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (2.10.1)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-ibm-runtime) (1.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (2025.10.5)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.7.0)
Requirement already satisfied: pydantic-core==2.41.4 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (2.41.4)
Requirement already satisfied: typing-extensions>=4.14.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (4.15.0)
Requirement already satisfied: typing-inspection>=0.4.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.4.2)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.17.1)
Requirement already satisfied: scipy>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (1.16.2)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (5.5.0)
Requirement already satisfied: cryptography>=1.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (46.0.2)
Requirement already satisfied: pyspnego>=0.4.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (0.12.0)
Requirement already satisfied: cffi>=2.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.0.0)
Requirement already satisfied: pycparser in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.23)
Note: you may need to restart the kernel to use updated packages.
ERROR: You must give at least one requirement to install (see "pip help install")
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-aer in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.17.2)
Requirement already satisfied: qiskit>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.2.1)
Requirement already satisfied: numpy>=1.16.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.3.3)
Requirement already satisfied: scipy>=1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (1.16.2)
Requirement already satisfied: psutil>=5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (7.1.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.17.1)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (5.5.0)
Requirement already satisfied: typing-extensions in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (4.15.0)
Note: you may need to restart the kernel to use updated packages.

Effectuer les imports nécessaires

Effectuons les imports nécessaires pour ce tutoriel.

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import qiskit_ibm_runtime
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.quantum_info import SparsePauliOp
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector, plot_state_qsphere
from IPython.display import display, Latex

Configurer ton compte IBM Quantum Platform

Pour exécuter des circuits quantiques sur du matériel réel, tu auras besoin d'un compte IBM Cloud.

Suis les instructions de ce guide Configurer ton compte IBM Cloud pour effectuer les étapes suivantes :

  1. Crée un compte IBM Cloud si tu n'en as pas encore.
  2. Connecte-toi ou crée un compte IBM Quantum Platform avec un IBMid.
  3. Accède à ton tableau de bord IBM Quantum Platform, crée ton jeton API, et copie-le dans un endroit sécurisé. (Voir la première image de référence ci-dessous.)
  4. Dans la cellule de code qui suit les images de référence, remplace deleteThisAndPasteYourAPIKeyHere par ta clé API.
  5. Va sur la page Instances depuis le menu principal ☰ et crée ton instance. Si tu ne fais pas partie d'une institution réseau, choisis le plan ouvert. (Voir la deuxième image de référence ci-dessous.)
  6. Une fois l'instance créée, copie le code CRN associé. (CRN signifie Cloud Resource Names) Il est possible que tu aies besoin de rafraîchir la page pour voir l'instance.
  7. Dans la cellule de code qui suit les images de référence, remplace deleteThisAndPasteYourCRNHere par ton code CRN.

Remarque : Traite ta clé API comme un mot de passe sécurisé. Consulte le guide Configurer ton compte IBM Cloud pour plus d'informations sur l'utilisation de ta clé API dans des environnements sécurisés et non fiables.

#@title personals
your_api_key = "YOUR_API_KEY"
your_crn = "YOUR_CRN"
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key to access real devices

your_api_key = your_api_key
your_crn = your_crn

QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
set_as_default=True,
overwrite=True,
)

Créer et exécuter un algorithme quantique simple avec le framework de patterns Qiskit

Le framework conceptuel des patterns Qiskit peut être considéré comme l'anatomie d'un algorithme quantique.

Les quatre étapes pour écrire un programme quantique avec les patterns Qiskit sont :

  1. Mapper le problème vers un format natif quantique.

  2. Optimiser les circuits et les opérateurs.

  3. Exécuter à l'aide d'une fonction primitive Qiskit.

  4. Analyser les résultats.

Étape 1. Mapper le problème vers un format natif quantique

Dans un programme quantique, les circuits quantiques sont le format natif pour représenter les instructions quantiques, et les opérateurs représentent les observables à mesurer. Lors de la création d'un Circuit, tu crées généralement un nouvel objet QuantumCircuit, puis tu y ajoutes des instructions en séquence.

Démonstration : Construire des circuits quantiques de base dans Qiskit

Essayons de construire quelques circuits simples avec Qiskit.

# Simple quantum circuit with two qubits and two classical bits

# Create quantum circuit with 2 qubits and 2 classical bits
qc = QuantumCircuit(2)

# Add gates to your circuit
qc.x(0)
qc.s(1)

# Draw the output using MatPlotLib
qc.draw(output='mpl')

Quantum circuit diagram

# Quantum circuit with a Quantum Register named 'qr' that has two qubits, and a Classical Register named 'cr' with two classical bits

# Create a quantum register with 2 qubits, register label is 'qr'
qreg = QuantumRegister(2)

# Create a classical register with 2 qubits, register label is 'cr'
creg = ClassicalRegister(2)

# Create a quantum circuit with registers qreg and creg
qc = QuantumCircuit(qreg, creg)

# Add gates to your registers
qc.x(qreg[0])

# Draw the quantum circuit
qc.draw(output='mpl')

Quantum circuit diagram

Exercice : Construire des circuits quantiques de base dans Qiskit

Crée un Circuit pour l'état de Bell 00+112\frac{|00\rangle + |11\rangle}{\sqrt{2}}

# Create a new circuit with two qubits
qc = QuantumCircuit(2)

# Add a Hadamard gate to qubit 0
qc.h(0)

# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0,1)

# Return a drawing of the circuit using MatPlotLib ("mpl").
qc.draw('mpl')

Quantum circuit diagram

L'état initial du Circuit quantique est l'état 00\ket{00}.

L'état final est :

# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')

2200+2211\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Une remarque sur la numérotation des bits dans Qiskit

Qiskit numérote les bits dans une chaîne de droite à gauche. Le SDK Qiskit utilise la numérotation LSb 0. Lors de l'affichage ou de l'interprétation d'une liste de nn bits (ou qubits) sous forme de chaîne, le bit n1n−1 est le bit le plus à gauche, et le bit 00 est le bit le plus à droite. Cela est dû au fait que nous écrivons généralement les nombres avec le chiffre le plus significatif à gauche, et dans Qiskit, le bit n1n−1 est interprété comme le bit le plus significatif. Pour plus de détails, consulte la rubrique Ordre des bits dans le SDK Qiskit.

#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)

qc2.draw("mpl")

Quantum circuit diagram

sv2 = Statevector(qc2)
sv2.draw(output='latex')

10 |10\rangle

A-t-on besoin de gates de mesure ?

Lors de la création de circuits quantiques, tu dois également tenir compte du type de données que tu souhaites obtenir après l'exécution. Qiskit propose deux façons de retourner des données : tu peux obtenir la valeur attendue d'un observable, ou une distribution de probabilité pour un ensemble de qubits que tu choisis de mesurer. Prépare ta charge de travail pour mesurer ton Circuit de l'une de ces deux façons avec les primitives Qiskit.

  • Primitive Sampler - retourne une distribution de probabilité pour un ensemble de qubits que tu choisis de mesurer. Ex. :
  • Primitive Estimator - retourne la valeur attendue d'un observable. Ex. :

Nous utiliserons le Sampler aujourd'hui, donc nous devons ajouter des gates de mesure à notre Circuit.

# Use measure_all, which adds a barrier, applies measurement gates on all qubits, creates a classical register called `meas`
qc.measure_all()
qc.draw('mpl')

Quantum circuit diagram

Étape 2. Optimiser les circuits pour le matériel cible

Lors de l'exécution de circuits sur un dispositif, il est important d'optimiser l'ensemble des instructions que contient le Circuit et de minimiser la profondeur globale (approximativement le nombre d'instructions) du Circuit. Cela permet d'obtenir les meilleurs résultats possibles en réduisant les effets d'erreur et de bruit. De plus, les instructions du Circuit doivent être conformes à l'Architecture d'Ensemble d'Instructions (ISA) d'un Backend et prendre en compte les gates de base et la connectivité des qubits du dispositif.

Le code suivant instancie un simulateur pour soumettre un job et transforme le Circuit et les observables pour correspondre à l'ISA de ce Backend. Notez que nous utiliserons un vrai dispositif plus tard.

# option:
from qiskit_ibm_runtime.fake_provider import FakeTorino
backend = FakeTorino()
print(
f"Name: {backend.name}\n"
f"Version: {backend.version}\n"
f"Native gate set: {backend.operation_names}\n"
)

#to view other properties you can use properties()
# refer to https://docs.quantum.ibm.com/guides/get-qpu-information
Name: fake_torino
Version: 2
Native gate set: ['for_loop', 'delay', 'cz', 'id', 'sx', 'measure', 'reset', 'switch_case', 'if_else', 'rz', 'x']
# Convert to an ISA circuit
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)

isa_circuit_sampler = pm.run(qc)

isa_circuit_sampler.draw("mpl", idle_wires=False)

Quantum circuit diagram

Étape 3. Exécuter avec les primitives Qiskit

Les ordinateurs quantiques peuvent produire des résultats aléatoires, donc tu collectes généralement un échantillon des sorties en exécutant le Circuit plusieurs fois. Tu peux estimer la valeur de l'observable en utilisant la classe Estimator. Sampler peut être utilisé pour obtenir des données depuis un ordinateur quantique. Ces objets possèdent une méthode run() qui exécute la sélection de circuits, d'observables et de paramètres (le cas échéant), en utilisant un bloc unifié de primitive (PUB).

# Create a sampler instance using the selected backend
sampler = Sampler(backend)

# Run the sampler primitive on ISA circuit for specified number of shots (1024)

job_sampler = sampler.run([isa_circuit_sampler], shots=1024)

# Save the result of the job

result_sampler = job_sampler.result()

Étape 4. Post-traitement des résultats

Cette étape consiste à post-traiter tes résultats. Tu pourrais intégrer ces résultats dans un autre workflow pour une analyse plus approfondie ou préparer un graphique des valeurs et données clés. En général, cette étape est spécifique à ton problème.

  • Pour le Sampler, nous traçons la distribution de probabilité obtenue en échantillonnant le Circuit quantique autant de fois que le nombre de shots que tu as spécifié, en utilisant plot_histogram.
from qiskit.visualization import plot_histogram

counts = result_sampler[0].data.meas.get_counts()
# Note: meas is the default name of the classical register when using measure_all().
# If you specify a classical register, then use the name you assign

# Plot the result
plot_histogram(counts)

Code output

Exécuter un programme sur un vrai dispositif

Si tu souhaites exécuter ce code sur un vrai dispositif, tu peux utiliser le code suivant.

from qiskit_ibm_runtime import QiskitRuntimeService

# View the list of backends you have access to

service = QiskitRuntimeService()

service.backends()
management.get:WARNING:2025-11-03 14:24:36,838: Loading default saved account
[<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]
# Get backend
backend_real = service.least_busy(simulator=False, operational=True)

#backend_real = service.backend(name="insert_backend_name") # use this if you want to choose a specific backend

sampler = Sampler(backend_real)

pm = generate_preset_pass_manager(backend=backend_real, optimization_level=3)
isa_circuit = pm.run(qc)

job = sampler.run([isa_circuit], shots=1024)
print(job.job_id)
<bound method BasePrimitiveJob.job_id of <RuntimeJobV2('d444lcg7i53s73e4n6tg', 'sampler')>>
result = job.result()
print(
f"Name: {backend_real.name}\n"
f"Version: {backend_real.version}\n"
f"Native gate set: {backend_real.operation_names}\n"
)
Name: ibm_fez
Version: 2
Native gate set: ['delay', 'cz', 'id', 'sx', 'measure', 'reset', 'if_else', 'rz', 'x']
counts = result[0].data.meas.get_counts()

plot_histogram(counts)

Code output

Récupérer les résultats d'un job terminé

La cellule ci-dessous montre comment récupérer les résultats d'un job terminé.

service = QiskitRuntimeService()
retrieved_job = service.job('d40mquhsg33c73dhhs00')
result = retrieved_job.result()
counts = result[0].data.meas.get_counts()
plot_histogram(counts)
management.get:WARNING:2025-11-03 14:24:55,135: Loading default saved account

Code output