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

العملات الكمية — وحدة عن التراكب والتداخل

في هذه الوحدة من برنامج "Qiskit في الفصول الدراسية"، يحتاج الطلاب إلى بيئة Python تعمل بشكل صحيح مع تثبيت الحزم التالية:

  • qiskit الإصدار v2.1.0 أو أحدث
  • qiskit-ibm-runtime الإصدار v0.40.1 أو أحدث
  • qiskit-aer الإصدار v0.17.0 أو أحدث
  • qiskit.visualization
  • numpy
  • pylatexenc

لإعداد هذه الحزم وتثبيتها، راجع دليل تثبيت 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:

S(coin)=12up+12downS(coin) = \frac{1}{2}|up\rangle + \frac{1}{2}|down\rangle

هنا، يمثل كل مصطلح إحدى النتيجتين المحتملتين للرمية، وتمثل معاملاتهما احتمالات كل منهما. لاحظ أن رمز "|\rangle" (المعروف بـ"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()

Output of the previous code cell

العملة الكمية

يمكننا إنشاء حالة احتمالية مشابهة باستخدام كيوبت على حاسوبنا الكمي. مثل رمية العملة، يمكن قياس الكيوبت في إحدى حالتين محتملتين: 0|0\rangle و1|1\rangle. نُنشئ الحالة الاحتمالية أو "حالة التراكب" بالبدء في الحالة 0|0\rangle، ثم تطبيق ما يُسمى بـ"بوابة هادامار" على الكيوبت. هذا يضعه في تراكب متساوٍ بين 0|0\rangle و1|1\rangle. لاحظ أنه رغم أن حالة التراكب هذه قد تبدو وتتصرف مثل العملة للوهلة الأولى، سنرى قريبًا أن هناك ما هو أكثر من ذلك بكثير. الهدف من هذه الوحدة هو إظهار أن التراكب ليس مجرد رمية عملة كلاسيكية.

إذًا، بما أن الكيوبت في تراكب متساوٍ بين 0 و1، فعند قياسه ستكون هناك احتمالية 50% لقياس 0|0\rangle و50% لقياس 1|1\rangle. نكتب هذه الحالة بشكل مختلف قليلًا عن الحالة الاحتمالية الكلاسيكية، لأسباب ستتضح لاحقًا:

ψ=120+121|\psi\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle

هنا، احتمالات قياس كل من الحالتين لم تعد تساوي المعاملات، كما كان الحال في الحالة الاحتمالية الكلاسيكية أعلاه. بدلًا من ذلك، هو مربّع المعاملات الذي يعطينا الاحتمالات، ويمكن لكل معامل الآن أن يكون عددًا مركبًا، أي يحتوي على جزأين: حقيقي وتخيلي.

رغم هذه الاختلافات، تظل نتيجة قياس هذه الحالة مشابهة في الأساس لرمي عملة.

from qiskit import QuantumCircuit

qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()

qcoin.draw("mpl")

Output of the previous code cell

إذًا، تطبيق بوابة هادامار يعادل فعليًا رمي عملة. تمامًا كما رمينا العملة 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)

Output of the previous code cell

مع 1000 عينة من الدائرة أعلاه، حصلنا على شيء يبدو مطابقًا تقريبًا لمخطط الأعمدة الكلاسيكي للعملة، مع بعض التقلبات الإحصائية.

بالإضافة إلى أخذ عينات من إحصائيات العملة الكمية، يمكننا أيضًا استخدام أداة Qiskit الأساسية الأخرى المسماة Estimator لقياس ما يُسمى بالقيمة المتوقعة لـمشاهدة معينة للحالة. لتوضيح ما هي هذه القيمة المتوقعة، لنستخدم العملة الكلاسيكية مثالًا. افرض أنك تستخدم العملة للمقامرة: في كل مرة ترميها وتقع صورة للأعلى تربح دولارًا. لكن في كل مرة تقع صورة للأسفل تخسر دولارًا. إذا أردت معرفة كم من المال تتوقع الحصول عليه في كل رمية (القيمة المتوقعة لمشاهدة "المال")، فستحسب:

E(money)=12(+1 dollar)+12(1 dollar)=0 dollarsE(money) = \frac{1}{2} (+ \text{1 dollar}) + \frac{1}{2} (- \text{1 dollar}) = \text{0 dollars}

بما أن احتمال ربح دولار يساوي احتمال خسارة دولار، فالقيمة المتوقعة هي $0.

وبالمثل، مع حالة كمية، يمكننا حساب القيمة المتوقعة للمشاهدة "Z"، حيث Z هي مصفوفة باولي بقيم +1 و-1 المرتبطة بالحالتين 0|0\rangle و1|1\rangle على التوالي.

ψZψ=120Z0+121Z1=12(+1)+12(1)=0\langle \psi|Z|\psi \rangle = \frac{1}{2} \langle 0 | Z | 0 \rangle + \frac{1}{2} \langle 1 | Z | 1 \rangle = \frac{1}{2} (+1) + \frac{1}{2}(-1) = 0
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. البُعد الذي يُقاس على طوله رمي العملة لا يجب أن يؤثر على احتمالية النتائج.

لكن كيف ستختلف الأمور بالنسبة لعملتنا الكمية؟ لنتحقق.

يمكننا إنشاء التراكب الكمي بنفس الطريقة التي فعلناها في المرة السابقة، ببوابة هادامار. لقياس "صورة لليسار أو لليمين" على عملتنا الكمية، يمكننا فعل ما فعلناه مع العملة الكلاسيكية: القياس على محور مختلف. قياساتنا القياسية على الحاسوب الكمي هي على طول المحور العمودي، تمامًا مثل قياس "صورة للأعلى أو للأسفل" للعملة الكلاسيكية. لكن يمكننا أيضًا أن نسأل عملتنا الكمية إذا كانت صورة لليسار أو لليمين، أو بمعنى مكافئ، إذا كانت في الحالتين +|+\rangle أو |-\rangle اللتين تشيران على طول محور xx. تأخذ Sampler عينات في أساس القياس Z فقط، لكن يمكننا استخدام Estimator للحصول على القيمة المتوقعة لـ X. قيم X هي +1 و-1 للحالتين +|+\rangle و|-\rangle على التوالي.

اختبر فهمك

اقرأ السؤال أدناه، فكّر في إجابتك، ثم انقر على المثلث لإظهار الحل.

إذا كانت العملة الكمية تتصرف مثل العملة الكلاسيكية في هذه الحالة، سيكون لدينا احتمال 50-50 لقياس الحالة في +|+\rangle و|-\rangle. ما هي القيمة المتوقعة لـ X التي نتوقع أن تُعيدها Estimator في هذه الحالة؟

الإجابة:

عند تطبيق X على الحالة +|+\rangle نحصل على القيمة +1 وعلى الحالة |-\rangle نحصل على -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 لقياس +|+\rangle و|-\rangle.

اختبر فهمك

اقرأ السؤال/الأسئلة أدناه، فكّر في إجابتك، ثم انقر على المثلث لإظهار الحل.

ماذا تخبرنا هذه القيمة المتوقعة عن الحالة ψ|\psi\rangle؟ ما هي احتمالات قياس +|+\rangle و|-\rangle في أساس X هذا؟

الإجابة:

بما أن القيمة المتوقعة مساوية لقيمة X للحالة +|+\rangle، هذا يعني أن لدينا احتمالًا بنسبة 100% لقياس الحالة +|+\rangle عند القياس على طول X.

ما الذي يجري هنا؟ يبدو أن عملتنا الكمية يمكنها الحصول على نتائج عشوائية واحتمالية على طول بُعد واحد، لكن نتائج يمكن التنبؤ بها تمامًا على طول بُعد آخر. سيكون ذلك بمثابة رمي عملة وضمان أنها ستقع دائمًا بالصورة نحو اليمين عند التقاطها بحبسها بين راحتي اليدين.

الطور الكمي

الفارق الرئيسي للعملة الكمية هو أنها تمتلك خاصية أخرى لا تمتلكها العملة الكلاسيكية. تذكّر أنه في الحالة الاحتمالية الكلاسيكية،

S(coin)=c1up+c2downS(coin) = c_1|up\rangle + c_2|down\rangle

كل معامل هو مجرد عدد حقيقي موجب يمثل احتمال قياس حالة معينة. في الحالة الكمية،

ψ=c10+c21|\psi\rangle = c_1 |0\rangle + c_2 |1\rangle

المعاملات أعداد مركبة، إذ تحتوي على جزء حقيقي وجزء تخيلي. يمكن التعبير عن كل معامل cic_i كمتجه ثنائي الأبعاد على المستوى المركب، بمقدار ci|c_i| وزاوية ϕi\phi_i يصنعها مع المحور الحقيقي:

ci=cieiϕi.c_i = |c_i| e^{i \phi_i}.

A circle in a complex plane. The quantum state is represented as an arrow of length 1 that can rotate to point to any point on the circle. The horizontal component of the arrow is its real amplitude, and the vertical is its complex amplitude.

نسمي ϕi\phi_i الطور. يخبرنا الطور كيف ستتداخل حدّان في حالة كمية، أي كيف ستتجمعان أو تتلاشيان مثل الموجات. إذا كانت موجتان في طور مع بعضهما، بحيث تتوافق قممهما وقيعانهما، فإنهما تتجمعان لتشكّلا موجة بضعف الارتفاع. نسمي هذا التداخل البنّاء. أما إذا كانتا خارج الطور، أي تتوافق قمة من إحداهما مع قاع الأخرى والعكس صحيح، فإنهما تتداخلان بشكل هدام وتلغيان بعضهما تمامًا.

كالموجات، يمكن للحالات الكمية أيضًا أن تتجمع بشكل بنّاء أو هدام. قد يكون من الصعب رؤية ذلك لأننا في أغلب الأحيان لا نتحدث عن موجة فعلية في الفضاء المادي. في حالة كيوباتنا، يحدث التداخل في الفضاء المعلوماتي المجرد للكيوبات. لاحظ أيضًا أنه بما أن الطور النسبي فقط بين الموجتين هو ما يؤثر على تداخلهما — أي الفرق في الطورين Δϕ=ϕ2ϕ1\Delta \phi = \phi_2 - \phi_1 للمعاملين — فنحن عادةً نطبق طورًا عامًا مقداره ϕ1-\phi_1 على الحالة بأكملها حتى يكون c1c_1 حقيقيًا بحتًا ويُلتقط الطور النسبي بالكامل في c2c_2.

لرؤية كيف يمكن للطور أن يسبب تداخلًا في عملتنا الكمية، لنحاول تطبيق هادامار مرتين بدلًا من مرة واحدة فقط. كلاسيكيًا، هذا لن يكون منطقيًا — إذا كان تطبيق هادامار يعادل رمي عملة، فلا يمكنك رمي عملة بينما هي في طيران. لكن لنرَ ما يحدث للعملة الكمية:

qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()

qcoin_0.draw("mpl")

Output of the previous code cell

الآن، قبل أن نستخدم Sampler لقياس الحالة الناتجة، لنفكّر في كيفية تحوّل هذا الكيوبت بواسطة كل بوابة. يبدأ كالمعتاد في 0|0\rangle. ثم تحوّل هادامار الأولى الحالة إلى التراكب، كما رأينا بالفعل:

H0=120+121.H|0\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle.

في هذه الحالة، كلا المعاملَين حقيقيّان تمامًا وموجبان، وهذا يعني أن الطور هو ϕ=0\phi=0.

بعد ذلك يُطبَّق هادامار الثاني على كل جزء من حالة التراكب بشكل منفصل. نعرف بالفعل كيف يحوّل هادامار الحالة 0|0\rangle. لكن ماذا عن 1|1\rangle؟

H1=120121H|1\rangle = \frac{1}{\sqrt{2}} |0\rangle - \frac{1}{\sqrt{2}} |1\rangle

هذه أيضًا تراكب متساوٍ بين 0 و1، يشبه رمي عملة معدنية، لكن المعامل أمام 1|1\rangle في هذه الحالة له طور ϕ=π\phi = \pi يمنحه الإشارة السالبة.

تحقق من فهمك

اقرأ السؤال أدناه، فكّر في إجابتك، ثم اضغط على المثلث لإظهار الحل.

احسب الحالة الناتجة بعد تطبيق هادامار الثاني. أي، احسب: H(120+121)H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle). لاحظ أن HH توزيعية، فيمكنك تطبيقها على كل حد بشكل منفرد.

الجواب:

H(120+121)=12H0+12H1=12[(0+1)+(01)]=0H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle) = \frac{1}{\sqrt{2}} H|0\rangle + \frac{1}{\sqrt{2}} H|1\rangle = \frac{1}{2} [(|0\rangle + |1\rangle) + (|0\rangle - |1\rangle)] = |0\rangle

الآن لنتحقق من تنبؤنا باستخدام Sampler.

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_0)

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

## Analyze
plot_histogram(counts)

Output of the previous code cell

هادامار الثاني ألغى الأول، وعُدنا إلى حالة الصفر التي بدأنا منها! وذلك لأن هادامار يحوّل كلًّا من الحالتين 0|0\rangle و1|1\rangle إلى حالات متشابهة، لكن بطورَين متعاكسَين. بعد هادامار الثاني، نجد أن حدود 0|0\rangle تتداخل بنّاءً، في حين أن حدود 1|1\rangle تتداخل هدّامًا وتتلاشى.

لنستكشف أكثر: يمكننا تغيير الطور باستخدام بوابة "PHASE". إذن، لنطبّق هادامار لإنشاء التراكب، ثم نُطبّق إزاحة طور بمقدار π\pi راديان، ثم نُطبّق هادامار الثاني:

qcoin_pi = QuantumCircuit(1)
qcoin_pi.h(0)
qcoin_pi.p(np.pi, 0)
qcoin_pi.h(0)
qcoin_pi.measure_all()

qcoin_pi.draw("mpl")

Output of the previous code cell

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_pi)

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

## Analyze
plot_histogram(counts)

Output of the previous code cell

والآن يُقاس الكيوبت في الحالة 1 بدلًا من 0.

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

جرّب بنفسك:

عدّل خلية الكود أدناه لتغيير الطور بحيث يُنشئ هادامار الثاني حالة تراكب باحتماليات 25% و75% لإيجاد الحالة في 0|0\rangle و1|1\rangle على التوالي. تحقق من إجابتك رياضيًا.

qcoin_phase = QuantumCircuit(1)
qcoin_phase.h(0)
# replace "x" below with a phase from 0 to 2*np.pi (this cell won't run if you leave x)
# qcoin_phase.rz(x, 0)
qcoin_phase.h(0)
qcoin_phase.measure_all()

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_phase)

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

## Analyze
plot_histogram(counts)

Output of the previous code cell

قياس آخر (أفضل) باستخدام بوابة NOT\sqrt{\text{NOT}}

بحلول هذا الوقت تعلّمنا أن فعل رمي عملة معدنية يختلف تمامًا عن إنشاء حالة تراكب. هل يمكننا إيجاد تشبيه أفضل بالعملة يلتقط المزيد من الظواهر المشابهة للتراكب؟ نعم. نعم يمكن.

سنجري تجربة فكرية أخرى بعملة معدنية. تخيّل العملة موضوعة على الطاولة والوجه المكتوب للأعلى. لقلبها بحيث يصير الوجه المكتوب للأسفل، يكفي أن نقلبها. هذا يعادل حسابيًا بوابة "NOT".

لنقل إننا نريد بناء عملية، إذا طُبّقت مرتين، ستكون مكافئة لبوابة NOT. أي نريد "الجذر التربيعي لـNOT"، أو NOT\sqrt{\text{NOT}}. يمكننا تحقيق ذلك بالنظر في كيفية تنفيذ بوابة NOT جسديًا على العملة: هي مجرد دوران بمقدار 180 درجة حول محور x مثلًا. إذن، لو دوّرنا العملة 90 درجة فقط حول محور x، فإن ذلك سيكون مكافئًا لبوابة NOT\sqrt{\text{NOT}}.

تخيّل أنه بعد تطبيق بوابة NOT\sqrt{\text{NOT}}، أردنا أن نسأل هل العملة وجهها للأعلى أم للأسفل. لا هذا ولا ذاك — إنها قائمة على حافتها بالنسبة للمحور الرأسي. لكن الآن، لنُعيد تعريف "القياس" للعملة ليكون أولًا: إسقاط العملة على محور القياس (بضغط يدك عليها حتى تصير مستويّة)، وثانيًا: التحقق من هل وجهها للأعلى أم للأسفل.

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

يمكننا فعليًا قياس هذه العملة على ثلاثة محاور مختلفة: xx وyy وzz. نرى أن حافة العملة تشير على طول xx وzz، لذا فالقياس في هذين الاتجاهين يستلزم "إسقاط" العملة — ومن ثَمّ، على طول هذين المحورين، ستكون النتيجة عشوائية باحتمال 50:50 لقياس الوجه للأعلى أو للأسفل. أما على محور yy، فالعملة مستوية بالفعل، ووجهها المكتوب باتجاه -y. يمكننا أن نسمي ذلك "الوجه للأمام".

إذن، بينما أعطى القياسان على x وz نتائج عشوائية، فإن قياس y سيعطي دائمًا نفس النتيجة! إن كنت تتذكر تجربة "العملة الكمية" من القسم السابق، فهذا يشبه تصرف العملة الكمية. إذ كانت تُقاس لتكون 0 أو 1 باحتمال 50/50 في اتجاه z، لكنها دائمًا +|+\rangle وليس أبدًا |-\rangle على المحور X. هذا يُشير إلى أن عملة ساكنة على حافتها ربما تكون طريقة أفضل لتصوّر حالة تراكب الكيوبت مقارنةً بعملة تتقلب بشكل عشوائي في الهواء.

لنستخدم Qiskit لنرى إذا كانت "عملتنا الكمية" تتصرف بنفس الطريقة كعملتنا الكلاسيكية عند تطبيق بوابة NOT\sqrt{\text{NOT}}. سنطبّق NOT\sqrt{\text{NOT}} على كيوبت يبدأ في 0|0\rangle، ثم نستخدم Estimator للتحقق من القيمة المتوقعة للثلاثة رصدات: X وY وZ.

qcoin_sx = QuantumCircuit(1)
qcoin_sx.sx(0)

qcoin_sx.draw("mpl")

Output of the previous code cell

obs1 = Pauli("X")
obs2 = Pauli("Y")
obs3 = Pauli("Z")

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_sx)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
job = estimator.run(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
# job = estimator_sim.run(pubs)
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
[[-0.01234492]
[-1.00388865]
[ 0.00740695]]

القيم المتوقعة هي 0 و-1 و0 لـX وY وZ على التوالي.

تحقق من فهمك

اقرأ السؤال أدناه، فكّر في إجابتك، ثم اضغط على المثلث لإظهار الحل.

بناءً على القيم المتوقعة، ما هي احتماليات قياس العملة الكمية لتكون الوجه للأعلى/الأسفل (أو اليسار/اليمين أو الأمام/الخلف) لكل من محاور القياس الثلاثة؟

الجواب:

احتمال قياس أي من الحالتين على X وZ هو 50/50، والحالة تُقاس دائمًا في اتجاه -y على Y.

هذه نفس النتيجة التي حصلنا عليها في تجربتنا الفكرية عند تطبيق دوران "NOT\sqrt{\text{NOT}}" بمقدار 90 درجة على العملة الكلاسيكية. في الواقع، ثمة تناظر دقيق بين العملة وحالة الكيوبت الآن. يمكننا تصوّر حالة الكيوبت كمتجه يشير في اتجاه الوجه المكتوب للعملة، عموديًا على سطح العملة. إذن، الوجه للأعلى، أو حالة 0|0\rangle على العملة الكمية، يعادل متجهًا يشير مباشرةً للأعلى؛ والوجه للأسفل، أو 1|1\rangle، يشير مباشرةً للأسفل. أي تراكب متساوٍ بين 0|0\rangle و1|1\rangle يشير أفقيًا. طور الحالة يحدد الاتجاه الأفقي الدقيق — فالاتجاه الذي يشير إليه على خط الاستواء يساوي الاتجاه الذي يشير إليه المعامل c2c_2 في المستوى المركّب.

والآن، كل بوابة رأيناها في هذا الدفتر يمكن تصوّرها كدوران (أو سلسلة دورانات) للعملة/المتجه.

  • NOT: 180 درجة حول محور x

  • NOT\sqrt{\text{NOT}}: 90 درجة حول محور x

  • PHASE: دوران بمقدار ϕ\phi حول محور z

  • هادامار: هذه أكثر تعقيدًا بقليل. في البداية شبّهناها برمي العملة، إذ تجعلها تدور بشكل لا يمكن السيطرة عليه في الهواء. لكن هادامار هو في الواقع دوران محكوم وحتمي للعملة، تمامًا كالبوابات الأخرى. يُنفَّذ هادامار بالدوران 90 درجة حول محور y، ثم 180 درجة حول محور x.

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

حالة الكيوبت كمتجه بلوخ

هذا المتجه الذي يشير في اتجاه "وجه" العملة يُعرف بـ"متجه بلوخ". رسميًا، يمكن تمثيل حالة كيوبت عشوائية (معزولة) بمتجه يقع على سطح كرة نصف قطرها 1 بإحداثيات (r,θ,ϕ)(r, \theta, \phi). وبكتابتها بدلالة هذه الإحداثيات، تكون حالة الكيوبت:

ψ=cosθ20+eiϕsinθ21|\psi\rangle = \cos{\frac{\theta}{2}} |0\rangle + e^{i \phi} \sin{\frac{\theta}{2}} |1\rangle

A diagram of the Bloch sphere. The quantum state is a vector in three dimensions. Since it can point in any direction, the quantum state can be specified using polar angles theta and phi to locate a point on a spherical surphace. الآن لنتحقق مع Qiskit كيف يتغير متجه بلوخ عند تطبيق بوابات مختلفة على كيوبتنا بدءًا من حالة 0|0\rangle.

NOT

from qiskit.visualization import plot_bloch_multivector

qnot = QuantumCircuit(1)
qnot.x(0)

plot_bloch_multivector(qnot)

Output of the previous code cell

NOT\sqrt{\text{NOT}}

qsqrtnot = QuantumCircuit(1)
qsqrtnot.sx(0)

plot_bloch_multivector(qsqrtnot)

Output of the previous code cell

PHASE (ϕ=π\phi = \pi)

qphase = QuantumCircuit(1)
qphase.p(np.pi, 0)

plot_bloch_multivector(qphase)

Output of the previous code cell

هادامار

qhadamard = QuantumCircuit(1)
qhadamard.h(0)

plot_bloch_multivector(qhadamard)

Output of the previous code cell

الخاتمة — إذن ما هي حالة التراكب فعلًا؟

بدأنا هذه الوحدة بمقارنة عشوائية قياس حالة التراكب الكمي برمي عملة معدنية. وشبّهنا "بوابة هادامار" التي تُنتج تراكبًا كميًا بفعل رمي العملة. لكن، من خلال سلسلة من التجارب، اكتشفنا أن ثمة فوارق جوهرية بين رمي العملة الكلاسيكية وحالة التراكب الكمي.

تعلّمنا أنه لا يوجد في الواقع شيء "عشوائي" في الكيوبت الموجود في حالة تراكب. إنه أشبه بعملة ساكنة في الفضاء ثلاثي الأبعاد. في الواقع، عملة حرة الدوران في ثلاثة أبعاد هي تشبيه دقيق جدًا لطريقة معينة لتصوّر الحالة الكمية للكيوبت، وهي متجه بلوخ. البوابات الكمية تدوّر هذه العملة/متجه بلوخ بشكل حتمي وقابل للعكس. العشوائية لا تدخل إلا حين نقيس الكيوبت. وقد قارنّا هذه العملية القياسية بسحق العملة لتصبح مستوية في اتجاه محور القياس.

هل الحالة الكمية في تراكب أم لا — يعتمد ذلك في الحقيقة على وجهة نظر المراقب. كما رأيت على الأرجح من قبل، نحن أحرار في اختيار نظام إحداثياتنا — يمكن أن تشير xx وyy وzz في أي ثلاثة اتجاهات متعامدة. إذن، إن كانت لدينا تراكب بين 0 و1 في نظام إحداثيات واحد، يمكننا تعريف نظام إحداثيات جديد — أو ما يعادله، "أساس قياس" جديد — تكون فيه الحالة تشير تمامًا في اتجاه +z+z، وبالتالي ليست في حالة تراكب. لذا، حين نقول إن كيوبتًا في تراكب، يجب أن نجيب أيضًا على السؤال: "تراكب ماذا؟"

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

سنناقش هذه المعضلة المتعلقة بالطبيعة "الحقيقية" للحالة الكمية، وكيف يمكن لظاهرة التشابك الكمي أن تساعدنا في استيضاح ذلك، في وحدة متباينة بيل.

أسئلة

يمكن للمدرّسين طلب نسخ من هذه الدفاتر مع مفاتيح الإجابات والإرشادات حول مكانها في المناهج الدراسية الشائعة من خلال ملء هذا الاستطلاع السريع حول كيفية استخدام الدفاتر.

المفاهيم الأساسية:

  • رغم أن قياس الكيوبت في حالة تراكب احتمالي، كرمي عملة معدنية، فإن حالة التراكب ذاتها تتصرف بشكل مختلف عن عملة تتقلب في الهواء.
  • فارق رئيسي بين التوزيع الاحتمالي الكلاسيكي والتراكب هو أن التراكب يمتلك تماسك الطور، مما يتيح له التداخل البنّاء أو الهدّام.
  • يمكن تصوّر حالة كيوبت منفرد معزول كنقطة على ما يُسمى "كرة بلوخ"، حيث تحدد السعات النسبية لمركّبتَي 0|0\rangle و1|1\rangle الزاوية القطبية θ\theta، والأطوار النسبية بين المركّبتَين تحدد الزاوية الأفقية ϕ\phi.
  • يمكن النظر إلى جميع البوابات الكمية أحادية الكيوبت كدورانات للمتجه على هذه الكرة.

أسئلة صح/خطأ:

  1. صح/خطأ: التراكب الكمي في جوهره مثل الحدث الاحتمالي في الفيزياء الكلاسيكية، كرمي عملة معدنية.

  2. صح/خطأ: طول متجه بلوخ الذي يصف حالة كيوبت منفرد معزول هو دائمًا 1.

  3. صح/خطأ: البوابات الكمية أحادية الكيوبت لا تغيّر طول متجه بلوخ.

أسئلة الاختيار من متعدد:

  1. اختر متجه بلوخ الصحيح الذي يمثل الحالة Ψ=130+eiπ/4231|\Psi\rangle = \sqrt{\frac{1}{3}}|0\rangle + e^{i \pi / 4} \sqrt{\frac{2}{3}}|1\rangle:

Four Bloch spheres are shown. The vector points nearly along +x in option a, halfway between +x and +y and slightly below the xy plane in option b, between +x and -y, and slightly above the xy plane in option c, and along -x in option d.

  1. تصف كرة بلوخ ما يلي للكيوبت: (اختر كل ما ينطبق)

    a. السعة

    b. التشابك مع الكيوبتات الأخرى

    c. الطور

    d. اللون

    e. احتمالية نتائج القياس

أسئلة للنقاش:

  1. لماذا يمكن تصوّر حالة الكيوبت على كرة بلوخ، في حين لا يمكن تصوّر التوزيع الاحتمالي لرمي عملة معدنية بالطريقة ذاتها؟

  2. لماذا لا تُعدّ عملة تتقلب في الهواء أفضل تشبيه لحالة التراكب الكمي؟ ما الجوانب في التراكب التي لا يلتقطها هذا التشبيه؟

مسائل تحدٍّ: