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

ابدأ مع Qiskit في الفصل الدراسي

في هذه الوحدة من سلسلة 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®.

تم اختبار هذه الوحدة وقد استُخدم فيها ٢ ثانية من وقت QPU على معالج Heron v2. هذا تقدير فقط، وقد يختلف الاستخدام الفعلي.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer 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'

مقدمة

في وحدات Qiskit in the Classroom، ستتاح لك الفرصة لاستخدام جهاز كمبيوتر كمومي لاستكشاف مفاهيم متعددة في المجالات المجاورة للحوسبة الكمومية، مثل ميكانيكا الكم وعلوم الحاسب والكيمياء وغيرها. تعمل هذه الوحدة كمتطلب مسبق للوحدات الأخرى — إذ تُقدّم أساسيات الحوسبة الكمومية وكيفية استخدام Qiskit لتشغيل الدوائر الكمومية.

أولاً سنعطيك نظرة عامة موجزة عن كيفية عمل الكمبيوتر الكلاسيكي، ثم سنريك كيف تُكيَّف هذه المفاهيم لتناسب نموذج الحوسبة الكمومية. وأخيراً، سنريك كيف تجمع هذه المفاهيم معاً لبناء وتنفيذ أول دائرة كمومية لك.

أجهزة الكمبيوتر الكلاسيكية

على الأرجح أنت على دراية بأساسيات عمل أجهزة الكمبيوتر الكلاسيكية، لكننا سنُبرز هنا بعض الميزات الرئيسية حتى نتمكن من المقارنة بينها وبين أجهزة الكمبيوتر الكمومية.

الوحدات الأساسية للمعلومات: البتات

تُعالج أجهزة الكمبيوتر الكلاسيكية المعلومات الكلاسيكية، والوحدة الأساسية للمعلومات الكلاسيكية هي البت (bit). يمكن لبت واحد تخزين الإجابة على سؤال واحد بـ"نعم/لا". عادةً ما نُمثّل الحالتين الثنائيتين للبت بـ"0" و"1".

مراجعة الأعداد الثنائية

يُمكّنك الجمع بين البتات من تخزين معلومات أكثر. على سبيل المثال، إذا أردت تخزين رقم من 0 إلى 15، يمكنك فعل ذلك بأربعة بتات على النحو التالي:

0 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

بشكل عام، لتحويل رقم ثنائي من NN بت إلى رقم مألوف بالنظام العشري (الأساس 10)، تضرب البت الأقل أهمية (الأيمن) في 20=12^0 = 1، والبت التالي إلى اليسار في 21=22^1 = 2، ثم التالي في 22=42^2 = 4، وهكذا حتى تصل إلى البت الأكثر أهمية (الأيسر) الذي تضربه في 2N12^{N-1}.

إذن، هذا يعني أن NN بتًا يمكن أن تكون في إحدى 2N2^N حالة مختلفة ممكنة.

اختبر فهمك

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

كم عدد البتات التي تحتاجها لتمثيل الرقم 86؟ اكتب سلسلة البتات التي تُشفّر هذا الرقم في الثنائي.

الإجابة:

تذكّر أن NN بتًا تتيح لك تمثيل الأرقام من 00 إلى 2N12^N - 1، لذا باستخدام ستة بتات يمكننا الوصول إلى 261=632^6 - 1 = 63. هذا ليس كافياً. نضيف بتًا آخر للوصول إلى 271=1272^7 - 1 = 127. الآن لنُحلّل 86 إلى قوى للعدد 2:

86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

العمليات الأساسية: البوابات

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

بوابة البت الواحد:

NOT

عندما يكون لديك بت واحد فقط، هناك طريقة واحدة فقط يمكنك من خلالها تحويل حالته: قلب الحالة من 0 إلى 1 أو من 1 إلى 0. نُسمّي هذه البوابة "NOT". يمكن تمثيل تأثير هذه البوابة — وبقية البوابات التي سنناقشها أدناه — في ما يُسمى "جدول الحقيقة"، مع أعمدة لحالات الإدخال والإخراج للبتات. جدول الحقيقة لبوابة NOT هو:

الإدخالالإخراج
01
10

بوابات متعددة البتات:

AND

AND هي بوابة ثنائية البت تأخذ بتين إدخاليين وتُخرج بتًا واحدًا. تُخرج 1 إذا كان كلا البتين 1، وإلا تُخرج 0:

الإدخالالإخراج
000
010
100
111

OR

OR هي بوابة أخرى ثنائية البت بإخراج بت واحد. تُخرج 1 إذا كان أيٌّ من البتين يساوي 1:

الإدخالالإخراج
000
011
101
111

XOR

XOR تعني "OR الحصري" وهي تشبه بوابة OR، لكنها تُخرج 1 فقط إذا كان أحد البتين فقط يساوي 1. تُخرج 0 إذا كانا كلاهما 1 أو كلاهما 0:

الإدخالالإخراج
000
011
101
110

القياسات:

عادةً، عند التعلم عن الحوسبة الكلاسيكية، لا يُولى كثير من الاهتمام لعملية قراءة حالة البتات. وذلك لأنها ليست معقدة من المنظور المفاهيمي. يمكنك قياس البتات في أي وقت قبل الحساب أو أثناءه أو بعده، ولا يؤثر ذلك على النتيجة. هذا ليس الحال في الحوسبة الكمومية، كما سنناقش أدناه.

الدوائر:

بالجمع بين البوابات أعلاه، يمكنك إجراء أي نوع من العمليات على الكمبيوتر. لنأخذ مثالاً بسيطاً: باستخدام بوابتي AND وXOR، يمكنك بناء دائرة نصف الجامع (half-adder)، التي تحسب مجموع بتين. يُمثَّل ذلك في مخطط دائرة منطقية، حيث تُمثّل الأسلاك البتاتِ وتظهر البوابات التي تعمل على البتات كرموز على الأسلاك المقابلة:

مخطط الدائرة الكلاسيكية لدائرة نصف الجامع. تُولّد بوابة XOR بت المجموع وتُولّد بوابة AND بت الحمل.

إذن، يُنسخ البتان ويُغذّيان عبر بوابة AND وبوابة XOR معاً. نتيجة بوابة XOR هي "بت المجموع" (S)، الذي يبقى في منزلة الآحاد للرقم الثنائي، ونتيجة بوابة AND هي "بت الحمل" (C)، وهو قيمة الرقم الأعلى أهمية في الرقم الثنائي. إليك جدول الحقيقة:

AABBالمجموع (ABA \oplus B)الحمل (ABA \wedge B)
0000
0110
1010
1101

اختبر فهمك

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

تحقق من أن جدول الحقيقة أعلاه يُعطي الحل الصحيح لدائرة الجامع. أي لكل خيار من الخيارات الأربعة لـ A وB، تحقق من أن A+B=S+2×CA+B=S+2 \times C.

الإجابة:

0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

أجهزة الكمبيوتر الكمومية

البتات \rightarrow الكيوبتات

تمامًا كما أن البتات هي الوحدات الأساسية للمعلومات الكلاسيكية، فإن البتات الكمومية، أو "الكيوبتات"، هي الوحدات الأساسية للمعلومات الكمومية. مثل البت الكلاسيكي، يمكن أن تكون حالة الكيوبت إما 0 أو 1، وهو ما نُشير إليه عادةً بـ0\vert 0\rangle و1\vert 1\rangle. لكن على خلاف البت الكلاسيكي، يمكن للكيوبت أيضًا أن يكون في تراكب (superposition) من حالة 0\vert 0\rangle وحالة 1\vert 1\rangle في آنٍ واحد. بشكل عام، يمكن أن يكون الكيوبت في أي حالة ψ\vert \psi\rangle من الشكل:

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

حيث c0c_0 وc1c_1 هما سعتان مركبتان (complex amplitudes) بحيث c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

الطور الكمومي

بما أن c0c_0 وc1c_1 أعداد مركبة، يمكن كتابة كل منهما على شكل ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i} حيث ϕi\phi_i يُسمى الطور (phase). إذا ضربنا الحالة كلها بنفس عامل الطور الكلي، فلن يتغير شيء فيزيائيًا — ويُسمى هذا الطور الكلي (global phase)، وليس له أي نتائج قابلة للرصد.

لهذا السبب، من المعتاد "استخراج" eiϕ0e^{i\phi_0}، مما يُعطي:

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

حيث ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 هو الطور النسبي للحالة الكمومية، الذي له فعلاً نتائج قابلة للرصد.

يلعب هذا الطور دورًا مهمًا جدًا في الحوسبة الكمومية، وستستكشف نتائجه المتعددة في وحدات Qiskit in the Classroom اللاحقة.

كيوبتات متعددة

بينما يمكن التعبير عن حالة بتات متعددة ببساطة كسلسلة من الأصفار والواحدات، فإن حالة كيوبتات متعددة تصبح أكثر تعقيداً بسبب مبدأَي التراكب والتشابك.

تذكّر أن NN بتًا يمكن أن تكون في إحدى 2N2^N حالة ممكنة تتراوح من الأرقام الثنائية 000...000 إلى 111...111. لكن الآن، بفضل مبدأ التراكب، يمكن لـNN كيوبت أن تكون في تراكب من جميع هذه الحالات في آنٍ واحد!

يمكن التعبير عن ذلك بـ:

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

حيث كما في الحالة الكلاسيكية، تُقابل الحالة i\vert i\rangle الحالةَ التي يكون فيها كل كيوبت في التركيبة الصحيحة من الأصفار والواحدات لإنتاج الرقم الثنائي ii. تُعرف هذه بـ"حالات القاعدة الحسابية" للنظام الكمومي. على سبيل المثال، يمكن كتابة حالة ثلاثة كيوبتات كتراكب من حالاتها الثماني للقاعدة الحسابية:

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

يُشار إلى كل كيوبت في النظام بفهرس من 00 إلى N1N-1. الاتفاقية هي قراءة حالات الكيوبتات من اليمين إلى اليسار، بحيث تكون حالة الكيوبت 00 هي الأقصى يمينًا وحالة الكيوبت N1N-1 هي الأقصى يسارًا. يُعرف هذا بترميز "little-endian"، وقد يبدو غير بديهي في البداية، إذ اعتدنا القراءة من اليسار إلى اليمين.

اختبر فهمك

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

للوهلة الأولى قد يبدو ترتيب الكيوبتات من اليمين إلى اليسار كما في ترميز little-endian غير بديهي، لكنه في الواقع أمر منطقي جداً! اشرح السبب. (تذكّر مناقشتنا أعلاه حول تحويل الأرقام الثنائية إلى الأساس 10.)

الإجابة:

إذا رتّبنا الكيوبتات من اليمين إلى اليسار، بحيث يكون الكيوبت 0 هو الأبعد يمينًا والكيوبت N-1 هو الأبعد يسارًا، فمن المنطقي ربط الكيوبت 00 بالبت الأقل أهمية الذي يُضرب في 202^0، والكيوبت N1N-1 بالبت الأكثر أهمية الذي يُضرب في 2N12^{N-1}.

التشابك

كما ذكرنا سابقًا، ميزة رئيسية أخرى للكيوبتات هي أنها يمكن أن تكون متشابكة مع بعضها. لنأخذ مثالاً على حالة كيوبتين، حيث c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} وc1=c2=0c_1 = c_2 = 0:

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

إذن، يمكن أن تكون حالة الكيوبت 0 إما 0\vert 0\rangle أو 1\vert 1\rangle باحتمال متساوٍ، وكذلك حالة الكيوبت 1. لكن هذه الاحتمالات لم تعد مستقلة عن بعضها. إذا وجدنا حالة الكيوبت 0 في 0\vert 0\rangle، فإننا نعلم أن الكيوبت 1 سيكون أيضًا في 0\vert 0\rangle. وهذا صحيح بغض النظر عن البُعد بينهما، ولهذا السبب يُشار أحيانًا إلى عملية قياس الحالة المتشابكة بـ"الفعل المخيف عن بُعد" (spooky action at a distance).

يمكن أن يأخذ التشابك أشكالاً أخرى أيضًا. على سبيل المثال، الحالة

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

تُنتج نتائج متعاكسة في كل مرة: إذا قِيسَ أحد الكيوبتين في 0\vert 0\rangle، فمن المضمون أن يُوجَد الآخر في الحالة 1\vert 1\rangle.

اختبر فهمك

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

هل الحالة ψ=11\vert \psi\rangle = \vert 11\rangle متشابكة؟ لماذا أو لماذا لا؟

الإجابة:

هي ليست متشابكة. بينما تكون النتائج دائمًا متطابقة عند قياس كلا الكيوبتين، هذا فقط لأن كل كيوبت ثابت دائمًا في الحالة 1\vert 1\rangle. نتيجة قياس أحد الكيوبتين لا تعتمد فعلياً على الآخر — فكلاهما دائمًا 1\vert 1\rangle.

بشكل عام، إذا كان بإمكانك وصف حالة كل كيوبت بشكل منفصل ثم ضربها معًا على هذا النحو:

ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

فتُعرف بـ"حالة الضرب" (product state) وهي غير متشابكة.

الترميز الاتجاهي

غالبًا ما يكون من المفيد استخدام المتجهات والمصفوفات لرؤية كيف تتحول الحالة الكمومية تحت عمليات مختلفة. في هذا التمثيل، ستكون الحالات الكمومية متجهاتٍ، وستكون البوابات الكمومية (المناقشة في القسم التالي) مصفوفاتٍ تُحوّل المتجهات.

لكيوبت واحد، يُختار الشكل الاتجاهي للحالات على النحو التالي: 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} بهذه الطريقة، يمكن كتابة الحالة الاعتباطية ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle على النحو: ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

لحالة عامة من nn كيوبت، نحتاج إلى متجه بأبعاد 2n2^n، مع حالات قاعدة مرتّبة كما تتوقع، بترتيب تصاعدي للقيمة الثنائية:

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

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

اختبر فهمك

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

هناك أربع حالات للقاعدة الحسابية لنظام كيوبتين. اكتب كل واحدة بترميزَي ket والمتجه.

الإجابة:

00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

البوابات \rightarrow البوابات الكمومية

تمامًا كما يمكن دمج البوابات الكلاسيكية مثل NOT وAND وOR وXOR لبناء دوائر كلاسيكية اعتباطية، تؤدي البوابات الكمومية الدور نفسه في الحوسبة الكمومية. نظرًا لأن الكيوبتات تمتلك ميزات ميكانيكية كمومية إضافية، فإن البوابات الكمومية أكثر ثراءً بالمقابل. بينما لا يزال بإمكاننا وصف تأثيرها على حالات القاعدة 0|0\rangle و1|1\rangle بجدول حقيقة، إلا أن ذلك لا يُعطي الصورة الكاملة. للبوابات الكمومية، من الطبيعي أكثر استخدام تمثيل المصفوفات، لأنها تعمل أيضًا على تراكبات حالات القاعدة.

فيما يلي سنتعرف على البوابات الكمومية الأكثر شيوعًا وكيف تُحوّل الكيوبتات التي تتفاعل معها. وعند الاقتضاء، سنربطها بالبوابات الكلاسيكية المألوفة.

بوابات الكيوبت الواحد

بوابة XX: هذا هو المكافئ الكمومي لعملية NOT. جدول حقيقتها يبدو تمامًا مثل بوابة NOT الكلاسيكية:

الإدخالالإخراج
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

وتمثيلها المصفوفي:

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

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

from qiskit import QuantumCircuit

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

ناتج خلية الكود السابقة

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

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

الإدخالالإخراج
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

التمثيل المصفوفي: H=12(1111)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")

ناتج خلية الكود السابقة

بوابة ZZ: تُضيف إزاحة طور Δϕ=π\Delta \phi = \pi إلى الحالة 1|1\rangle:

الإدخالالإخراج
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

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

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

ناتج خلية الكود السابقة

بوابة TT: تُضيف إزاحة طور Δϕ=π/4\Delta \phi = \pi/4 إلى الحالة 1|1\rangle:

الإدخالالإخراج
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

في Qiskit، يبدو إنشاء دائرة ببوابة TT هكذا:

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

Output of the previous code cell

بوابات متعددة الكيوبت

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

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

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

الإدخالالإخراج
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

إذًا، المصفوفة التي تمثل هذا الفعل هي:

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

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

Output of the previous code cell

هذا أول مخطط دائرة نراه يتضمن كيوبتين، يُمثَّلان بالسلكين. بوابة CNOT مُطبَّقة بين الكيوبتين، حيث q0q_0 هو كيوبت التحكم وq1q_1 هو الهدف.

اختبر فهمك

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

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

الإجابة:

CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 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} = \vert 11\rangle

بوابة SWAP: تبادل هذه البوابة حالتَي كيوبتين. جدول الصحة:

الإدخالالإخراج
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

إذًا، المصفوفة التي تمثل هذا الفعل هي:

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

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

Output of the previous code cell

يمكن في الواقع بناء بوابة SWAP من ثلاث بوابات CNOT. لنرى كيف، يمكننا decompose() البوابة باستخدام Qiskit:

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

Output of the previous code cell

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

اختبر فهمك

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

تحقق من أن تركيبة بوابات CNOT أعلاه تُنتج بوابة SWAP. يمكنك فعل ذلك بضرب المصفوفات أو بأي طريقة أخرى.

الإجابة:

بضرب المصفوفات:

(1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

باستخدام جدول الصحة لرؤية كيف تتغير الحالات مع كل CNOT. في العمود الأخير، يجب أن تكون الحالات مكافئة لعمود "الإخراج" في جدول صحة SWAP:

الإدخالCNOT(A,B)CNOT(B,A)CNOT(A,B)
00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

بوابة Toffoli (أو "NOT المتحكَّم بها مرتين" (CCNOT)): هذه بوابة تعمل على ثلاثة كيوبتات. الاسم "NOT المتحكَّم بها مرتين" قد يخبرك بالفعل كيف تعمل: هناك كيوبتا تحكم وكيوبت هدف واحد، وتُقلب حالة الكيوبت الهدف فقط إذا كان كلا كيوبتَي التحكم في الحالة 1\vert 1\rangle. نحتفظ باتفاقية الترتيب التي استخدمناها مع CNOT:

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

إذًا جدول الصحة هو:

الإدخالالإخراج
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

والمصفوفة التي تمثل هذا الفعل هي:

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Output of the previous code cell

يمكن أيضًا تحليل بوابة Toffoli إلى بوابات CNOT مع بعض البوابات الأخرى. غير أن ذلك أكثر تعقيدًا بكثير من تحليل بوابة SWAP، لذا سيُترك كتمرين اختياري في نهاية الوحدة لاستكشاف هذا التحليل والتحقق منه.

القياسات

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

تحديدًا، إذا كانت لديك حالة كمومية مؤلفة من NN كيوبت على الشكل ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle، فإن القياس سيُطيح بالحالة إلى إحدى الدوال الأساسية i\vert i\rangle باحتمالية ci2\vert c_i\vert ^2.

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

في Qiskit، عند إجراء القياس يُرسَل إلى سجل كلاسيكي حيث يُخزَّن كبت كلاسيكي. إنشاء دائرة تتضمن قياسًا يبدو كالتالي:

qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")

Output of the previous code cell

الدوائر

الآن بعد أن عرفنا كيف تعمل الكيوبتات والبوابات والقياسات، لنصنع دائرتنا الكمومية الخاصة وننفذها! لهذا، سنُعرّفك على سير عمل مفيد يُسمى أنماط Qiskit.

إطار أنماط Qiskit

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

  1. التعيين — تعيين مسألتنا إلى دوائر كمومية ومؤثرات
  2. التحسين — تحسين الدائرة لتلائم العتاد المستهدف
  3. التنفيذ — التشغيل على العتاد المستهدف
  4. المعالجة اللاحقة — معالجة نتائجنا

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

1. التعيين

تستخدم دائرة الجامع الكلاسيكية بوابة XOR وبوابة AND لحساب بتَّي المجموع والحمل على التوالي. يمكننا تكييف هذه البوابات في السياق الكمومي لصنع نصف الجامع الكمومي. أولًا، وتذكيرًا بأن البوابات الكمومية قابلة للعكس، لا يمكننا ببساطة الكتابة فوق المدخلات. بدلًا من ذلك، ندخل كيوبتين مساعدتين مهيَّأتين على 0\vert 0\rangle لتخزين مخرجَي المجموع والحمل. إذًا، حالتنا الكمومية الكاملة ستتكون من الكيوبتين AA وBB، وكيوبتَي المجموع والحمل اللتين سنسميهما SS وCC:

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

الآن، نحتاج بوابات كمومية تُنجز ما كانت تفعله بوابتا XOR وAND في الدائرة الكلاسيكية.

المجموع:

بالنسبة لـXOR، نطبق بوابتَي CNOT، كلتاهما بكيوبتَي تحكم AA وBB وكيوبت هدف SS. إن كانت AA وBB مختلفتين، فإن إحدى بوابتَي CNOT ستقلب SS إلى الحالة 1\vert 1\rangle. أما إن كانت AA وBB كلتاهما 0\vert 0\rangle، فلا شيء يحدث لـSS وتبقى في الحالة 0\vert 0\rangle. وإن كانت AA وBB كلتاهما 1\vert 1\rangle، فستُقلب حالة SS مرتين فتعود إلى الحالة 0\vert 0\rangle.

الحمل:

لبت الحمل، نحتاج شيئًا يعمل مثل بوابة AND الكلاسيكية.

اختبر فهمك

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

راجع البوابات التي ناقشناها لترى إن كنت تستطيع تخمين أي بوابة كمومية سنستخدم بدلًا من بوابة AND الكلاسيكية:

الإجابة:

إنها بوابة Toffoli! تذكّر، بوابة Toffoli أو "NOT المتحكَّم بها مرتين" تقلب الحالة الهدف فقط إذا كان كيوبت التحكم 0 وكيوبت التحكم 1 كلاهما في الحالة 1\vert 1\rangle. إذًا، إن بدأ الكيوبت الهدف في الحالة 0\vert 0\rangle، فإن فعلها يكون مماثلًا لفعل بوابة AND.

الآن لدينا كل المكونات اللازمة لصنع الدائرة الكمومية:

# qubits: a, b, sum, carry
qc = QuantumCircuit(4)

# Choose values for A and B:
a = 0
b = 0

# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)

# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)

# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b

# measure
qc.measure_all()

qc.draw("mpl")

Output of the previous code cell

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

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

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

2. التحسين:

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

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

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

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Qiskit Runtime 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_fez

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

# Transpile the circuit and optimize for running on the quantum computer selected
# 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)

qc_isa.draw("mpl")

Output of the previous code cell

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

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

sampler = Sampler(mode=backend)

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

# 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. التنفيذ

بعد تجهيز الدائرة، يمكننا الآن تشغيلها على الحاسوب الكمومي!

job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()

4. المعالجة اللاحقة

الآن جاهزون لعرض نتائجنا! سنعرض مخططًا تكراريًا لـ100 عينة من الدائرة.

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)
counts =  {'0000': 90, '0100': 4, '1100': 3, '0010': 3}

Output of the previous code cell

يُظهر المخطط التكراري أعلاه نتائج قياس جميع الكيوبتات الأربع في نهاية الدائرة. حاسوب كمومي مثالي خالٍ من الضوضاء كان سيقيس الكيوبتات بنفس القيم في كل مرة، لكن في الواقع، الضوضاء ستُسبب أخطاء في بعض التشغيلات.

اختبر فهمك

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

باستخدام سلسلة البتات ذات أعلى عدد كقيم لـAA وBB وSS وCC، تحقق من أن دائرة الجامع الكمومي عملت بشكل صحيح.

الإجابة:

نحتاج إلى التحقق من أن A+B=S+2×CA+B = S+2 \times C. تذكر أن ترتيب سلسلة البتات يتبع الترميز "little-endian"، لذا يُقرأ على الشكل CSBA.

من المخطط التكراري أعلاه، نرى أن سلسلة البتات 0000 هي المهيمنة.

0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

ارجع وغيّر قيم AA وBB إلى A=1A=1 وB=1B=1 وأعد تنفيذ خطوات أنماط Qiskit لإعادة تشغيل الدائرة. تحقق من أن دائرة الجامع عملت مجددًا.

الإجابة:

يجب أن تحصل على مخطط تكراري تكون فيه سلسلة البتات المهيمنة 1011:

1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

من المزايا الإضافية لنصف الجامع الكمومي على نصف الجامع الكلاسيكي أنه يمكنه العمل بمدخلات كمومية. أي أنه يستطيع "جمع" الكيوبتين AA وBB حتى لو كانتا في حالات تراكب. في قسم أسئلة التحدي أدناه، ستُطلب منك تهيئة الكيوبتات في حالات تراكب ورؤية ما يحدث!

الخاتمة

صُمِّمت هذه الوحدة لتمنحك فهمًا أساسيًا راسخًا للمبادئ الأساسية وراء الحوسبة الكمومية بمقارنتها بالحوسبة الكلاسيكية. استعرضنا دائرة نصف الجامع الكلاسيكي ثم أريناك كيف تكيّف الدائرة لتشغيلها بكيوبتات على حاسوب كمومي. الآن أنت مستعد لاستكشاف وحدات Qiskit in the Classroom الأخرى!

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

  • على النقيض من البتات الكلاسيكية التي لا تأخذ إلا قيمتَي 0 و1، يمكن للكيوبتات أن تكون في حالات تراكب من كليهما.
  • يمكن لكيوبتات متعددة أن تكون في تراكب فوق سلاسل البتات المسموح بها كلاسيكيًا، وتُسمى حالات الأساس الحسابي.
  • يمكن لكيوبتات متعددة أن تكون متشابكة بحيث تعتمد حالة إحداها على حالة الأخرى.
  • اتفاقية Qiskit هي استخدام الترميز "little-endian"، الذي يضع الكيوبت الأقل أهمية q0q_0 في أقصى اليمين والكيوبت الأعلى أهمية qNq_N في أقصى اليسار.
  • البوابات الكمومية عمليات قابلة للعكس تُمثَّل بمصفوفات أحادية تعمل على متجهات الحالة الكمومية. في هذا الترميز، المصفوفة الأقرب إلى المتجه (الموجودة في أقصى اليمين) تعمل أولًا.
  • القياسات تُطيح بحالة التراكب الكمومي إلى إحدى الحالات المسموح بها كلاسيكيًا، باحتمالية تساوي مربع سعة الحالة الأساسية الحسابية المقابلة في التراكب.
  • غالبًا ما تُمثَّل الدوائر الكمومية باستخدام مخططات الدوائر الكمومية، حيث تُصوَّر الكيوبتات كأسلاك أفقية، وتظهر البوابات الكمومية على هذه الأسلاك من اليسار إلى اليمين.
  • لتشغيل دائرة كمومية، نستخدم الخطوات الأربع في سير عمل أنماط Qiskit: التعيين، التحسين، التنفيذ، المعالجة اللاحقة.

الأسئلة

أسئلة صح/خطأ

  1. يمكن لبت واحد في الكمبيوتر الكلاسيكي أن يحمل فقط القيمة 0 أو 1.

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

  3. البوابات الكمومية بشكل عام عمليات غير قابلة للعكس.

  4. اتفاقية Qiskit تضع الكيوبت الأقل أهمية q0q_0 في أقصى اليسار.

  5. قياس حالة كمومية يعطي دائمًا نفس النتيجة إذا أُعيد عدة مرات.

  6. بوابة Hadamard تُنشئ تراكبًا في كيوبت واحد.

  7. قد تشمل الدوائر الكمومية عمليات قياس تُطيح بحالة التراكب إلى إحدى الحالات المسموح بها كلاسيكيًا.

  8. عدد الحالات الكلاسيكية الممكنة لـNN بت هو 2N2N.

  9. احتمالات نتائج القياسات الكمومية تُعطى بمربعات سعات الحالات الأساسية القابلة للقياس كلاسيكيًا.

أسئلة الإجابة القصيرة

  1. ما هي بعض الاختلافات الجوهرية بين البت والكيوبت؟

  2. ماذا يحدث للحالة الكمومية عندما تُقاس؟

  3. لماذا نستخدم ترميز little-endian في Qiskit؟

  4. ما هي الخطوات الأربع في سير عمل أنماط Qiskit؟

أسئلة التحدي:

  1. في الوحدة، استخدمنا الجامع فقط لجمع الحالات المسموح بها كلاسيكيًا لـAA وBB. لكن يمكننا أيضًا تهيئة AA وBB في حالات تراكب! غيّر الكود لتهيئة كل كيوبت في تراكب متساوٍ بين 0 و1، ثم شغّل الدائرة الجديدة واحصل على مخطط تكراري جديد. ماذا ترى؟ فسّر ما يحدث.