Vai al contenuto principale

Pratica con Qiskit: Hello World - Qiskit Patterns

In questo notebook esplorerai un flusso di lavoro Qiskit Patterns e utilizzerai il primitivo Sampler di Qiskit.

Questo tutorial include in parte contenuti tratti da IBM Quantum Documentation: Hello World.

Link utili:

  1. Per favore crea un account IBM Cloud per accedere alla IBM Quantum Platform.
  2. Utilizzeremo una piattaforma cloud per configurare un ambiente di programmazione. Puoi usare QBraid oppure Google Colab.
  3. Dopo questo notebook, daremo un'occhiata al protocollo di Quantum Teleportation.

Altri link - community Qiskit e risorse per approfondire:

Installare Qiskit ​

Puoi usare un ambiente jupyter lab online (vedi la guida Online lab environments) oppure installare Qiskit in locale.

Segui la guida all'installazione di Qiskit Install the Qiskit SDK and the Qiskit Runtime client per completare i seguenti passaggi:

  • Installa Qiskit inclusi i pacchetti extra per la visualizzazione: pip install qiskit[visualization]

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

  • Installa jupyter: pip install jupyter Verifica che la versione di Python utilizzata nel tuo ambiente sia python>=3.10, per assicurarti che sia compatibile con l'ultima versione di Qiskit:

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

print(python_version())
3.13.7

Se hai bisogno di aggiornare Python e non sai come farlo, consulta questa guida su come aggiornare Python in base al tuo sistema operativo: 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.

Effettuare le importazioni necessarie​

Effettuiamo le importazioni necessarie per questo tutorial.

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

Configura il tuo account IBM Quantum Platform ​

Per eseguire circuiti quantistici su hardware reale, avrai bisogno di un account IBM Cloud.

Segui le istruzioni in questa guida Configura il tuo account IBM Cloud per completare i seguenti passaggi:

  1. Configura un account IBM Cloud se non ne hai ancora uno.
  2. Accedi o crea un account IBM Quantum Platform con un IBMid.
  3. Accedi alla tua dashboard IBM Quantum Platform, crea il tuo token API, e copialo in un luogo sicuro. (Vedi la prima immagine di riferimento qui sotto.)
  4. Nella cella di codice successiva alle immagini di riferimento, sostituisci deleteThisAndPasteYourAPIKeyHere con la tua chiave API.
  5. Vai alla pagina Istanze dal menù principale ☰ e crea la tua istanza. Se non fai parte di un'istituzione della Rete, scegli il piano aperto. (Vedi la seconda immagine di riferimento qui sotto.)
  6. Dopo la creazione dell'istanza, copia il suo codice CRN associato. (CRN sta per Cloud Resource Names) Potrebbe essere necessario aggiornare la pagina per vedere l'istanza.
  7. Nella cella di codice successiva alle immagini di riferimento, sostituisci deleteThisAndPasteYourCRNHere con il tuo codice CRN.

Nota: Tratta la tua chiave API come faresti con una password sicura. Consulta la guida Configura il tuo account IBM Cloud per ulteriori informazioni sull'utilizzo della tua chiave API in ambienti sicuri e non attendibili.

#@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,
)

Crea ed esegui un semplice algoritmo quantistico usando il framework Qiskit pattern ​

Il framework concettuale Qiskit pattern può essere considerato l'anatomia di un algoritmo quantistico.

I quattro passi per scrivere un programma quantistico usando i Qiskit pattern sono:

  1. Mappa il problema in un formato nativo quantistico.

  2. Ottimizza i Circuit e gli operatori.

  3. Esegui usando una funzione primitiva Qiskit.

  4. Analizza i risultati.

Passo 1. Mappa il problema in un formato nativo quantistico​

In un programma quantistico, i Circuit quantistici sono il formato nativo in cui rappresentare le istruzioni quantistiche, e gli operatori rappresentano le osservabili da misurare. Quando si crea un Circuit, di solito si crea un nuovo oggetto QuantumCircuit, poi si aggiungono istruzioni in sequenza.

Dimostrazione: Costruire Circuit quantistici di base in Qiskit ​

Proviamo a costruire alcuni Circuit semplici con 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')

Diagramma del Circuit quantistico

# 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')

Diagramma del Circuit quantistico

Esercizio: Costruire Circuit quantistici di base in Qiskit ​

Crea un Circuit per lo stato di Bell ∣00⟩+∣11⟩2\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')

Diagramma del Circuit quantistico

Lo stato iniziale del Circuit quantistico è lo stato ∣00⟩\ket{00}.

Lo stato finale è:

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

22∣00⟩+22∣11⟩\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Una nota sulla numerazione dei bit in Qiskit

Qiskit numera i bit in una stringa da destra a sinistra. L'SDK Qiskit usa la numerazione dei bit LSb 0. Quando si visualizza o interpreta un elenco di nn bit (o qubit) come stringa, il bit n−1n-1 è il bit più a sinistra, e il bit 00 è il bit più a destra. Ciò è perché di solito scriviamo i numeri con la cifra più significativa a sinistra, e in Qiskit il bit n−1n-1 viene interpretato come il bit più significativo. Per ulteriori dettagli, consulta l'argomento Ordinamento dei bit nell'SDK Qiskit.

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

qc2.draw("mpl")

Diagramma del Circuit quantistico

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

∣10⟩ |10\rangle

Abbiamo bisogno di Gate di misura?

Quando si creano Circuit quantistici, bisogna anche considerare quale tipo di dati si vuole restituire dopo l'esecuzione. Qiskit fornisce due modi per restituire dati: puoi ottenere il valore atteso di un'osservabile, oppure puoi ottenere una distribuzione di probabilità per un insieme di qubit che scegli di misurare. Prepara il tuo carico di lavoro per misurare il tuo Circuit in uno di questi due modi con le primitive Qiskit.

  • Primitiva Sampler - restituisce una distribuzione di probabilità per un insieme di qubit che scegli di misurare. Ad es.:
  • Primitiva Estimator - restituisce il valore atteso di un'osservabile. Ad es.:

Oggi useremo il Sampler, quindi dobbiamo aggiungere Gate di misura al nostro 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')

Diagramma del Circuit quantistico

Passo 2. Ottimizza i Circuit per l'hardware di destinazione​

Quando si eseguono Circuit su un dispositivo, è importante ottimizzare l'insieme di istruzioni contenute nel Circuit e minimizzare la profondità complessiva (approssimativamente il numero di istruzioni) del Circuit. Questo garantisce di ottenere i migliori risultati possibili riducendo gli effetti di errore e rumore. Inoltre, le istruzioni del Circuit devono essere conformi all'Instruction Set Architecture (ISA) del dispositivo Backend e devono tenere conto dei gate nativi e della connettività dei qubit del dispositivo.

Il codice seguente istanzia un simulatore a cui inviare un job e trasforma il Circuit e le osservabili per corrispondere all'ISA di quel Backend. Nota che useremo un dispositivo reale più avanti.

# 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)

Diagramma del Circuit quantistico

Passo 3. Esegui usando le primitive Qiskit​

I computer quantistici possono produrre risultati casuali, quindi di solito si raccoglie un campione degli output eseguendo il Circuit molte volte. Puoi stimare il valore dell'osservabile usando la classe Estimator. Il Sampler può essere usato per ottenere dati da un computer quantistico. Questi oggetti possiedono un metodo run() che esegue la selezione di Circuit, osservabili e parametri (se applicabili), usando un primitive unified bloc (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()

Passo 4. Post-elabora i risultati​

Questo passo riguarda la post-elaborazione dei risultati. Potresti inserire questi risultati in un altro flusso di lavoro per ulteriori analisi o preparare un grafico dei valori e dei dati chiave. In generale, questo passo è specifico per il tuo problema.

  • Per il Sampler, tracciamo la distribuzione di probabilità ottenuta campionando il Circuit quantistico tante volte quanto il numero di shot specificato usando 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)

Output del codice

Esegui un programma su un dispositivo reale

Se vuoi eseguire questo codice su un dispositivo reale, puoi usare il codice seguente.

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)

Output del codice

Recupero dei risultati da un job completato​

La cella qui sotto dimostra come puoi recuperare i risultati da un job completato.

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

Output del codice