انتقل إلى المحتوى الرئيسي

بناء وتشغيل أول برنامج كمومي لك

مقدمة

في الفيديو التالي، تأخذك أوليفيا لينز عبر محتوى هذا الدرس. بدلاً من ذلك، يمكنك فتح فيديو يوتيوب الخاص بهذا الدرس في نافذة منفصلة.

مرحباً بك في استخدام حاسوب كمومي اليوم! الهدف من هذا المقرر هو تمكينك من تشغيل كود على حاسوب كمومي حقيقي في أقصر وقت ممكن، دون الحاجة إلى أي خلفية مسبقة. لنبدأ.

هذا الدرس الأول هو مقدمة عملية لطيفة في الحوسبة الكمومية تناسب المبتدئين المتشوقين والمسؤولين المشغولين على حدٍّ سواء. ستتعرف على الدوائر الكمومية وتكتب برنامجاً كمومياً صغيراً يُنشئ التشابك، وستشغّله على حاسوب كمومي حقيقي من IBM®. لديك أيضاً خيار تشغيل البرنامج ذاته على محاكٍ، إذا اخترت تخطي التشغيل على حاسوب كمومي حقيقي.

يمكنك تشغيل هذه المفكرة من الأعلى إلى الأسفل في بيئة Google Colab جديدة، أو تشغيلها محلياً.

الإعداد

لتشغيل هذه المفكرة في Google Colab، ستحتاج إلى حساب Google حتى تتمكن من فتح المفكرات وتنفيذ الخلايا في المتصفح.

للتشغيل على حاسوب كمومي حقيقي من IBM، ستحتاج أيضاً إلى حساب IBM Quantum® Platform (مجاني). يمكنك فتح نسخة باستخدام الخطة المفتوحة للحصول على 10 دقائق من وقت وحدة المعالجة الكمومية (QPU) لكل نافذة دوّارة مدتها 28 يوماً، وهو في الواقع وقت كافٍ جداً! إذا واجهت مشكلة في حسابك، راجع صفحة الدعم.

يمكنك أيضاً تشغيل هذه المفكرة محلياً بعد تثبيت Qiskit باتباع التعليمات الموجودة على IBM Quantum Platform.

التثبيت والاستيرادات

في Colab، نثبّت التبعيات داخل المفكرة حتى يعمل الجميع بالأدوات ذاتها. تُثبّت الخلية التالية Qiskit مع وحدة التمثيل البصري بالإضافة إلى إضافتين: Aer (محاكيات سريعة) وعميل IBM Runtime (لتشغيل الدوائر على الحواسيب الكمومية).

بعد ذلك، لدينا عدد من الاستيرادات. صنف QuantumCircuit هو المكان الذي نُعرّف فيه بتاتاتنا الكمومية، أو Qubit، ونُعرّف العمليات على تلك الـ Qubit. هذا هو أول مصطلح كمومي لدينا: Qubit هو اللبنة الأساسية للحوسبة الكمومية، تماماً كما أن البت هو اللبنة الأساسية للحوسبة الكلاسيكية. سنتعلم المزيد عن الخصائص الخاصة للـ Qubit بينما نُنشئ دائرتنا. بعد ذلك، سيُستخدم plot_histogram لتمثيل نتائج دائرتنا الكمومية بصرياً. يتيح لنا AerSimulator محاكاة الدائرة الكمومية على حاسوب كلاسيكي. غير أن المحاكيات لا تستطيع تشغيل الدوائر الكمومية بالحجم ذاته الذي تعمل به الحواسيب الكمومية الحقيقية؛ لهذا نحتاج إلى حواسيب كمومية حقيقية. يمكن أن يكون ذلك مفيداً للاختبار وتصحيح الأخطاء أو الأغراض التعليمية؛ أو إذا استنفدت دقائق الـ QPU العشر المجانية. تساعد preset_passmanagers في تحسين الدوائر للعمل بكفاءة على الأجهزة، وهو أمر مهم جداً كلما أصبحت دوائرنا أكثر تعقيداً. Sampler وQiskitRuntimeService ضروريان لتشغيل الدائرة فعلياً على الحاسوب الكمومي. المزيد حول هذا لاحقاً.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
!pip install 'qiskit[visualization]' qiskit-ibm-runtime qiskit-aer
# Core Qiskit imports
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

# IBM Runtime specific imports
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService

بعد ذلك سنُجري فحصاً سريعاً للبيئة. نتحقق من الإصدارات ونؤكد الاستيرادات.

إذا فشل أي شيء هنا، فعادةً ما يكون ذلك مشكلة في تثبيت التبعيات؛ وإصلاحها الآن يمنع ظهور أخطاء محيرة لاحقاً.

import sys

import qiskit
import qiskit_aer
import qiskit_ibm_runtime

print("Python:", sys.version.split()[0])
print("qiskit:", qiskit.__version__)
print("qiskit-aer:", qiskit_aer.__version__)
print("qiskit-ibm-runtime:", qiskit_ibm_runtime.__version__)
Python: 3.12.2
qiskit: 2.2.3
qiskit-aer: 0.17.2
qiskit-ibm-runtime: 0.41.1

مهمة جانبية قصيرة: استخدام Composer

قبل أن نكتب الكود، من المفيد رؤية الدوائر بصرياً. يتيح لك IBM Quantum Composer بناء الدوائر عن طريق سحب البوابات وإفلاتها على الأسلاك. إنها طريقة رائعة لفهم ما تفعله الدائرة دون الانشغال بالصياغة البرمجية.

افتح Composer هنا.

بمجرد تحميله، أطلق الدرس التعليمي الموجّه من القائمة: Help | Build your first circuit. اعمل عليه وفق وتيرتك الخاصة. أثناء ذلك، انتبه إلى كيفية تغيير كل بوابة لما تتوقع قياسه.

يسير الدرس التعليمي عبر خطوات بناء دائرة «Hello World». تُمثَّل بصرياً في ما يُسمى مخطط الدائرة، حيث تُمثَّل الـ Qubit بخطوط أفقية وتُمثَّل البوابات المؤثرة على تلك الـ Qubit بمربعات أو رموز أخرى على الخطوط. تُعرّفنا هذه الدائرة على بعض الميزات الرئيسية للـ Qubit والحواسيب الكمومية:

أولاً، المربع الأحمر المُسمى "H" هو بوابة هادامارد، التي تُنشئ حالة التراكب للـ Qubit رقم 0. على خلاف البت الذي لا يمكن أن يكون إلا في الحالة 1 أو 0، يمكن أن تتضمن حالة الـ Qubit كلتا الاحتمالتين في آنٍ واحد، مع قيم معينة (تُسمى السعات) مرتبطة بكل منهما. لا يعني التراكب أنك ستشهد كلا النتيجتين في قياس واحد؛ بل يعني أن الحالة مُهيأة بحيث يمكن أن يحدث أي من الناتجين عند القياس.

ثانياً، الدوائر والخط الرأسي الذي يربط الـ Qubit الاثنتين هو بوابة CNOT، التي تُولّد التشابك بين الـ Qubit الاثنتين. التشابك هو نوع خاص من الارتباط بين الـ Qubit. عندما تكون الـ Qubit متشابكة، يمكن أن تكون نتائج القياسات مترابطة بشكل قوي بطريقة لا تتطابق مع ما نتوقعه من رميات عملة مستقلة عادية، أو من أي ارتباط كلاسيكي. عندما تكون Qubitان متشابكتين، فإن قياس إحداهما سيخبرك فوراً بنتيجة قياس الأخرى.

فكرة رئيسية أخرى ستراها في الدرس التعليمي هي اللقطات (shots). نظراً لأن القياس هو اللحظة التي تتوقف فيها الـ Qubit عن التصرف كحالة كمومية وتعطيك قراءة كلاسيكية، فإن حالة التراكب ستنهار باحتمالية إلى 0 أو 1 عند قياسها. لذا، لمعرفة ذلك التراكب، تحتاج إلى قياسه عدة مرات عن طريق تشغيل الدائرة ذاتها لتجميع الإحصاءات. وتُسمى هذه اللقطات.

اختبر فهمك

فكّر في كل سؤال أدناه، ثم انقر للكشف عن الإجابة.

هل يمكنك رؤية التراكب مباشرة من قياس واحد؟

الإجابة

لا. يُعيد القياس الواحد دائماً قيمة كلاسيكية: إما 0 أو 1. تظهر فكرة «المزج» فقط في الإحصاءات التي تراها بعد عمليات تشغيل متعددة، تُسمى أيضاً اللقطات.

بلغة بسيطة، ماذا يمنحك التشابك؟

الإجابة

يمنحك نتائج مترابطة. قياس إحدى الـ Qubit يخبرك شيئاً عن الأخرى. هذا الارتباط أقوى من العشوائية المستقلة وأقوى مما يمكن أن يفسره أي ارتباط كلاسيكي بحت أو عشوائية مشتركة.

إذا كانت الـ Qubit في حالة تراكب، فماذا ترى في قياس واحد، ولماذا تحتاج إلى لقطات كثيرة؟

الإجابة

في قياس واحد لا ترى إلا نتيجة كلاسيكية واحدة: إما 0 أو 1. تحتاج إلى لقطات كثيرة لأن «التراكب» يظهر على شكل توزيع احتمالي، لا يمكنك تقديره إلا بجمع الإحصاءات عبر عمليات تشغيل متكررة.

انظر إلى الرسم البياني للقياس في دائرة Hello World الخاصة بك في Composer. ماذا ترى؟ لماذا يُعدّ هذا دليلاً على التشابك؟

الإجابة

يُظهر لك 50% احتمالاً للتواجد في الحالة 00|00\rangle و50% احتمالاً للتواجد في الحالة 11|11\rangle. يعني ذلك أنك إذا قست إحداهما وكانت 0، فستكون الأخرى 0، وإذا قست إحداهما وكانت 1، فستكون الأخرى 1 أيضاً. هذا ارتباط بين الـ Qubit الاثنتين يمكن تفسيره بالتشابك.

إنشاء برنامج كمومي وتشغيله باستخدام Qiskit

حسناً، نعود إلى البرمجة. سنولّد حالة التشابك ذاتها التي أنشأناها في Composer (تُسمى حالة Bell Φ+\Phi^+ (فاي-زائد))، لكن هذه المرة سنكتب الكود يدوياً. نحتاج إلى بناء هذه المهارة لأنه مع تدرّجنا إلى المزيد من الـ Qubit والدوائر الأكثر تعقيداً، لن يتمكن Composer من مساعدتنا.

لبناء دائرة Bell، نستخدم بوابة HH (هادامارد) لوضع الـ Qubit الأول في تراكب متساوٍ. ثم نطبّق بوابة CXCX (NOT المتحكم بها)، التي تُشابك الحالتين معاً. أصبح الـ Qubit الاثنان الآن مترابطتين بطريقة لا مثيل لها في الكلاسيكيات.

# --- Build the Bell circuit (phi-plus) ---
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all() # creates a classical register named "meas"

bell.draw("mpl")

Output of the previous code cell

دالة مساعدة لتشغيل الدوائر

لنُعرّف الآن دالة مساعدة تتولى عملية تشغيل دائرة كمومية واسترجاع نتائج القياس. تعتني هذه الدالة بتحويل الدائرة لتتوافق مع مجموعة تعليمات Backend، وتشغيلها عبر عنصر Sampler الأساسي، واستخراج الأعداد من النتائج.

def run_circuit_and_get_counts(circuit, backend, shots=1000):
"""
Runs a quantum circuit on a specified backend and returns the measurement counts.

Args:
circuit (QuantumCircuit): The quantum circuit to run.
backend: The Qiskit backend (real device or simulator).
shots (int): The number of shots to run the circuit.

Returns:
dict: A dictionary of measurement counts.
"""
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)

sampler = Sampler(mode=backend)

job = sampler.run([isa_circuit], shots=shots)
result = job.result()

return result[0].data.meas.get_counts()

التشغيل على QPU وتمثيل النتائج بصرياً

أخيراً، نُشغّل الدائرة على وحدة معالجة كمومية (QPU) من IBM في السحابة لمدة 1000 لقطة ونرسم النتائج. وحدات معالجة IBM الكمومية هي أنظمة فيزيائية يمكنها التقاط الضوضاء، لذا فإن البوابات غير مثالية بعض الشيء، وقد تكون القياسات خاطئة أحياناً، وقد يتغير ضبط الجهاز بمرور الوقت.

يُدخل التشغيل على حواسيب كمومية حقيقية اعتبارات عملية أيضاً. قد تنتظر المهام في طابور، لأن كثيراً من الأشخاص قد يستخدمون الجهاز ذاته. يجب عليك أيضاً اختيار عدد اللقطات الذي يوازن بين الاعتبارات الإحصائية (المزيد من اللقطات يعني نسبة إشارة إلى ضوضاء أعلى) وقيود الوقت والتكلفة.

اتّبع التعليمات الموجودة في تعليقات الكود في الخلية التالية. بعد تشغيل الخلية، يجب أن ترى رسماً بيانياً بأعداد متقاربة تقريباً لسلسلتي البتات 0000 و1111، مع بعض التكرارات لـ 0101 أو 1010 بسبب الضوضاء. الخلية التالية في هذه المفكرة تُشغّل الدائرة ذاتها على محاكٍ، إذا اخترت تخطي التشغيل على QPU.

# Syntax for first saving your token.  Delete these lines after saving your credentials.
QiskitRuntimeService.save_account(
channel="ibm_quantum_platform",
token="YOUR_TOKEN_HERE",
overwrite=True,
set_as_default=True,
)
service = QiskitRuntimeService(channel="ibm_quantum_platform")

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_fez".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_fez")
print(backend.name)
ibm_pittsburgh
counts = run_circuit_and_get_counts(bell, backend, shots=1000)
plot_histogram(counts)

Output of the previous code cell

التشغيل على محاكٍ وتمثيل النتائج بصرياً

المحاكي هو نسخة «عالم مثالي» من الحوسبة الكمومية. هنا نُشغّل الدائرة على محاكٍ لمدة 1000 لقطة ونرسم النتائج. يجب أن ترى أعداداً متقاربة تقريباً للحالتين 0000 و1111، دون أي تكرار لـ 0101 أو 1010، وهو ما يُميّز الارتباط المثالي لحالة Bell.

backend = AerSimulator()
counts = run_circuit_and_get_counts(bell, backend, shots=1000)

plot_histogram(counts)

Output of the previous code cell

اختبر فهمك

ما البوابتان اللتان تُنشئان حالة Bell هنا؟

الإجابة

بوابة H على الـ Qubit رقم 0، تليها بوابة CX مع الـ Qubit رقم 0 كمتحكم والـ Qubit رقم 1 كهدف.

على محاكٍ مثالي، أي سلسلتا البتات يجب أن تهيمنا على الرسم البياني؟

الإجابة

يجب أن تهيمن 00 و11.

لماذا لن يكون عدد 00 مساوياً تماماً لعدد 11 في محاكٍ مثالي دائماً؟

الإجابة

على الرغم من أن المحاكي «مثالي» ويُنتج حالة Bell مثالية، إلا أنه لا يزال يُحاكي عملية عشوائية بطبيعتها، لذا ستظهر تقلبات إحصائية. الأمر أشبه برمي عملة 1000 مرة: حتى لو كان احتمال ظهور الوجهين 50-50 بالضبط، فهذا لا يعني أنك ستحصل دائماً على 500 مرة للوجه الأول و500 مرة للوجه الثاني.

لماذا قد يُظهر حاسوب كمومي حقيقي بعض نتائج 01 أو 10 بينما لم يُظهرها المحاكي؟

الإجابة

لأن الأجهزة الحقيقية تحتوي على ضوضاء. البوابات والقياسات ليست مثالية، وهذا قد يُدخل أخطاء عرضية.

ما الفرق العملي الواحد بين المحاكيات والحواسيب الكمومية الحقيقية إلى جانب الضوضاء؟

الإجابة

قد تنطوي الحواسيب الكمومية على وقت انتظار في طابور، ومحدودية في الإتاحة، وقيود خاصة بالجهاز تؤثر على طريقة تشغيل الدوائر.

الخاتمة

بدأنا بإعداد Qiskit في بيئة Colab جديدة، وهو بالضبط كيف تبدأ كثير من سير العمل الواقعية للمفكرات. تبعنا ذلك برحلة في الحوسبة الكمومية باستخدام Composer. ثم بنينا دائرة بسيطة مكوّنة من Qubitين تُنتج حالة Bell Φ+\Phi^+ واستخدمنا أخذ عيّنات متكررة ومثّلنا التشابك بصرياً كارتباط في الرسم البياني لقياسات الـ Qubit. رأينا أيضاً كيف تُدخل الحواسيب الكمومية الحقيقية ضوضاء وأخطاء.

الهدف التعليمي

الآن بعد أن استعرضنا كيفية إنشاء حالة Bell Φ+\Phi^+، حاول تحرير الكود لإنشاء واحدة من حالات Bell الثلاث الأخرى. على وجه الخصوص، ستُستخدم حالة Ψ\Psi^- في درس قادم، لذا إذا اكتشفت كيفية إنشائها، فستكون متقدماً على الجميع.

This translation based on the English version of 7 مايو 2026