Sari la conținutul principal

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:

  1. Te rugăm creează un cont IBM Cloud pentru a accesa IBM Quantum Platform.
  2. Vom folosi o platformă în cloud pentru a configura un mediu de programare. Poți folosi fie QBraid, fie Google Colab.
  3. După acest notebook, vom analiza protocolul Quantum Teleportation.

Mai multe linkuri - comunitatea Qiskit și resurse suplimentare de învățare:

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 jupyter Verifică 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.
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.

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:

  1. Creează un cont IBM Cloud dacă nu ai deja unul.
  2. Conectează-te sau creează un cont IBM Quantum Platform cu un IBMid.
  3. 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.)
  4. În celula de cod de după imaginile de referință, înlocuiește deleteThisAndPasteYourAPIKeyHere cu cheia ta API.
  5. 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.)
  6. 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.
  7. În celula de cod de după imaginile de referință, înlocuiește deleteThisAndPasteYourCRNHere cu 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:

  1. Mapează problema într-un format nativ cuantic.

  2. Optimizează circuitele și operatorii.

  3. Execută folosind o funcție primitivă Qiskit.

  4. 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 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

Exercițiu: Construirea unor circuite cuantice de bază în Qiskit

Creează un circuit pentru starea 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

Starea inițială a circuitului cuantic este starea 00\ket{00} .

Starea finală este:

# 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

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 nn biți (sau qubiți) ca șir de caractere, bitul n1n−1 este bitul cel mai din stânga, iar bitul 00 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 n1n−1 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")

Quantum circuit diagram

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

10 |10\rangle

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

Quantum circuit diagram

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)

Quantum circuit diagram

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, folosind 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

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)

Code output

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

Code output