انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

الإرسال الكمي عن بُعد

لهذه الوحدة في برنامج Qiskit in Classrooms، يجب أن يكون لدى الطلاب بيئة 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 الخاص بك.

تم اختبار هذه الوحدة واستخدمت 14 ثانية من وقت QPU. هذا تقدير فقط، وقد يختلف استخدامك الفعلي.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_aer": "qiskit-aer", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
# 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'

شاهد العرض التفصيلي للوحدة من قِبَل الدكتورة Katie McCormick أدناه، أو اضغط هنا لمشاهدته على YouTube.


المقدمة والخلفية النظرية​

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

البتات الكلاسيكية يمكن أن تكون في الحالتين 0 أو 1. أما البتات الكمية (الكيوبتات) فيمكنها أن تكون في حالات كمية يُرمز إليها بـ ∣0⟩|0\rangle و ∣1⟩|1\rangle، وكذلك تركيبات خطية من هذه الحالات تُسمى "التراكب"، مثل ∣ψ⟩=α0∣0⟩+α1∣1⟩|\psi\rangle = \alpha_0|0\rangle +\alpha_1|1\rangle، حيث α0,α1∈C\alpha_0,\alpha_1 \in \mathbb{C}, و ∣α0∣2+∣α1∣2=1|\alpha_0|^2+|\alpha_1|^2 = 1. رغم أن الحالات يمكنها الوجود في هذا التراكب، فإن قياس الحالة سيُحوّلها إلى إحدى الحالتين ∣0⟩|0\rangle أو ∣1⟩|1\rangle. المعاملان aa و bb مرتبطان باحتمال كل نتيجة قياس وفقًا لـ

P0=∣α0∣2P_0 = |\alpha_0|^2 P1=∣α1∣2P_1 = |\alpha_1|^2

ومن هنا يأتي الشرط ∣α0∣2+∣α1∣2=1|\alpha_0|^2+|\alpha_1|^2 = 1.

ميزة أساسية أخرى هي أن البتات الكمية يمكن أن تكون "متشابكة"، مما يعني أن قياس كيوبت واحد يمكن أن يؤثر على نتيجة قياس كيوبت آخر متشابك معه. فهم كيف يختلف التشابك عن الارتباطات الكلاسيكية البسيطة أمر يحتاج إلى بعض التدقيق. لنشرح أولًا طريقة التدوين. لنسمّ كيوبتَين ينتمي أحدهما للصديق 0 (أليس) والآخر للصديق 1 (بوب)، وكلاهما في الحالة ∣0⟩|0\rangle

∣0⟩B∣0⟩A|0\rangle_B|0\rangle_A

أو

∣0⟩1∣0⟩0|0\rangle_1|0\rangle_0

وتُختصر أحيانًا إلى

∣00⟩|00\rangle

لاحظ أن الكيوبت ذو الرقم الأصغر (أو الحرف الأصغر) يقع في أقصى اليمين. هذه اتفاقية تُسمى ترميز "little-endian"، وتُستخدم في جميع أنحاء Qiskit. إذا كانت حالة الكيوبتَين للصديقَين هي ∣00⟩|00\rangle، وقاسا حالة كيوبتَيهما كلٌّ على حدة، فسيجد كل منهما القيمة 0. وبالمثل إذا كانت الكيوبتات في الحالة ∣11⟩|11\rangle، فستُعطي قياساتهما القيمة 1. هذا لا يختلف عن الحالة الكلاسيكية. لكن في الحوسبة الكمية، يمكننا دمج ذلك مع التراكب للحصول على حالات مثل

12(∣00⟩+∣11⟩)\frac{1}{\sqrt{2}}(|00\rangle+|11\rangle)

في حالة كهذه، لا يُعرف بعد ما إذا كانت كيوبتات أليس وبوب في الحالة 0 أو 1، بل لم تُحدَّد ذلك الطبيعة حتى الآن، ومع ذلك نعلم أنهما سيقيسان نفس الحالة لكيوبتَيهما. فمثلًا، إذا قاس بوب كيوبته ووجده في الحالة ∣0⟩|0\rangle، فالطريقة الوحيدة لحدوث ذلك هي أن يكون القياس قد أدى إلى انهيار حالة الكيوبتَين إلى إحدى الحالتين الممكنتين، وتحديدًا إلى ∣00⟩|00\rangle. وهذا يترك كيوبت أليس أيضًا في الحالة ∣0⟩|0\rangle.

تشابك الكيوبتات بهذه الطريقة لا يستلزم أن تظل الكيوبتات قريبة فيزيائيًا من بعضها. بمعنى آخر، يمكننا تشابك الكيوبتات، ثم إبعادها مسافات كبيرة عن بعضها، واستخدام تشابكها لإرسال المعلومات. الحالة المتشابكة كالتي ذكرناها أعلاه هي وحدة أساسية للتشابك، وتُعرف أحيانًا بـ"e-bit"، أي بت تشابك واحد. يمكن التفكير في هذه الـe-bits كموارد في التواصل الكمي، إذ يمكن استخدام كل e-bit مشترك بين شريكَين بعيدَين، كما سنوضح هنا، لنقل المعلومات من موقع إلى آخر.

أول ما يخطر ببال كثير من الناس عند تعلّم هذا للمرة الأولى هو انتهاك النسبية: هل يمكننا استخدام هذا لإرسال المعلومات أسرع من الضوء؟ بكل الوسائل استمر في التساؤل ومراجعة القواعد العلمية، لكن للأسف هذا لن يُتيح لنا إرسال المعلومات أسرع من الضوء، لأسباب ستتضح خلال هذه الوحدة. تلميح مسبق: الأمر المدهش هو أنه ليس بسبب سرعة انتشار هذا الانهيار، الذي يبدو أنه يحدث فعلًا أسرع من الضوء [1]. نبدأ بمتعاونَين هما أليس وبوب، اللذان يتواجدان في البداية في نفس الموقع ويمكنهما العمل معًا على نفس الكيوبتات. سيقوم هذان المتعاونان بتشابك كيوبتَيهما. ثم سيتفرقان إلى موقعَين جغرافيَّين مختلفَين، آخذَين كيوبتَيهما معهما. ستحصل أليس بعد ذلك على معلومات كمية على كيوبت جديد Q. لا نضع أي افتراضات حول المعلومات الموجودة على Q. قد تكون حالة Q سرًا مجهولًا لأليس؛ وقد تكون مجهولة للجميع. لكن تُوكَل إلى أليس مهمة نقل المعلومات الموجودة على Q إلى بوب. وستفعل ذلك باستخدام الإرسال الكمي عن بُعد.

لتحقيق ذلك، سنحتاج إلى معرفة بعض العمليات الكمية أو "البوابات".

العوامل الكمية (البوابات)​

لا بأس بتخطي هذا القسم إذا كنت تعرف البوابات الكمية مسبقًا. وإذا أردت فهم هذه البوابات بشكل أفضل، اطّلع على أساسيات المعلومات الكمية، لا سيما الدرسَين الأولَين، على IBM Quantum Learning.

لبروتوكول الإرسال عن بُعد هذا سنستخدم أساسًا نوعَين من البوابات الكمية: بوابة Hadamard وبوابة CNOT. وبعض البوابات الأخرى ستؤدي دورًا أقل: بوابة XX، وبوابة ZZ، وبوابة SWAP.

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

الحالات التي قدّمناها بالفعل تم اختيارها (جزئيًا بالاتفاق وجزئيًا بالقيود) لتكون لها أشكال متجهية:

∣0⟩=(10)|0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} ∣1⟩=(01)|1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix}

وبهذه الطريقة، يمكن كتابة حالة اعتباطية ∣ψ⟩=a∣0⟩+b∣1⟩|\psi\rangle = a|0\rangle+b|1\rangle على النحو التالي:

∣ψ⟩=(ab)|\psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

هناك بعض الاختيار في كيفية تمديد الترميز إلى حالات متعددة الكيوبتات، لكن الاختيار أدناه شائع جدًا:

∣00⟩=(1000),∣01⟩=(0100),∣10⟩=(0010),∣11⟩=(0001).|00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix},|01\rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, |10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\0\end{pmatrix},|11\rangle = \begin{pmatrix}0 \\ 0 \\ 0 \\ 1\end{pmatrix}.

مع وضع هذا الترميز المتجهي في الاعتبار، يمكننا تقديم البوابات الكمية التي نحتاجها وتأثيراتها على الحالات الكمية وأشكالها المصفوفية.

بوابة هادامارد H: تُنشئ حالة تراكب. بوابة أحادية الكيوبت.

H∣0⟩=12(∣0⟩+∣1⟩),H|0\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right), H∣1⟩=12(∣0⟩−∣1⟩)H|1\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right) H=12(111−1)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

دائرة تحتوي على بوابة هادامارد تُصنع على النحو التالي:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output of the previous code cell

بوابة CNOT (NOT المتحكم بها): تستخدم هذه البوابة كيوبتين: تحكم وهدف. تفحص حالة كيوبت التحكم الذي لا يتغير. لكن إذا كان كيوبت التحكم في الحالة ∣1⟩|1\rangle، تغيّر البوابة حالة كيوبت الهدف؛ وإذا كانت حالة كيوبت التحكم ∣0⟩|0\rangle فلا يحدث أي تغيير على الإطلاق. في الترميز أدناه، افترض أن الكيوبت AA (أقصى اليمين) هو التحكم، والكيوبت BB (أقصى اليسار) هو الهدف. أدناه، الترميز المستخدم هو CNOT(qcontrol,qtarget)∣BA⟩CNOT(q_{control},q_{target})|BA\rangle.

CNOT(A,B)∣00⟩=∣00⟩,CNOT(A,B)∣01⟩=∣11⟩,CNOT(A,B)∣10⟩=∣10⟩,CNOT(A,B)∣11⟩=∣01⟩CNOT(A,B)|00\rangle = |00\rangle, \\ CNOT(A,B)|01\rangle = |11\rangle, \\ CNOT(A,B)|10\rangle = |10\rangle, \\ CNOT(A,B)|11\rangle = |01\rangle

قد ترى أحياناً CNOT مكتوبة بترتيب التحكم والهدف يُفترض ضمنياً. لكن لا يوجد مثل هذا الغموض في الكود أو في مخططات الدوائر.

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

تبدو بوابة CNOT مختلفة قليلاً في الدائرة، لأنها تتطلب كيوبتين. هكذا يتم تنفيذها:

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output of the previous code cell

تحقق من فهمك​

معظم البوابات لها نفس الشكل المصفوفي في Qiskit كما في أي مكان آخر. لكن بوابة CNOT تعمل على كيوبتين، وفجأة تصبح اصطلاحات ترتيب الكيوبتات مسألة مهمة. النصوص التي ترتب الكيوبتات كـ ∣q0,q1,...⟩|q_0,q_1,...\rangle ستُظهر شكلاً مصفوفياً مختلفاً لبوابات CNOT الخاصة بها. تحقق بضرب المصفوفات صراحة من أن مصفوفة CNOT أعلاه لها التأثير الصحيح على الحالة ∣01⟩|01\rangle.

الإجابة

CNOT∣01⟩=(1000000100100100)(0100)=(0001)=∣11⟩CNOT|01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = |11\rangle

بوابة XX: تعادل عملية NOT. بوابة أحادية الكيوبت.

X∣0⟩=∣1⟩,X∣1⟩=∣0⟩X|0\rangle = |1\rangle,\\X|1\rangle=|0\rangle X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

في Qiskit، إنشاء دائرة تحتوي على بوابة XX يبدو هكذا:

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output of the previous code cell

بوابة ZZ: تضيف "طورًا" إلى الحالة (عامل أمامي، يكون في حالة الحالات الذاتية لـ Z وهي ∣0⟩|0\rangle و∣1⟩|1\rangle إما 1 أو -1 على التوالي). بوابة أحادية الكيوبت.

Z∣0⟩=∣0⟩,Z∣1⟩=−∣1⟩Z|0\rangle = |0\rangle,\\Z|1\rangle=-|1\rangle Z=(100−1)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

في Qiskit، إنشاء دائرة تحتوي على بوابة ZZ يبدو هكذا:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output of the previous code cell

النظرية​

لنضع البروتوكول الخاص بالإرسال الكمي باستخدام الرياضيات. ثم في القسم التالي، سنحقق هذا الإعداد باستخدام حاسوب كمي.

ربط كيوبتي أليس وبوب بالتشابك: في البداية، كيوبت أليس وكيوبت بوب كل منهما على حدة في الحالة ∣0⟩|0\rangle (افتراض معقول وهو أيضًا التهيئة الصحيحة لحواسيب IBM® الكمية). يمكننا كتابة هذا كـ ∣0⟩B∣0⟩A|0\rangle_B|0\rangle_A أو ببساطة ∣00⟩|00\rangle. لنحسب ما يحدث حين تطبّق أليس وبوب بوابة هادامار على كيوبت أليس، ثم بوابة CNOT مع كيوبت أليس كتحكم وكيوبت بوب كهدف:

CNOT(A,B)HA∣0⟩B∣0⟩A=CNOT(A,B)∣0⟩B12(∣0⟩A+∣1⟩A)=12(CNOT(A,B)∣0⟩B∣0⟩A+CNOT(A,B)∣0⟩B∣1⟩A)=12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)\begin{aligned} CNOT(A,B)H_A |0\rangle_B|0\rangle_A &= CNOT(A,B)|0\rangle_B\frac{1}{\sqrt{2}}\left(|0\rangle_A+|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(CNOT(A,B)|0\rangle_B|0\rangle_A+CNOT(A,B)|0\rangle_B|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right) \end{aligned}

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

يُقدَّم Q: يتم تحضير الحالة السرية على الكيوبت Q:

∣ψ⟩Q=α0∣0⟩Q+α1∣1⟩Q|\psi\rangle_Q = \alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q

في هذه المرحلة، يكون Q ببساطة مجاوراً لكيوبت أليس (A). لم يحدث أي تشابك، لذا يمكن كتابة الحالة الكمومية للكيوبتات الثلاثة معاً على النحو التالي:

∣ψ⟩AB∣ψ⟩Q=12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)(α0∣0⟩Q+α1∣1⟩Q).|\psi\rangle_{AB}|\psi\rangle_Q = \frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right).

الهدف هو نقل المعلومات الموجودة على Q من موقع أليس إلى موقع بوب. عند هذه النقطة، لا نقدم أي ادعاءات أو متطلبات بشأن السرية أو سرعة نقل المعلومات. نحن فقط نستكشف كيف يمكن للمعلومات أن تنتقل من أليس إلى بوب. لأن المعلومات تبدأ على Q، سنفترض أن Q مخصص لأدنى رقم في أرقام الكيوبتات، بحيث يجعل ترميز little-endian من Q أقصى كيوبت إلى اليمين في الرياضيات أدناه.

تُشابك أليس الكيوبتين A وQ: تُطبّق أليس الآن بوابة CNOT باستخدام Q كتحكم وكيوبتها الخاص كهدف، ثم تُطبّق بوابة هادامارد على Q. لنحسب حالة الكيوبتات الثلاثة بعد هذه العملية:

HQCNOT(A,Q)∣ψ⟩AB∣ψ⟩Q=HQCNOT(A,Q)12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)(α0∣0⟩Q+α1∣1⟩Q)=HQCNOT(A,Q)12((α0∣0⟩B∣0⟩A∣0⟩Q+α1∣0⟩B∣0⟩A∣1⟩Q)+(α0∣1⟩B∣1⟩A∣0⟩Q+α1∣1⟩B∣1⟩A∣1⟩Q))=HQ12(α0∣0⟩B∣0⟩A∣0⟩Q+α1∣0⟩B∣1⟩A∣1⟩Q+α0∣1⟩B∣1⟩A∣0⟩Q+α1∣1⟩B∣0⟩A∣1⟩Q)=12(α0∣0⟩B∣0⟩A∣0⟩Q+α0∣0⟩B∣0⟩A∣1⟩Q+α1∣0⟩B∣1⟩A∣0⟩Q−α1∣0⟩B∣1⟩A∣1⟩Q)+12(α0∣1⟩B∣1⟩A∣0⟩Q+α0∣1⟩B∣1⟩A∣1⟩Q+α1∣1⟩B∣0⟩A∣0⟩Q−α1∣1⟩B∣0⟩A∣1⟩Q)\begin{aligned} H_Q CNOT(A,Q)|\psi\rangle_{AB}|\psi\rangle_Q &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right)\\ &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|0\rangle_A|1\rangle_Q\right)\right. \\ &+\left. \left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|1\rangle_A|1\rangle_Q\right)\right)\\ &= H_Q \frac{1}{\sqrt{2}}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q \right. \\ &+\left. \alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right)\\ &= \frac{1}{2}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_0 |0\rangle_B|0\rangle_A|1\rangle_Q \right. \\ &+ \left. \alpha_1 |0\rangle_B|1\rangle_A|0\rangle_Q-\alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q\right)\\ &+\frac{1}{2}\left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_0 |1\rangle_B|1\rangle_A|1\rangle_Q \right. \\ &+ \left. \alpha_1 |1\rangle_B|0\rangle_A|0\rangle_Q - \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right) \end{aligned}

لأن A و Q في نفس الموقع، دعنا نجمّع الحدود أعلاه وفقاً لنتائج القياسات على الكيوبتين A و Q:

∣ψ⟩=12((α0∣0⟩B+α1∣1⟩B)∣0⟩A∣0⟩Q+(α0∣0⟩B−α1∣1⟩B)∣0⟩A∣1⟩Q+(α1∣0⟩B+α0∣1⟩B)∣1⟩A∣0⟩Q+(−α1∣0⟩B+α0∣1⟩B)∣1⟩A∣1⟩Q)\begin{aligned} |\psi\rangle &= \frac{1}{2}\left((\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|0\rangle_A|0\rangle_Q + (\alpha_0 |0\rangle_B-\alpha_1 |1\rangle_B)|0\rangle_A|1\rangle_Q \right. \\ & + \left. (\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|0\rangle_Q+ (-\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|1\rangle_Q \right)\\ \end{aligned}

تحقق من فهمك​

بالنظر إلى التعبير أعلاه لحالات الكيوبتات الثلاثة جميعها، ما احتمال أن يعطي قياس الكيوبتين A و Q الحالة ∣0⟩A∣0⟩Q؟|0\rangle_A|0\rangle_Q؟

الإجابة

25%. لرؤية ذلك، تذكر أن حالة بوب يجب أن تكون مُطبَّعة، لذا ∣A⟨0∣Q⟨0∣12∣0⟩A∣0⟩Q(α0∣0⟩B+α1∣1⟩B)∣2=14∣(α0∣0⟩B+α1∣1⟩B)∣2=14 |_A \langle0|_Q\langle0| \frac{1}{2} |0\rangle_A|0\rangle_Q (\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}|(\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}

الآن، يمكن لأليس قياس الـ qubits A وQ. لا يمكنها التحكم في نتيجة هذا القياس، لأن القياسات الكمومية احتمالية. لذلك عندما تقيس، هناك 4 نتائج ممكنة وجميعها متساوية الاحتمال: ∣0⟩A∣0⟩Q|0\rangle_A|0\rangle_Q، ∣0⟩A∣1⟩Q|0\rangle_A|1\rangle_Q، ∣1⟩A∣0⟩Q|1\rangle_A|0\rangle_Q، و∣1⟩A∣1⟩Q|1\rangle_A|1\rangle_Q. لاحظ أن لكل نتيجة تبعات مختلفة على qubit بوب. على سبيل المثال، إذا وجدت أليس أن الـ qubits الخاصة بها في الحالة ∣0⟩A∣0⟩Q|0\rangle_A|0\rangle_Q، فإن ذلك يكون قد أدى إلى انهيار كامل الحالة الكمومية المكونة من 3 qubits إلى (α0∣0⟩B+α1∣1⟩B)∣0⟩A∣0⟩Q(\alpha_0|0\rangle_B+\alpha_1|1\rangle_B)|0\rangle_A|0\rangle_Q. تؤدي نتائج القياس الأخرى لأليس إلى حالات مختلفة لبوب. هذه مُجمَّعة في الجدول أدناه.

نتيجة أليسحالة بوبالتعليمة إلى بوبالنتيجة
∣0⟩A∣0⟩Q \vert 0\rangle_A \vert 0\rangle_Qα0∣0⟩B+α1∣1⟩B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_Bلا شيءα0∣0⟩B+α1∣1⟩B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
∣0⟩A∣1⟩Q \vert 0\rangle_A \vert 1\rangle_Qα0∣0⟩B−α1∣1⟩B\alpha_0\vert 0\rangle_B-\alpha_1\vert 1\rangle_BZZα0∣0⟩B+α1∣1⟩B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
∣1⟩A∣0⟩Q \vert 1\rangle_A \vert 0\rangle_Qα1∣0⟩B+α0∣1⟩B\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXXα0∣0⟩B+α1∣1⟩B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
∣1⟩A∣1⟩Q \vert 1\rangle_A \vert 1\rangle_Q−α1∣0⟩B+α0∣1⟩B-\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXX ثم ZZα0∣0⟩B+α1∣1⟩B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B

بالنسبة لجميع نتائج القياس الممكنة على qubits أليس، يبقى qubit بوب في حالة تشبه بشكل غامض الحالة السرية الموجودة أصلًا على Q. في الحالة التي تقيس فيها أليس ∣0⟩C∣0⟩A|0\rangle_C|0\rangle_A (الصف الأول من الجدول)، يبقى qubit بوب بالضبط في الحالة السرية! في الحالات الأخرى، هناك خطأ ما في الحالة. المعاملات (الـ α\alpha) متبادلة، أو توجد إشارة "-" حيث يجب أن تكون هناك إشارة "+"، أو كلاهما. من أجل تعديل qubit بوب لجعله مساويًا تمامًا للحالة السرية، يجب على أليس الاتصال ببوب (باستخدام وسيلة ما من وسائل الاتصال الكلاسيكي) وإخباره بإجراء عمليات إضافية على qubit الخاص به، كما هو موضح في الجدول. على سبيل المثال، في الصف الثالث تكون المعاملات متبادلة. إذا اتصلت أليس ببوب وأخبرته بتطبيق بوابة XX على qubit الخاص به، فإن ذلك يغير ∣0⟩|0\rangle إلى ∣1⟩|1\rangle والعكس صحيح، وتخرج الحالة السرية.

ينبغي أن يكون واضحًا الآن لماذا لا يمكننا استخدام هذا الإعداد لإرسال معلومات أسرع من الضوء. قد نكون محظوظين ونقيس ∣0⟩A∣0⟩Q|0\rangle_A|0\rangle_Q, ما يعني أن بوبًا لديه الحالة السرية بالضبط فورًا. لكن بوب لا يعلم ذلك حتى نتصل به ونخبره: "قسنا ∣0⟩A∣0⟩Q|0\rangle_A|0\rangle_Q، لذا لا يلزمك فعل أي شيء."

في تجربة الفكر، كثيرًا ما يُفصل الكيوبتان فيزيائيًا وينقلان إلى موقع جديد. تستخدم حواسيب IBM® الكمية كيوبتات حالة صلبة على شريحة لا يمكن فصلها. لذا بدلًا من نقل أليس وبوب إلى مواقع مختلفة، سنفصل المعلومات على الشريحة نفسها باستخدام ما يُسمى "بوابات المبادلة" لنقل المعلومات من كيوبت إلى آخر.

التجربة الأولى: الإرسال الكمي الأساسي​

توصي IBM Quantum بمعالجة مسائل الحوسبة الكمية باستخدام إطار عمل نسمّيه "أنماط Qiskit". يتكون من الخطوات التالية:

  • الخطوة 1: صِغ مسألتك كدائرة كمية
  • الخطوة 2: حسّن دائرتك للتشغيل على عتاد كمي حقيقي
  • الخطوة 3: نفّذ مهمتك على حواسيب IBM الكمية باستخدام IBM Quantum primitives
  • الخطوة 4: معالجة النتائج ما بعد التنفيذ

الخطوة 1: صِغ مسألتك كدائرة كمية​

كل الرياضيات التي أجريناها أعلاه كانت تحديدًا للخطوة 1. سننفّذها الآن ببناء دائرتنا الكمية باستخدام Qiskit! نبدأ بإنشاء دائرة كمية بثلاثة كيوبتات، ونشبّك كيوبتَي أليس وبوب. سنجعلهما الكيوبتين 1 و2، ونحتجز الكيوبت 0 للحالة السرية.

# Step 1: Map your problem to a quantum circuit

# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np

# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")

cr = ClassicalRegister(3, "c")

qc = QuantumCircuit(secret, Alice, Bob, cr)

# We entangle Alice's and Bob's qubits as in our work above.
# We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)

# Inserting a barrier changes nothing about the logic. It just allows us to
# force gates to be positioned in "layers".
qc.barrier()

# Now we will use random variables to create the secret state.
# Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi

# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()

# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()

# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])

# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice
# measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)

qc.draw(output="mpl")

Output of the previous code cell

هذا كل ما يلزم لإرسال حالة أليس كميًا إلى بوب. لكن تذكّر أننا حين نقيس حالة كمية α0∣0⟩+α1∣1⟩\alpha_0 |0\rangle+\alpha_1|1\rangle نجد إما ∣0⟩|0\rangle أو ∣1⟩|1\rangle. لذا في نهاية كل هذا، بوب لديه بالتأكيد الحالة السرية لأليس، لكن لا يمكننا التحقق من ذلك بسهولة عبر القياس. لكي يخبرنا القياس أننا أجرينا هذا بشكل صحيح، علينا استخدام حيلة. استخدمنا مؤثرًا سمّيناه "U" اختصارًا لـ "وحدوي" لتجهيز الحالة السرية لأليس. يمكننا تطبيق عكس U في نهاية دائرتنا. إذا كان U يحوّل حالة ∣0⟩|0\rangle لأليس إلى α0∣0⟩+α1∣1⟩\alpha_0 |0\rangle+\alpha_1|1\rangle، فإن عكس U سيحوّل α0∣0⟩+α1∣1⟩\alpha_0 |0\rangle+\alpha_1|1\rangle لبوب عودةً إلى ∣0⟩|0\rangle. هذا الجزء الأخير لن يكون ضروريًا إذا كان الهدف مجرد نقل المعلومات الكمية. نحن نفعل هذا فقط للتحقق من أنفسنا.

# Add the inverse of U and measure Bob's qubit.
qc.barrier()

qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate

qc.draw(output="mpl")

Output of the previous code cell

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

الخطوة 2: تحسين المسألة للتنفيذ الكمي​

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

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

يوجد كود أدناه لحفظ بيانات اعتمادك عند الاستخدام الأول. تأكد من حذف هذه المعلومات من الدفتر بعد حفظها في بيئتك، حتى لا تُشارَك بيانات اعتمادك عن طريق الخطأ حين تشارك الدفتر. اطّلع على Set up your IBM Cloud account وInitialize the service in an untrusted environment لمزيد من التوجيهات.

# Load IBM Quantum Compute Service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load IBM Quantum Compute Service

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

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_sherbrooke

نُفعّل صراحةً المنطق على القياسات.

from qiskit.circuit import IfElseOp

backend.target.add_instruction(IfElseOp, name="if_else")

الآن يجب علينا "نقل" الدائرة الكمية (transpile). تتضمن هذه العملية خطوات فرعية كثيرة وهي موضوع رائع. لإعطاء مثال على خطوة فرعية: ليست كل الحواسيب الكمية قادرة على تنفيذ جميع البوابات المنطقية في Qiskit مباشرة. يجب أن نكتب البوابات من دائرتنا بدلالة البوابات التي يستطيع الحاسوب الكمي تنفيذها. يمكننا تنفيذ ذلك، وعمليات أخرى، باستخدام مدير مسار مُعيَّن مسبقًا. ضبط optimization = 3 (أعلى مستوى من التحسين) يضمن أن الربط من دائرتنا الكمية المجردة إلى التعليمات المُعطاة للحاسوب الكمي يكون بأكبر قدر من الكفاءة الممكنة في مرحلة ما قبل المعالجة.

# Step 2: 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(qc)

"Sampler" هو primitive مصمم لأخذ عينات من الحالات المحتملة الناتجة عن دائرة كمومية، وجمع إحصائيات حول الحالات التي يمكن قياسها وباحتمالية كم. نستورد IBM Quantum Sampler هنا:

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

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

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)

الخطوة 3: التنفيذ​

استخدم الـ sampler لتشغيل مهمتك، مع الدائرة كوسيط.

job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()

الخطوة 4: معالجة النتائج والتحليل​

لنرسم النتائج ونفسّرها.

# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output of the previous code cell

تحقق من فهمك​

أي الحالات أعلاه يدل على نجاح الإرسال الكمي، وكيف يمكنك معرفة ذلك؟

الإجابة

الحالات ∣000⟩,|000\rangle, ∣001⟩,|001\rangle, ∣010⟩,|010\rangle, ∣011⟩|011\rangle كلها تتوافق مع نجاح الإرسال الكمي. وذلك لأننا أضفنا بوابة لإلغاء التجهيز الأولي للحالة السرية. إذا تم إرسال الحالة السرية بنجاح إلى كيوبت بوب، فإن تلك البوابة الإضافية يجب أن تُعيد كيوبت بوب إلى الحالة ∣0⟩|0\rangle. لذا أي حالة في الأعلى يكون فيها كيوبت بوب (الكيوبت 0، المقيس أيضًا في المكوّن الصفري للسجل الكلاسيكي، وبالتالي الأعلى/أقصى اليمين) في الحالة ∣0⟩|0\rangle يدل على النجاح.

يُظهر هذا الرسم البياني جميع نتائج القياس للكيوبتات الثلاثة، عبر 5,000 محاولة أو "طلقة". أشرنا سابقاً إلى أن أليس ستقيس جميع الحالات الممكنة للكيوبتين A و Q باحتمال متساوٍ. لقد خصصنا الكيوبتات 0-2 في الدائرة لـ Q و A و B، بهذا الترتيب. في ترميز little-endian، كيوبت بوب هو الأقصى إلى اليسار/الأدنى. لذا فإن الأعمدة الأربعة على اليسار تقابل كون كيوبت بوب في الحالة ∣0⟩|0\rangle، مع الكيوبتين الآخرين في جميع التوليفات الممكنة باحتمال متساوٍ تقريباً. لاحظ أن معظم (عادةً ~95%) القياسات تعطي كيوبت بوب في الحالة ∣0⟩|0\rangle، مما يعني أن إعدادنا نجح! هناك عدد قليل من الطلقات (~5%) أعطت كيوبت بوب في الحالة ∣1⟩|1\rangle. لا ينبغي أن يكون ذلك ممكناً منطقياً. لكن جميع الحواسيب الكمومية الحديثة تعاني من الضجيج والأخطاء بدرجة أكبر بكثير من الحواسيب الكلاسيكية. وتصحيح الأخطاء الكمومية ما زال مجالاً ناشئاً.

التجربة الثانية: الإرسال الكمي عبر المعالج​

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

الخطوة 1: صِغ مسألتك كدائرة كمية​

هذه المرة، ستتغير الكيوبتات المقابلة لأليس وبوب. لذا لن نسمّي كيوبتًا واحدًا "A" وآخر "B". بدلًا من ذلك، سنرقّم الكيوبتات ونستخدم متغيرات لتمثيل الموضع الحالي للمعلومات على الكيوبتات المنتمية لأليس وبوب. جميع الخطوات الأخرى باستثناء بوابات المبادلة كما هو موضح سابقًا.

# Step 1: Map

# Define registers
qr = QuantumRegister(13, "q")

qc = QuantumCircuit(qr, cr)

# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)

# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])

# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits,
# until the information is on distant qubits.

for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1

qc.barrier()

# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi

qc.u(theta, varphi, 0.0, secret)

# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)

qc.barrier()

# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])

# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])

qc.barrier()

# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate

qc.draw("mpl")

مخرجات الخلية البرمجية السابقة

يمكنك أن ترى في مخطط الدائرة أن الخطوات المنطقية هي نفسها. الفرق الوحيد هو أننا استخدمنا بوابات المبادلة لنقل حالة كيوبت أليس من الكيوبت 6 (A5A_5) صعوداً إلى الكيوبت 1 (A0A_0)، بجانب Q مباشرة. واستخدمنا بوابات المبادلة لنقل حالة بوب الأولية من الكيوبت 7 (B0B_0) نزولاً إلى الكيوبت 12 (B5B_5). لاحظ أن الحالة على الكيوبت 12 ليست مرتبطة حتى بحالة Q السرية إلا بعد إجراء القياسات على الكيوبتات البعيدة 0 و1، والحالة على الكيوبت 12 لا تساوي الحالة السرية إلا بعد تطبيق بوابتي XX وZZ المشروطتين.

الخطوة 2: حسّن دائرتك​

عادةً، حين نستخدم مدير التمرير لتحويل دوائرنا وتحسينها، من المنطقي ضبط optimization_level = 3، لأننا نريد أن تكون دوائرنا بأقصى كفاءة ممكنة. في هذه الحالة، لا يوجد سبب حسابي لنقل الحالات من الكيوبتات 6 و7 إلى الكيوبتات 1 و12. كان ذلك فقط شيئاً فعلناه لإثبات الإرسال الكمي عن بُعد عبر مسافة. لو طلبنا من مدير التمرير تحسين دائرتنا، سيدرك أنه لا يوجد سبب منطقي لبوابات المبادلة هذه، وسيزيلها وينفّذ عمليات البوابات على كيوبتات متجاورة. لذا في هذه الحالة الخاصة، نستخدم optimization_level = 0.

# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pmzero = generate_preset_pass_manager(target=target, optimization_level=0)

qc_isa_zero = pmzero.run(qc)

print(qc_isa_zero.depth())
105

يمكننا تصوّر أماكن هذه الكيوبتات على المعالج الكمي باستخدام دالة plot_circuit_layout.

الخطوة 3: التنفيذ​

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

# This required 5 s to run on a Heron r2 processor on 10-28-24
job = sampler.run([qc_isa_zero])
# job = sampler_sim.run([qc_isa_zero])
counts = job.result()[0].data.c.get_counts()
from qiskit.visualization import plot_histogram

plot_histogram(counts)

مخرجات الخلية البرمجية السابقة

الخطوة 4: المعالجة الكلاسيكية اللاحقة​

نلاحظ مرة ثانية إن احتمالات النتائج الممكنة لكيوبتات أليس موزعة بشكل شبه متساوٍ. هناك ميل واضح لقياس كيوبت بوب في الحالة ∣0⟩|0\rangle بعد عكس الشيفرة السرية، يعني احتمال كبير إننا نقلنا الحالة السرية بنجاح عبر المعالج من Q إلى بوب (من الكيوبت 0 إلى الكيوبت 12). لكن نلاحظ أن فرصة عدم قياس ∣0⟩|0\rangle لبوب أصبحت أعلى قليلًا هذه المرة. وهذا درس مهم في الحوسبة الكمية: كلما زاد عدد البوابات، وخاصة بوابات متعدد الكيوبتات مثل بوابات المبادلة، كلما زادت الضوضاء والأخطاء.

الأسئلة​

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

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

  • الكيوبتات ممكن تكون متشابكة، يعني قياس كيوبت واحد يؤثر أو يحدد حالة كيوبت آخر.

  • التشابك يختلف عن الترابط الكلاسيكي؛ مثلًا، الكيوبتان A وB ممكن يكونا في تراكب من الحالات مثل α0∣00⟩+α1∣11⟩\alpha_0|00\rangle+\alpha_1|11\rangle. حالة A أو B ممكن تكون غير محددة بالطبيعة، ومع ذلك يكون مضمونًا إن A وB في نفس الحالة.

  • من خلال دمج التشابكات والقياسات، يمكننا نقل حالة (التي يمكنها تخزين معلومات) من كيوبت إلى آخر. هذا النقل ممكن يحدث على مسافات بعيدة، وهذا هو ما نسميه الإرسال الكمي عن بُعد (quantum teleportation).

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

  • أجهزة الحوسبة الكمية الحديثة أكثر عرضة للضوضاء والأخطاء مقارنة بالحواسيب الكلاسيكية. توقع أخطاء بنسبة بضعة بالمئة.

  • كلما أضفت بوابات أكثر بالتسلسل (وخاصة بوابات الكيوبتين) كلما توقعت أخطاء وضوضاء أكثر.

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

  1. ص/خ: الإرسال الكمي عن بُعد ممكن يُستخدم لإرسال معلومات أسرع من الضوء.

  2. ص/خ: الأدلة الحديثة تشير إلى أن انهيار الحالة الكمية ينتشر أسرع من الضوء.

  3. ص/خ: في Qiskit، الكيوبتات مرتبة في الحالات بحيث الكيوبت الأقل رقمًا يكون على اليمين، كما في ∣q3,q2,q1,q0⟩|q_3,q_2,q_1, q_0\rangle

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

  1. الكيوبتان A وB متشابكتان، ثم فُصلا بمسافة كبيرة dd. قِيس الكيوبت A. أي عبارة صحيحة بخصوص السرعة التي تتأثر بها حالة الكيوبت B؟
  • أ. يتأثر الكيوبت B فورًا في حدود التسامح التجريبي، في التجارب التي أُجريت حتى الآن.

  • ب. يتأثر الكيوبت B بعد زمن مقداره d/cd/c، يعني الحالة الكمية "تنهار" بسرعة قريبة من سرعة الضوء في حدود التسامح التجريبي.

  • ج. يتأثر الكيوبت B فقط بعد حدوث تواصل كلاسيكي، يعني يحصل في زمن أطول من d/cd/c.

  • د. لا شيء مما سبق

  1. تذكر أن احتمالية القياس مرتبطة بالسعات في الحالات الكمية. مثلًا، لو كان كيوبت في البداية في الحالة α0∣0⟩+α1∣1⟩\alpha_0|0\rangle+\alpha_1 |1\rangle, فاحتمال قياس الحالة ∣0⟩|0\rangle هو ∣α0∣2|\alpha_0|^2. لكن ليست كل مجموعات القياسات تطابق هذه الاحتمالات تمامًا، بسبب محدودية العيّنات (تمامًا مثل رمي عملة معدنية وظهور الوجه مرتين متتاليتين). مخطط القياسات التالي ممكن يقابل أي من الحالات الكمية الآتية؟ اختر أفضل إجابة.

entangled_teleportation_fig

  • أ. ∣0⟩|0\rangle

  • ب. 12(∣0⟩−∣1⟩)\frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right)

  • ج. 12(∣0⟩+∣1⟩)\frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right)

  • د. 45∣0⟩+35∣1⟩\frac{4}{5}|0\rangle+\frac{3}{5}|1\rangle

  • هـ. 35∣0⟩+45∣1⟩\frac{3}{5}|0\rangle+\frac{4}{5}|1\rangle

  1. أي من الحالات الآتية تُظهر تشابكًا بين الكيوبتين A وB؟ اختر كل ما ينطبق.
  • أ. 12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)

  • ب. 45∣0⟩B∣0⟩A+35∣1⟩B∣1⟩A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A

  • ج. 12(∣0⟩B∣1⟩A−∣1⟩B∣0⟩A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)

  • د. 12(∣0⟩B∣0⟩A+∣1⟩B∣0⟩A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|0\rangle_A\right)

  • هـ. ∣0⟩B∣0⟩A|0\rangle_B|0\rangle_A

  1. في هذه الوحدة، جهّزنا حالة متشابكة: 12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A).\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right). لكن في حالات متشابكة كثيرة أخرى ممكن نستخدمها في بروتوكول مشابه. أي من الحالات أدناه ممكن ينتج مخطط قياسات ثنائي الكيوبت مثل التالي؟ اختر أفضل إجابة.

entangled_teleportation_fig_0110

  • أ. 12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)

  • ب. 45∣0⟩B∣0⟩A+35∣1⟩B∣1⟩A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A

  • ج. 12(∣0⟩B∣1⟩A−∣1⟩B∣0⟩A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)

  • د. 45∣0⟩B∣1⟩A+35∣1⟩B∣0⟩A\frac{4}{5}|0\rangle_B|1\rangle_A+\frac{3}{5}|1\rangle_B|0\rangle_A

  • هـ. ∣0⟩B∣0⟩A|0\rangle_B|0\rangle_A

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

  1. اشرح بروتوكول الإرسال الكمي عن بُعد من البداية للنهاية لشريكك/مجموعتك. تحقق مما إذا كان لديهم إضافات أو أسئلة.

  2. هل هناك أي شيء فريد بشأن الحالة المتشابكة الأولية بين أليس وبوب: 12(∣0⟩B∣0⟩A+∣1⟩B∣1⟩A)؟\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)؟ إن كان الأمر كذلك، فما هو المميز فيها؟ وإن لم يكن كذلك، فما هي الحالات المتشابكة الأخرى التي كان بإمكاننا استخدامها؟