Přeskočit na hlavní obsah

Prakticky s Qiskitem: Hello World - Qiskit Patterns

V tomto notebooku projdeš pracovním postupem Qiskit Patterns a použiješ Qiskitův primitiv Sampler.

Tento tutoriál částečně vychází z obsahu IBM Quantum Documentation: Hello World.

Užitečné odkazy:

  1. Prosím vytvoř si účet na IBM Cloud pro přístup k IBM Quantum Platform.
  2. Použijeme cloudovou platformu pro nastavení prostředí pro psaní kódu. Můžeš použít buď QBraid nebo Google Colab.
  3. Po tomto notebooku se podíváme na protokol kvantové teleportace.

Další odkazy – komunita Qiskit a zdroje pro další vzdělávání:

Instalace Qiskitu

Můžeš použít online prostředí jupyter lab (viz průvodce Online lab environments) nebo nainstalovat Qiskit lokálně.

Postupuj podle instalačního průvodce Qiskitu Install the Qiskit SDK and the Qiskit Runtime client a proveď následující kroky:

  • Nainstaluj Qiskit včetně doplňkových balíčků pro vizualizaci: pip install qiskit[visualization]

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

  • Nainstaluj jupyter: pip install jupyter Zkontroluj, že verze Pythonu, kterou ve svém prostředí používáš, je python>=3.10, aby byla kompatibilní s nejnovější verzí Qiskitu:

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

print(python_version())
3.13.7

Pokud potřebuješ upgradovat Python a nevíš jak, podívej se na tohoto průvodce upgradem Pythonu podle tvého operačního systému: 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.

Proveď nezbytné importy

Proveďme nezbytné importy pro tento tutoriál.

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

Nastavení účtu IBM Quantum Platform

Abys mohl/a spouštět kvantové obvody na skutečném hardwaru, budeš potřebovat účet IBM Cloud.

Postupuj podle pokynů v tomto průvodci Nastavení účtu IBM Cloud a dokonči následující kroky:

  1. Pokud ještě nemáš účet IBM Cloud, vytvoř si ho.
  2. Přihlas se nebo vytvoř účet IBM Quantum Platform pomocí IBMid.
  3. Přejdi na nástěnku IBM Quantum Platform, vytvoř svůj API token a ulož ho na bezpečné místo. (Viz první referenční obrázek níže.)
  4. V buňce s kódem za referenčními obrázky nahraď deleteThisAndPasteYourAPIKeyHere svým API klíčem.
  5. Přejdi na stránku Instances v nabídce ☰ hlavního menu a vytvoř svoji instanci. Pokud nejsi součástí síťové instituce, zvol otevřený plán. (Viz druhý referenční obrázek níže.)
  6. Po vytvoření instance zkopíruj přidružený kód CRN. (CRN je zkratka pro Cloud Resource Names) Možná bude nutné stránku obnovit, aby se instance zobrazila.
  7. V buňce s kódem za referenčními obrázky nahraď deleteThisAndPasteYourCRNHere svým kódem CRN.

Poznámka: Zacházej se svým API klíčem jako s bezpečným heslem. Více informací o používání API klíče v bezpečných i nedůvěryhodných prostředích najdeš v průvodci Nastavení účtu IBM Cloud.

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

Vytvoření a spuštění jednoduchého kvantového algoritmu pomocí frameworku Qiskit pattern

Konceptuální framework Qiskit pattern lze považovat za anatomii kvantového algoritmu.

Čtyři kroky k napsání kvantového programu pomocí Qiskit patterns jsou:

  1. Namapuj problém do kvantově nativního formátu.

  2. Optimalizuj obvody a operátory.

  3. Spusť pomocí primitivní funkce Qiskit.

  4. Analyzuj výsledky.

Krok 1. Namapování problému do kvantově nativního formátu

V kvantovém programu jsou kvantové obvody nativním formátem pro reprezentaci kvantových instrukcí a operátory reprezentují pozorovatelné veličiny, které se mají měřit. Při vytváření obvodu obvykle vytvoříš nový objekt QuantumCircuit a pak do něj postupně přidáváš instrukce.

Ukázka: Sestavení základních kvantových obvodů v Qiskitu

Zkusme sestavit jednoduché obvody s Qiskitem.

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

Diagram kvantového obvodu

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

Diagram kvantového obvodu

Cvičení: Sestavení základních kvantových obvodů v Qiskitu

Vytvoř obvod pro Bellův stav 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')

Diagram kvantového obvodu

Počáteční stav kvantového obvodu je stav 00\ket{00}.

Výsledný stav je:

# 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

Poznámka k číslování bitů v Qiskitu

Qiskit čísluje bity v řetězci zprava doleva. Qiskit SDK používá číslování bitů LSb 0. Při zobrazení nebo interpretaci seznamu nn bitů (nebo qubitů) jako řetězce je bit n1n-1 nejlevější bit a bit 00 je nejpravější bit. Je to proto, že čísla obvykle zapisujeme s nejvýznamnější cifrou vlevo, a v Qiskitu je bit n1n-1 interpretován jako nejvýznamnější bit. Více podrobností najdeš v tématu Řazení bitů v Qiskit SDK.

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

qc2.draw("mpl")

Diagram kvantového obvodu

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

10 |10\rangle

Potřebujeme měřicí hradla?

Při vytváření kvantových obvodů musíš také zvážit, jaký typ dat chceš po spuštění vrátit. Qiskit poskytuje dva způsoby vracení dat: můžeš získat střední hodnotu pozorovatelné veličiny nebo pravděpodobnostní distribuci pro sadu qubitů, které se rozhodneš měřit. Připrav svůj výpočet k měření obvodu jedním z těchto dvou způsobů pomocí primitiv Qiskit.

  • Primitiv Sampler – vrací pravděpodobnostní distribuci pro sadu qubitů, které se rozhodneš měřit. Např.:
  • Primitiv Estimator – vrací střední hodnotu pozorovatelné veličiny. Např.:

Dnes budeme používat Sampler, takže musíme přidat měřicí hradla do našeho obvodu.

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

Diagram kvantového obvodu

Krok 2. Optimalizace obvodů pro cílový hardware

Při spouštění obvodů na zařízení je důležité optimalizovat sadu instrukcí, které obvod obsahuje, a minimalizovat celkovou hloubku (přibližně počet instrukcí) obvodu. Tím zajistíš co nejlepší výsledky díky snížení vlivu chyb a šumu. Instrukce obvodu musí navíc odpovídat instrukční sadě architektury (ISA) backendového zařízení a musí zohledňovat jeho základní hradla a propojení qubitů.

Následující kód vytvoří instanci simulátoru, na který se úloha odešle, a transformuje obvod a operátory tak, aby odpovídaly ISA daného backendu. Upozorňujeme, že skutečné zařízení použijeme později.

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

Diagram kvantového obvodu

Krok 3. Spuštění pomocí primitiv Qiskit

Kvantové počítače mohou produkovat náhodné výsledky, takže obvykle sbíráš vzorek výstupů opakovaným spouštěním obvodu. Střední hodnotu pozorovatelné veličiny lze odhadnout pomocí třídy Estimator. Sampler lze použít k získání dat z kvantového počítače. Tyto objekty mají metodu run(), která spouští výběr obvodů, pozorovatelných veličin a parametrů (pokud jsou k dispozici) pomocí 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()

Krok 4. Následné zpracování výsledků

Tento krok zahrnuje následné zpracování výsledků. Tyto výsledky můžeš předat do dalšího pracovního postupu pro další analýzu nebo připravit graf klíčových hodnot a dat. Obecně platí, že tento krok je specifický pro tvůj problém.

  • Pro Sampler vykreslíme pravděpodobnostní distribuci získanou vzorkováním kvantového obvodu tolikrát, kolik snímků jsi zadal/a, pomocí 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)

Výstup kódu

Spuštění programu na skutečném zařízení

Pokud chceš tento kód spustit na skutečném zařízení, můžeš použít následující kód.

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)

Výstup kódu

Načtení výsledků z dokončené úlohy

Buňka níže ukazuje, jak lze načíst výsledky z dokončené úlohy.

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

Výstup kódu