דלג לתוכן הראשי

עבודה מעשית עם Qiskit: Hello World - Qiskit Patterns

במחברת זו תעבור/י על תהליך עבודה של Qiskit Patterns, ותשתמש/י ב-Sampler primitive של Qiskit.

מדריך זה מבוסס חלקית על תוכן מ-IBM Quantum Documentation: Hello World.

קישורים שימושיים:

  1. צור/י חשבון IBM Cloud כדי לגשת ל-IBM Quantum Platform.
    • לבעלי כתובת מייל אוניברסיטאית: קבל/י קוד feature כאן להארכת תקופת הניסיון החינמית.
    • לבעלי כתובת מייל שאינה אוניברסיטאית: הוראות להפעלת החשבון. הפעל/י את חשבונך במלואו על ידי רישום כרטיס אשראי. כרטיס האשראי שלך לא ייחייב בתהליך זה ולא באופן אקראי לאחר הרישום. הפעלה זו מאפשרת לך להמשיך לגשת למשאבים החינמיים ב-IBM Cloud וב-IBM Quantum Platform לאחר תקופת הניסיון (30 יום).
  2. נשתמש בפלטפורמה מבוססת-ענן להגדרת סביבת קידוד. תוכל/י להשתמש ב-QBraid או ב-Google Colab.
  3. לאחר מחברת זו, נבחן את פרוטוקול הטלפורטציה הקוונטית.

קישורים נוספים - קהילת Qiskit ומשאבי למידה:

התקנת Qiskit

ניתן להשתמש בסביבת jupyter lab מקוונת (ראה/י מדריך סביבות מעבדה מקוונות) או להתקין את Qiskit מקומית.

עקוב/י אחר מדריך ההתקנה של Qiskit Install the Qiskit SDK and the Qiskit Runtime client כדי להשלים את השלבים הבאים:

  • התקן/י את Qiskit כולל חבילות הויזואליזציה הנוספות: pip install qiskit[visualization]

  • התקן/י את qiskit-ibm-runtime: pip install qiskit-ibm-runtime

  • התקן/י את jupyter: pip install jupyter ודא/י שגרסת Python שבה אתה/את משתמש/ת בסביבה שלך היא python>=3.10, כדי לוודא שהיא תואמת לגרסת Qiskit העדכנית ביותר:

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

print(python_version())
3.13.7

אם עליך לשדרג את Python ואינך בטוח/ה כיצד לעשות זאת, ראה/י במדריך לשדרוג Python לפי מערכת ההפעלה שלך: 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.

ייבוא הספריות הנדרשות

בואו נייבא את הספריות הנדרשות למדריך זה.

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

הגדרת חשבון IBM Quantum Platform שלך

כדי להריץ Circuit-ים קוונטיים על חומרה אמיתית, תזדקק/י לחשבון IBM Cloud.

עקוב/י אחר ההוראות במדריך Set up your IBM Cloud account כדי להשלים את השלבים הבאים:

  1. הגדר/י חשבון IBM Cloud אם עדיין אין לך אחד.
  2. התחבר/י ל-IBM Quantum Platform או צור/י חשבון עם IBMid.
  3. גש/י ל-dashboard של IBM Quantum Platform, צור/י את ה-API token שלך, והעתק/י אותו למקום בטוח. (ראה/י את התמונה הראשונה למטה.)
  4. בתא הקוד שלאחר התמונות, החלף/י את deleteThisAndPasteYourAPIKeyHere במפתח ה-API שלך.
  5. עבור/י לדף Instances מתפריט ☰ הראשי וצור/י את ה-instance שלך. אם אינך חלק ממוסד רשת, בחר/י בתוכנית הפתוחה. (ראה/י את התמונה השנייה למטה.)
  6. לאחר יצירת ה-instance, העתק/י את קוד ה-CRN המשויך אליו. (CRN הוא קיצור של Cloud Resource Names) ייתכן שתצטרך/י לרענן כדי לראות את ה-instance.
  7. בתא הקוד שלאחר התמונות, החלף/י את deleteThisAndPasteYourCRNHere בקוד ה-CRN שלך.

שים/י לב: התייחס/י למפתח ה-API שלך כאילו הוא סיסמה מאובטחת. ראה/י במדריך Set up your IBM Cloud account לקבלת מידע נוסף על שימוש במפתח ה-API שלך בסביבות מאובטחות ולא מאובטחות.

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

צור והרץ אלגוריתם קוונטי פשוט באמצעות מסגרת הדפוסים של Qiskit

מסגרת הדפוסים הקונספטואלית של Qiskit אפשר לראות כמבנה האנטומי של אלגוריתם קוונטי.

ארבעת השלבים לכתיבת תוכנית קוונטית באמצעות דפוסי Qiskit הם:

  1. ממפים את הבעיה לפורמט קוונטי-נייטיב.

  2. מייעלים את ה-Circuits והאופרטורים.

  3. מריצים באמצעות פונקציית primitive של Qiskit.

  4. מנתחים את התוצאות.

שלב 1. מיפוי הבעיה לפורמט קוונטי-נייטיב

בתוכנית קוונטית, quantum circuits הם הפורמט הנייטיב לייצוג הוראות קוונטיות, ו-operators מייצגים את האובזרבלות שצריך למדוד. כשיוצרים Circuit, בדרך כלל יוצרים אובייקט QuantumCircuit חדש ואז מוסיפים לו הוראות ברצף.

הדגמה: בניית Circuits קוונטיים בסיסיים ב-Qiskit

בואו ננסה לבנות כמה Circuits פשוטים עם 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

תרגיל: בניית Circuits קוונטיים בסיסיים ב-Qiskit

צור Circuit עבור מצב בל 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

המצב ההתחלתי של ה-Circuit הקוונטי הוא מצב 00\ket{00}.

המצב הסופי הוא:

# 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

הערה על מספור הביטים ב-Qiskit

Qiskit ממספר את הביטים במחרוזת מימין לשמאל. ה-Qiskit SDK משתמש בשיטת מספור ביטים LSb 0. כשמציגים או מפרשים רשימה של nn ביטים (או Qubits) כמחרוזת, ביט n1n−1 הוא הביט השמאלי ביותר, וביט 00 הוא הביט הימני ביותר. הסיבה היא שבדרך כלל כותבים מספרים עם הספרה המשמעותית ביותר משמאל, וב-Qiskit, ביט n1n��−1 מתפרש כביט המשמעותי ביותר. לפרטים נוספים, ראו את הנושא 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

האם אנחנו צריכים Gate-ים של מדידה?

כשיוצרים Circuits קוונטיים, צריך גם לקחת בחשבון איזה סוג נתונים רוצים לקבל חזרה לאחר ההרצה. Qiskit מספקת שתי דרכים להחזרת נתונים: אפשר לקבל את ערך הציפייה של observable, או לקבל התפלגות הסתברות עבור קבוצת Qubits שבוחרים למדוד. הכינו את עומס העבודה שלכם למדידת ה-Circuit שלכם באחת משתי דרכים אלה עם Qiskit primitives.

  • Sampler primitive - מחזיר התפלגות הסתברות עבור קבוצת Qubits שבוחרים למדוד. לדוגמה:
  • Estimator primitive - מחזיר את ערך הציפייה של observable. לדוגמה:

נשתמש ב-Sampler היום, אז צריך להוסיף Gate-ים של מדידה ל-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

שלב 2. אופטימיזציה של ה-Circuits עבור חומרת היעד

כשמריצים Circuits על מכשיר, חשוב לבצע אופטימיזציה על קבוצת ההוראות שה-Circuit מכיל ולמזער את העומק הכולל (בערך מספר ההוראות) של ה-Circuit. זה מבטיח שתקבלו את התוצאות הטובות ביותר על ידי צמצום השפעות השגיאה והרעש. בנוסף, הוראות ה-Circuit חייבות להתאים ל-Instruction Set Architecture (ISA) של מכשיר ה-Backend ולקחת בחשבון את ה-Gate-ים הבסיסיים וקישוריות ה-Qubit של המכשיר.

הקוד הבא מאתחל סימולטור להגשת עבודה אליו ומשנה את ה-Circuit והאובזרבלות כדי להתאים ל-ISA של ה-Backend. שימו לב שנשתמש במכשיר אמיתי מאוחר יותר.

# 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

שלב 3. הרצה באמצעות ה-primitives של Qiskit

מחשבים קוונטיים יכולים לייצר תוצאות אקראיות, אז בדרך כלל אוספים דגימה של הפלטים על ידי הרצת ה-Circuit פעמים רבות. אפשר לאמוד את ערך ה-observable באמצעות המחלקה Estimator. Sampler אפשר להשתמש בו כדי לקבל נתונים ממחשב קוונטי. לאובייקטים אלה יש מתודה run() שמבצעת את הבחירה של Circuits, אובזרבלות ופרמטרים (אם רלוונטי), באמצעות 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()

שלב 4. עיבוד לאחר של התוצאות

שלב זה כולל עיבוד לאחר של התוצאות שלכם. אפשר להזין את התוצאות האלה לתהליך עבודה אחר לניתוח נוסף או להכין גרף של הערכים והנתונים המרכזיים. באופן כללי, שלב זה ספציפי לבעיה שלכם.

  • עבור Sampler, אנחנו מציגים את התפלגות ההסתברות שמתקבלת על ידי דגימה של ה-Circuit הקוונטי פעמים רבות כמו מספר ה-shots שציינתם באמצעות 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

הרצת תוכנית על מכשיר אמיתי

אם תרצו להריץ את הקוד הזה על מכשיר אמיתי, אפשר להשתמש בקוד הבא.

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

אחזור תוצאות ממשרה שהושלמה

התא הבא מדגים איך אפשר לאחזר תוצאות ממשרה שהושלמה.

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