العملات الكمية — وحدة عن التراكب والتداخل
في هذه الوحدة من برنامج "Qiskit في الفصول الدراسية"، يحتاج الطلاب إلى بيئة Python تعمل بشكل صحيح مع تثبيت الحزم التالية:
qiskitالإصدار v2.1.0 أو أحدثqiskit-ibm-runtimeالإصدار v0.40.1 أو أحدثqiskit-aerالإصدار v0.17.0 أو أحدثqiskit.visualizationnumpypylatexenc
لإعداد هذه الحزم وتثبيتها، راجع دليل تثبيت Qiskit. لتشغيل المهام على حواسيب كمية حقيقية، يحتاج الطلاب إلى إنشاء حساب على IBM Quantum® باتباع الخطوات في دليل إعداد حساب IBM Cloud.
تمت تجربة هذه الوحدة واستُخدمت 47 ثانية من وقت وحدة المعالجة الكمية (QPU). هذا تقدير فقط، وقد يختلف استخدامك الفعلي.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
شاهد شرح الوحدة من الدكتورة كيتي ماكورميك في الفيديو أدناه، أو اضغط هنا لمشاهدته على YouTube.
مقدمة
في هذه الوحدة، سنستكشف أحد المبادئ الجوهرية في قلب النظرية الكمية: التراكب. في حياتنا اليومية، تمتلك الأشياء دائمًا خصائص محددة. موقعها وحجمها وشكلها ولونها — كل شيء عنها — محدد وثابت، حتى لو لم يقم المراقب بقياسها بعد. في العالم الكمي، ليس الأمر كذلك بالضرورة. يمكن لجسيم كمي أن يكون في حالة تُسمى "التراكب" بين عدة حالات مسموح بها كلاسيكيًا. عند قياس حالة التراكب، ستنهار عشوائيًا إلى إحدى تلك الحالات.
من بعض النواحي، يشبه قياس حالة التراكب رمي عملة معدنية: لا توجد طريقة لمعرفة كيف ستقع مسبقًا. هذا الغموض الجوهري هو جانب مزعج في ميكانيكا الكم حتى أن أينشتاين نفسه واجه صعوبة في قبوله. وقد قال بشكل مشهور: "الله لا يلعب النرد" حول هذه العشوائية. لكن كما سنرى، يلعب الله في الواقع النرد — ويرمي العملات أيضًا.
سنفكر في رمي العملة الكلاسيكية كقياس تشبيهي لحالة التراكب. وبالتلاعب بـ"عملة كمية" باستخدام Qiskit وكيوبت على معالج IBM® الكمي، سنجد بسرعة حدود هذا التشبيه.
العملة الكلاسيكية
لنبدأ بالعملة الكلاسيكية. ارمِ عملة معدنية، فستقع إما صورة للأعلى أو للأسفل، بنسبة احتمال 50% لكل منهما. في حين أنه من حيث المبدأ يمكن حساب الجانب الذي ستقع عليه العملة إذا عُرفت الظروف الأولية الدقيقة والقوة/عزم الدوران للرمية، إلا أنه في الواقع العملي لا توجد طريقة لمعرفة ذلك مسبقًا. لهذا نستخدم رمية العملة كمثال نموذجي على الحالة الاحتمالية الكلاسيكية، حيث تكون النتيجة عشوائية في الأساس. يمكننا كتابة حالة العملة قبل أن تقع لتعكس هذا الاحتمال 50/50:
هنا، يمثل كل مصطلح إحدى النتيجتين المحتملتين للرمية، وتمثل معاملاتهما احتمالات كل منهما. لاحظ أن رمز "" (المعروف بـ"ket") يُستخدم عادةً لتمثيل الحالة الكمية، لكننا هنا نتحدث عن حالة احتمالية كلاسيكية. راجع الدرس 1: الأنظمة المنفردة في دورة أساسيات المعلومات الكمية لمعرفة المزيد عن كيفية تمثيل المعلومات الكلاسيكية والكمية.
لو رمينا عملة 1000 مرة وسجّلنا عدد مرات ظهور الصورة للأعلى وللأسفل، سنحصل على شيء مثل هذا:
# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random
nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]
# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()
العملة الكمية
يمكننا إنشاء حالة احتمالية مشابهة باستخدام كيوبت على حاسوبنا الكمي. مثل رمية العملة، يمكن قياس الكيوبت في إحدى حالتين محتملتين: و. نُنشئ الحالة الاحتمالية أو "حالة التراكب" بالبدء في الحالة ، ثم تطبيق ما يُسمى بـ"بوابة هادامار" على الكيوبت. هذا يضعه في تراكب متساوٍ بين و. لاحظ أنه رغم أن حالة التراكب هذه قد تبدو وتتصرف مثل العملة للوهلة الأولى، سنرى قريبًا أن هناك ما هو أكثر من ذلك بكثير. الهدف من هذه الوحدة هو إظهار أن التراكب ليس مجرد رمية عملة كلاسيكية.
إذًا، بما أن الكيوبت في تراكب متساوٍ بين 0 و1، فعند قياسه ستكون هناك احتمالية 50% لقياس و50% لقياس . نكتب هذه الحالة بشكل مختلف قليلًا عن الحالة الاحتمالية الكلاسيكية، لأسباب ستتضح لاحقًا:
هنا، احتمالات قياس كل من الحالتين لم تعد تساوي المعاملات، كما كان الحال في الحالة الاحتمالية الكلاسيكية أعلاه. بدلًا من ذلك، هو مربّع المعاملات الذي يعطينا الاحتمالات، ويمكن لكل معامل الآن أن يكون عددًا مركبًا، أي يحتوي على جزأين: حقيقي وتخيلي.
رغم هذه الاختلافات، تظل نتيجة قياس هذه الحالة مشابهة في الأساس لرمي عملة.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
إذًا، تطبيق بوابة هادامار يعادل فعليًا رمي عملة. تمامًا كما رمينا العملة 1000 مرة لدراسة إحصائيات وقوعها صورة للأعلى أو للأسفل، يمكننا فعل شيء مماثل على Qiskit بـ"عملتنا الكمية". يمكننا استخدام أداة Qiskit الأساسية المسماة Sampler، التي تكرر دائرة كمية عدة مرات لأخذ عينات من إحصائيات الحالة الناتجة.
أولًا، نحمّل خدمة Qiskit Runtime والأدوات الأساسية، ثم نختار واجهة خلفية لتشغيل الدائرة.
يوجد أدناه كود لحفظ بياناتك عند أول استخدام. تأكد من حذف هذه المعلومات من الدفتر بعد حفظها في بيئتك، حتى لا تُشارَك بياناتك عن طريق الخطأ عند مشاركة الدفتر. راجع إعداد حساب IBM Cloud وتهيئة الخدمة في بيئة غير موثوق بها لمزيد من التوجيه.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston
إذا نفدت الساعات المتاحة في حسابك، يمكنك أيضًا اختيار تشغيل هذا على محاكٍ. فقط أزل التعليق عن الكود وشغّل الخلية أدناه للقيام بذلك:
## Use a local simulator
# from qiskit_aer import AerSimulator
## Generate a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
مع 1000 عينة من الدائرة أعلاه، حصلنا على شيء يبدو مطابقًا تقريبًا لمخطط الأعمدة الكلاسيكي للعملة، مع بعض التقلبات الإحصائية.
بالإضافة إلى أخذ عينات من إحصائيات العملة الكمية، يمكننا أيضًا استخدام أداة Qiskit الأساسية الأخرى المسماة Estimator لقياس ما يُسمى بالقيمة المتوقعة لـمشاهدة معينة للحالة. لتوضيح ما هي هذه القيمة المتوقعة، لنستخدم العملة الكلاسيكية مثالًا. افرض أنك تستخدم العملة للمقامرة: في كل مرة ترميها وتقع صورة للأعلى تربح دولارًا. لكن في كل مرة تقع صورة للأسفل تخسر دولارًا. إذا أردت معرفة كم من المال تتوقع الحصول عليه في كل رمية (القيمة المتوقعة لمشاهدة "المال")، فستحسب:
بما أن احتمال ربح دولار يساوي احتمال خسارة دولار، فالقيمة المتوقعة هي $0.
وبالمثل، مع حالة كمية، يمكننا حساب القيمة المتوقعة للمشاهدة "Z"، حيث Z هي مصفوفة باولي بقيم +1 و-1 المرتبطة بالحالتين و على التوالي.
from qiskit.quantum_info import Pauli
qcoin = QuantumCircuit(1)
qcoin.h(0)
# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
obs = Pauli("Z")
qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute
# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()
print(res[0].data.evs)
-0.014799284701239441
نحصل على قيمة متوقعة تساوي 0 كما هو متوقع (هاه). هذه طريقة أخرى للتأكد من أن هناك احتمالًا متساويًا لقياس 0 و1، ويبدو أن السلوك مماثل لرمي عملة.
في هذه المرحلة ، تبدو "العملة الكمية" مطابقة تمامًا للعملة الكلاسيكية. لكن في القسم التالي، سنجري بعض التجارب التي ستكشف الاختلافات الجوهرية بين الاثنتين.
الكم يتجلى: تجربة في ثلاثة أبعاد
لنجرِ تجربة فكرية: افرض أنك ترمي عملة في الهواء، وبدلًا من تركها تسقط على الأرض، تمتلك من التنسيق ما يكفي لتصفق بيديك عندما تمر بينهما وتحبسها بين راحتيك. الآن، بدلًا من أن تقع العملة صورة للأعلى أو للأسفل، تقع صورة لليسار أو لليمين.
اختبر فهمك
اقرأ السؤال/الأسئلة أدناه، فكّر في إجابتك، ثم انقر على المثلث لإظهار الحل.
ما هو احتمال كل من هذين النتيجتين، صورة لليسار أو صورة لليمين؟
الإجابة:
سيظل الاحتمال 50-50. لا يجب أن يؤثر البُعد الذي نختار قياس نتيجة رمية العملة على طوله على الاحتمالات.
نأمل أن تكون قد أجبت بأن احتمال وقوع الصورة لليسار أو لليمين لا يزال 50-50. البُعد الذي يُقاس على طوله رمي العملة لا يجب أن يؤثر على احتمالية النتائج.
لكن كيف ستختلف الأمور بالنسبة لعملتنا الكمية؟ لنتحقق.
يمكننا إنشاء التراكب الكمي بنفس الطريقة التي فعلناها في المرة السابقة، ببوابة هادامار. لقياس "صورة لليسار أو لليمين" على عملتنا الكمية، يمكننا فعل ما فعلناه مع العملة الكلاسيكية: القياس على محور مختلف. قياساتنا القياسية على الحاسوب الكمي هي على طول المحور العمودي، تمامًا مثل قياس "صورة للأعلى أو للأسفل" للعملة الكلاسيكية. لكن يمكننا أيضًا أن نسأل عملتنا الكمية إذا كانت صورة لليسار أو لليمين، أو بمعنى مكافئ، إذا كانت في الحالتين أو اللتين تشيران على طول محور . تأخذ Sampler عينات في أساس القياس Z فقط، لكن يمكننا استخدام Estimator للحصول على القيمة المتوقعة لـ X. قيم X هي +1 و-1 للحالتين و على التوالي.
اختبر فهمك
اقرأ السؤال أدناه، فكّر في إجابتك، ثم انقر على المثلث لإظهار الحل.
إذا كانت العملة الكمية تتصرف مثل العملة الكلاسيكية في هذه الحالة، سيكون لدينا احتمال 50-50 لقياس الحالة في و. ما هي القيمة المتوقعة لـ X التي نتوقع أن تُعيدها Estimator في هذه الحالة؟
Estimator في هذه الحالة؟الإجابة:
عند تطبيق X على الحالة نحصل على القيمة +1 وعلى الحالة نحصل على -1، لذا إذا كان لدينا توزيع 50-50، سنحصل على قيمة متوقعة تساوي 0.
# Step 1: map problem
qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)
obs = Pauli("X")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.9985207100591716
القيمة المتوقعة لـ X في هذه الحالة هي 1. إذًا، ليس هناك احتمال 50-50 لقياس و.
اختبر فهمك
اقرأ السؤال/الأسئلة أدناه، فكّر في إجابتك، ثم انقر على المثلث لإظهار الحل.