تطبيق عملي مع Qiskit: مرحباً بالعالم - أنماط Qiskit
في هذا الكتيب الدفتري ستتعلم سير عمل أنماط Qiskit، وستستخدم الأداة الأولية Sampler من Qiskit.
يتضمن هذا البرنامج التعليمي جزئياً محتوى مأخوذاً من وثائق IBM Quantum: مرحباً بالعالم.
روابط مفيدة:
- يرجى إنشاء حساب IBM Cloud للوصول إلى منصة IBM Quantum.
- لمن لديهم بريد إلكتروني جامعي: احصل على رمز الميزة هنا لتمديد فترة التجربة المجانية.
- لمن ليس لديهم بريد إلكتروني جامعي: تعليمات تفعيل الحساب. فعّل حسابك بالكامل عبر تسجيل بطاقة ائتمانية. لن يتم خصم أي مبلغ من بطاقتك الائتمانية خلال هذه العملية أو بشكل عشوائي بعد التسجيل. يتيح لك هذا التفعيل الاستمرار في الوصول إلى مواردك المجانية في IBM Cloud ومنصة IBM Quantum بعد انتهاء فترة التجربة (30 يوماً).
- سنستخدم منصة قائمة على السحابة لإعداد بيئة البرمجة. يمكنك استخدام إما QBraid أو Google Colab.
- بعد هذا الكتيب الدفتري، سننظر في بروتوكول الإرسال الكمي.
روابط إضافية - مجتمع Qiskit وموارد التعلم الإضافية:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- محاضرات المدرسة الصيفية العالمية لـ Qiskit 2025
- شهادة Qiskit v2.X
- برنامج سفراء Qiskit
- التدريب الصيفي في مجال الكم
- قناة Qiskit على YouTube
تثبيت Qiskit
يمكنك استخدام بيئة Jupyter Lab عبر الإنترنت (راجع الدليل بيئات المختبر الإلكترونية) أو تثبيت Qiskit محلياً.
اتبع دليل تثبيت Qiskit تثبيت حزمة Qiskit SDK وعميل Qiskit Runtime لإتمام الخطوات التالية:
-
تثبيت 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 بحسب نظام التشغيل: كيفية تحديث 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.
استيراد المكتبات اللازمة
لنقم باستيراد المكتبات اللازمة لهذا البرنامج التعليمي.
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 الخاص بك
لتنفيذ الدوائر الكمية على أجهزة حقيقية، ستحتاج إلى حساب IBM Cloud.
اتبع التعليمات الواردة في هذا الدليل إعداد حساب IBM Cloud الخاص بك لإتمام الخطوات التالية:
- أنشئ حساب IBM Cloud إذا لم يكن لديك حساب بالفعل.
- سجّل الدخول أو أنشئ حساباً على IBM Quantum Platform باستخدام IBMid.
- ادخل إلى لوحة تحكم IBM Quantum Platform، أنشئ رمز API الخاص بك، وانسخه إلى مكان آمن. (راجع صورة المرجع الأولى أدناه.)
- في خلية الكود التالية لصور المرجع، استبدل
deleteThisAndPasteYourAPIKeyHereبمفتاح API الخاص بك. - انتقل إلى صفحة الحالات من القائمة الرئيسية ☰ وأنشئ حالتك. إذا لم تكن جزءاً من مؤسسة شبكة، اختر الخطة المفتوحة. (راجع صورة المرجع الثانية أدناه.)
- بعد إنشاء الحالة، انسخ رمز CRN المرتبط بها. (CRN اختصار لـ Cloud Resource Names أي أسماء موارد السحابة.) قد تحتاج إلى تحديث الصفحة لرؤية الحالة.
- في خلية الكود التالية لصور المرجع، استبدل
deleteThisAndPasteYourCRNHereبرمز CRN الخاص بك.
ملاحظة: تعامل مع مفتاح API الخاص بك كما تتعامل مع كلمة مرور آمنة. راجع دليل إعداد حساب IBM Cloud الخاص بك لمزيد من المعلومات حول استخدام مفتاح 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 هي:
-
تحويل المشكلة إلى صيغة أصيلة للحوسبة الكمية.
-
تحسين الدوائر والمؤثرات.
-
التنفيذ باستخدام دالة أولية من Qiskit.
-
تحليل النتائج.
الخطوة 1. تحويل المشكلة إلى صيغة أصيلة للحوسبة الكمية
في البرنامج الكمي، تُعدّ الدوائر الكمية (Circuit) الصيغة الأصيلة لتمثيل التعليمات الكمية، بينما تمثل المؤثرات المقاسات الرصدية المراد قياسها. عند إنشاء دائرة، ستُنشئ في الغالب كائناً جديداً من QuantumCircuit، ثم تضيف إليه التعليمات بالتتابع.
عرض توضيحي: بناء دوائر كمية أساسية في Qiskit
لنحاول بناء بعض الدوائر البسيطة باستخدام 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')
تمرين: بناء دوائر كمية أساسية في Qiskit
أنشئ Circuit لحالة بيل
# 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')
الحالة الابتدائية للـ Circuit الكمية هي الحالة .
الحالة النهائية هي:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
ملاحظة حول ترقيم البتات في Qiskit
يُرقّم Qiskit البتات في السلسلة من اليمين إلى اليسار. يستخدم Qiskit SDK ترقيم البتات LSb 0. عند عرض قائمة من بت (أو Qubit) أو تفسيرها كسلسلة، يكون البت هو البت الأقصى يساراً، والبت هو البت الأقصى يميناً. وذلك لأننا نكتب الأرقام عادةً بوضع الرقم الأكثر أهمية على اليسار، وفي Qiskit يُفسَّر البت على أنه البت الأكثر أهمية. لمزيد من التفاصيل، راجع موضوع ترتيب البتات في Qiskit SDK.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
هل نحتاج إلى بوابات القياس؟
عند إنشاء الدوائر الكمية، يجب أيضاً مراعاة نوع البيانات التي تريد إرجاعها بعد التنفيذ. يوفر Qiskit طريقتين لإرجاع البيانات: يمكنك الحصول على القيمة المتوقعة لمقياس رصدي، أو يمكنك الحصول على توزيع احتمالي لمجموعة من الـ Qubit التي تختار قياسها. جهّز عملك لقياس الـ Circuit بإحدى هاتين الطريقتين باستخدام الأدوات الأولية لـ Qiskit.
- الأداة الأولية
Sampler- تُرجع توزيعاً احتمالياً لمجموعة من الـ Qubit التي تختار قياسها. مثال:
- الأداة الأولية
Estimator- تُرجع القيمة المتوقعة لمقياس رصدي. مثال:
سنستخدم Sampler اليوم، لذا نحتاج إلى إضافة بوابات القياس إلى الـ 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')
الخطوة 2. تحسين الدوائر لأجهزة الهدف
عند تنفيذ الدوائر على جهاز حقيقي، من الضروري تحسين مجموعة التعليمات التي تحتويها الدائرة وتقليل العمق الإجمالي (أي عدد التعليمات تقريبًا) للدائرة. يضمن ذلك الحصول على أفضل النتائج الممكنة عن طريق تقليل تأثيرات الأخطاء والضوضاء. علاوةً على ذلك، يجب أن تتوافق تعليمات الدائرة مع بنية مجموعة التعليمات (ISA) الخاصة بجهاز Backend، مع مراعاة البوابات الأساسية والاتصال بين Qubit في الجهاز.
يُنشئ الكود التالي محاكيًا لإرسال مهمة إليه، ويحوّل الدائرة والمؤثرات لتتوافق مع 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)

الخطوة 3. التنفيذ باستخدام البدائيات في Qiskit
يمكن أن تُنتج الحواسيب الكمية نتائج عشوائية، لذا تُجمع عادةً عينة من المخرجات عن طريق تشغيل الدائرة مرات عديدة. يمكن تقدير قيمة المؤثر باستخدام فئة Estimator. ويمكن استخدام Sampler للحصول على البيانات من حاسوب كمي. تمتلك هذه الكائنات أسلوب run() الذي يُنفّذ تحديدًا من الدوائر والمؤثرات والمعاملات (عند الاقتضاء)، وذلك باستخدام كتلة موحدة بدائية (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()