Hands-on cu Qiskit: Hello World - Qiskit Patterns
În acest notebook vei parcurge un flux de lucru Qiskit Patterns și vei folosi primitiva Sampler a Qiskit.
Acest tutorial include parțial conținut din IBM Quantum Documentation: Hello World.
Linkuri utile:
- Te rugăm creează un cont IBM Cloud pentru a accesa IBM Quantum Platform.
- Pentru cei cu un e-mail universitar: obține un cod de funcționalitate aici pentru a prelungi perioada de probă gratuită.
- Pentru cei fără e-mail universitar: instrucțiuni pentru a-ți activa contul. Activează-ți complet contul înregistrând un card de credit. Cardul tău de credit nu va fi debitat în cadrul acestui proces sau aleatoriu după înregistrare. Această activare îți permite să continui să accesezi resursele gratuite din IBM Cloud și platforma IBM Quantum după încheierea perioadei de probă (30 de zile).
- Vom folosi o platformă în cloud pentru a configura un mediu de programare. Poți folosi fie QBraid, fie Google Colab.
- După acest notebook, vom analiza protocolul Quantum Teleportation.
Mai multe linkuri - comunitatea Qiskit și resurse suplimentare de învățare:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- Conferințe Qiskit Global Summer School 2025
- Certificație Qiskit v2.X
- Programul Qiskit advocate
- Stagii de vară în domeniul cuantic
- Qiskit YouTube
Instalează Qiskit
Poți folosi un mediu jupyter lab online (vezi ghidul Medii lab online) sau poți instala Qiskit local.
Urmează ghidul de instalare Qiskit Instalează SDK-ul Qiskit și clientul Qiskit Runtime pentru a finaliza următorii pași:
-
Instalează Qiskit inclusiv pachetele suplimentare de vizualizare:
pip install qiskit[visualization] -
Instalează qiskit-ibm-runtime:
pip install qiskit-ibm-runtime -
Instalează jupyter:
pip install jupyterVerifică că versiunea de Python folosită în mediul tău este python>=3.10, pentru a te asigura că este compatibilă cu cea mai recentă versiune Qiskit:
# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version
print(python_version())
3.13.7
Dacă trebuie să faci upgrade la Python și nu știi cum, te rog să consulți acest ghid despre cum să faci upgrade la Python în funcție de sistemul tău de operare: 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.
[31mERROR: You must give at least one requirement to install (see "pip help install")[0m[31m
[0mNote: 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.
Fă importurile necesare
Să facem importurile necesare pentru acest 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
Configurează-ți contul IBM Quantum Platform
Pentru a executa circuite cuantice pe hardware real, vei avea nevoie de un cont IBM Cloud.
Urmează instrucțiunile din acest ghid Configurează-ți contul IBM Cloud pentru a finaliza pașii următori:
- Creează un cont IBM Cloud dacă nu ai deja unul.
- Conectează-te sau creează un cont IBM Quantum Platform cu un IBMid.
- Accesează tabloul de bord IBM Quantum Platform, creează token-ul tău API și copiază-l într-un loc sigur. (Vezi prima imagine de referință de mai jos.)
- În celula de cod de după imaginile de referință, înlocuiește
deleteThisAndPasteYourAPIKeyHerecu cheia ta API. - Accesează pagina Instances din meniul principal ☰ și creează instanța ta. Dacă nu faci parte dintr-o instituție Network, alege planul deschis. (Vezi a doua imagine de referință de mai jos.)
- După ce instanța este creată, copiază codul CRN asociat. (CRN înseamnă Cloud Resource Names) Este posibil să fie nevoie să reîmprospătezi pentru a vedea instanța.
- În celula de cod de după imaginile de referință, înlocuiește
deleteThisAndPasteYourCRNHerecu codul tău CRN.
Notă: Tratează cheia ta API ca pe o parolă securizată. Consultă ghidul Configurează-ți contul IBM Cloud pentru mai multe informații despre utilizarea cheii API atât în medii sigure, cât și în medii neîncredibile.
#@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,
)
Creează și rulează un algoritm cuantic simplu folosind framework-ul de tipare Qiskit
Framework-ul conceptual al tiparului Qiskit poate fi considerat anatomia unui algoritm cuantic.
Cei patru pași pentru scrierea unui program cuantic folosind tiparele Qiskit sunt:
-
Mapează problema într-un format nativ cuantic.
-
Optimizează circuitele și operatorii.
-
Execută folosind o funcție primitivă Qiskit.
-
Analizează rezultatele.
Pasul 1. Mapează problema într-un format nativ cuantic
Într-un program cuantic, circuitele cuantice sunt formatul nativ în care se reprezintă instrucțiunile cuantice, iar operatorii reprezintă observabilele de măsurat. Când creezi un Circuit, de obicei creezi un nou obiect QuantumCircuit, apoi adaugi instrucțiuni în secvență.
Demonstrație: Construirea unor circuite cuantice de bază în Qiskit
Să încercăm să construim câteva circuite simple cu 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 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')
Exercițiu: Construirea unor circuite cuantice de bază în Qiskit
Creează un circuit pentru starea Bell
# 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')
Starea inițială a circuitului cuantic este starea .
Starea finală este:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
O notă despre numerotarea biților în Qiskit
Qiskit numerotează biții dintr-un șir de la dreapta la stânga. SDK-ul Qiskit folosește numerotarea biților LSb 0. La afișarea sau interpretarea unei liste de biți (sau qubiți) ca șir de caractere, bitul este bitul cel mai din stânga, iar bitul este bitul cel mai din dreapta. Aceasta se datorează faptului că de obicei scriem numerele cu cifra cea mai semnificativă în stânga, iar în Qiskit, bitul este interpretat ca bitul cel mai semnificativ. Pentru mai multe detalii, vezi subiectul Bit-ordering in the Qiskit SDK.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
Avem nevoie de porți de măsurare?
Când creezi circuite cuantice, trebuie să iei în considerare și ce tip de date vrei să fie returnate după execuție. Qiskit oferă două modalități de a returna date: poți obține valoarea de așteptare a unui observabil sau poți obține o distribuție de probabilitate pentru un set de qubiți pe care alegi să-i măsori. Pregătește-ți sarcina de lucru pentru a măsura circuitul într-unul din aceste două moduri cu primitivele Qiskit.
- Primitivul
Sampler- returnează o distribuție de probabilitate pentru un set de qubiți pe care alegi să-i măsori. Ex.:
- Primitivul
Estimator- returnează valoarea de așteptare a unui observabil. Ex.:
Vom folosi Sampler astăzi, deci trebuie să adăugăm porți de măsurare circuitului nostru.
# 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')
Pasul 2. Optimizează circuitele pentru hardware-ul țintă
Când se execută circuite pe un dispozitiv, este important să se optimizeze setul de instrucțiuni pe care le conține circuitul și să se minimizeze adâncimea totală (aproximativ numărul de instrucțiuni) a circuitului. Aceasta asigură obținerea celor mai bune rezultate posibile prin reducerea efectelor erorii și zgomotului. În plus, instrucțiunile circuitului trebuie să respecte Instruction Set Architecture (ISA) a unui dispozitiv backend și trebuie să țină cont de porțile de bază ale dispozitivului și conectivitatea qubiților.
Următorul cod inițializează un simulator pentru a trimite un job și transformă circuitul și observabilele pentru a corespunde ISA-ului acelui backend. Reține că vom folosi un dispozitiv real mai târziu.
# 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)

Pasul 3. Execută folosind primitivele Qiskit
Calculatoarele cuantice pot produce rezultate aleatorii, deci de obicei colectezi un eșantion din ieșiri rulând circuitul de mai multe ori. Poți estima valoarea observabilului folosind clasa Estimator. Sampler poate fi folosit pentru a obține date de la un calculator cuantic. Aceste obiecte posedă o metodă run() care execută selecția de circuite, observabile și parametri (dacă este cazul), folosind un bloc unificat primitiv (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()
Pasul 4. Post-procesează rezultatele
Acest pas implică post-procesarea rezultatelor tale. Poți introduce aceste rezultate într-un alt flux de lucru pentru analiză suplimentară sau poți pregăti o reprezentare grafică a valorilor și datelor cheie. În general, acest pas este specific problemei tale.
- Pentru
Sampler, reprezentăm grafic distribuția de probabilitate obținută prin eșantionarea circuitului cuantic de atâtea ori câte shots ai specificat, folosindplot_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)

Rulează un program pe un dispozitiv real
Dacă vrei să rulezi acest cod pe un dispozitiv real, poți folosi codul următor.
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)

Preluarea rezultatelor dintr-un job finalizat
Celula de mai jos demonstrează cum poți prelua rezultatele dintr-un job finalizat.
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
