تمرين - إنشاء حالات تراكب مختلفة باستخدام Q#
في الوحدات السابقة، تعرفت على التراكب وتلميع Dirac. هذه نظرية كافية في الوقت الحالي! دعنا نكتب بعض التعليمات البرمجية لاستكشاف التراكب في Q #.
في هذه الوحدة ، يمكنك إنشاء حالات تراكب كمي في Q # واستكشاف دور الاحتمال في نتائج القياس. يمكنك أيضا استخدام الوظيفة DumpMachine في Q# لفحص كيفية تغير حالة النظام أثناء الحساب الكمي.
إنشاء ملف Q# جديد
- افتح Visual Studio Code (VS Code).
- افتح القائمة ملف ، ثم اختر ملف نصي جديد لإنشاء ملف جديد.
- احفظ الملف بتنسيق Main.qs.
بدء استخدام التراكب
لنبدأ ببرنامج Q # بسيط يستخدم كيوبت في حالة تراكب لإنشاء قيمة بت عشوائية ، 0 أو 1. في الكود الخاص بنا ، نستخدم الدالة DumpMachine لرؤية حالة الكيوبت في نقاط مختلفة في البرنامج.
انسخ التعليمات البرمجية التالية والصقها في ملف Main.qs :
import Std.Diagnostics.*; operation Main() : Result { use q = Qubit(); Message("Initialized qubit:"); DumpMachine(); // First dump Message(" "); H(q); Message("Qubit after applying H:"); DumpMachine(); // Second dump Message(" "); let randomBit = M(q); Message("Qubit after the measurement:"); DumpMachine(); // Third dump Message(" "); Reset(q); Message("Qubit after resetting:"); DumpMachine(); // Fourth dump Message(" "); return randomBit; }لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية
Mainأو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.افحص وحدة تحكم تصحيح الأخطاء للعثور على نتيجة القياس الخاص بك، إما
ZeroأوOne.
DumpMachine تنشئ الدالة جدولا للمعلومات يصف حالة النظام الكمومي ، والذي يكون في هذه الحالة كيوبت واحدا. تتضمن المعلومات الواردة DumpMachine اتساع الاحتمال واحتمال القياس والطور بالراديان لكل حالة أساس.
تستدعي التعليمات البرمجية الدالة DumpMachine أربع مرات:
- بعد تخصيص الكيوبت
- بعد وضع الكيوبت في حالة تراكب
- بعد قياس حالة الكيوبت
- بعد إعادة تعيين الكيوبت
دعنا نفحص الإخراج من كل مكالمة إلى DumpMachine:
الكيوبت المهيأ: عندما تقوم بتخصيص كيوبت مع العبارة
use، يبدأ الكيوبت دائما في حالة زاوية $ |0\r$ .Initialized qubit: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000كيوبت بعد تطبيق H: بعد تطبيق العملية
H، يكون الكيوبت في حالة تراكب متساوية ، $|\psi\rزاوية = \ frac1 {\ sqrt2} |0 زاوية\r+ \ frac1 {\ sqrt2} |1\rزاوية $.Qubit after applying H: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |1⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000الكيوبت بعد القياس: بعد قياس الكيوبت، تكون النتيجة إما
ZeroأوOne، ويكون الكيوبت في الحالة التي قمت بقياسها بالكامل.Qubit after the measurement: Basis | Amplitude | Probability | Phase ----------------------------------------------- |1⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000إشعار
قد يختلف الإخراج من
DumpMachineبعد القياس عن مثال الإخراج لأن لديك فرصة 50% لقياس كل حالة. احتمالات النتائج حتمية ، لكن نتيجة القياس الفردي ليست كذلك.الكيوبت بعد إعادة الضبط: تعيد
Resetالعملية تعيين الكيوبت إلى الحالة $|0\rangle$ بحيث يمكن استخدامها مرة أخرى للحسابات المستقبلية.Qubit after resetting: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
استكشاف حالات التراكب الأخرى
الآن بعد أن عرفت كيفية فحص حالة نظام الكيوبت باستخدام DumpMachine، دعنا نستكشف العمليات الأخرى التي تضع النظام في أنواع مختلفة من حالات التراكب.
ينتج مولد البتات العشوائية الحالي إما Zero أو One باحتمال 50%. في المثال التالي ، الاحتمالات ليست متساوية.
منشئ بت عشوائي منحرف
لنفترض أنك تريد إنشاء مولد بت عشوائي منحرف ، مما يعني أن احتمال الحصول Zero عليه يختلف عن احتمال الحصول Oneعلى .
على سبيل المثال ، تريد النتيجة Zero باحتمال $P دولار والنتيجة One مع الاحتمال 1 دولار - P $. فيما يلي حالة كيوبت صالحة تنتج منشئ بت عشوائي مثل هذا:
$$|\psi\rangle=\sqrt{P}|0\rزاوية+\sqrt{1 - P}|1\rزاوية$$
بالنسبة لهذه الحالة $ |\psi\rزاوية $ و $ \ alpha = \ sqrt {P} $ و $ \ beta = \ sqrt {1 - P} $ هي سعة احتمالية حالات الأساس $ |0\rزاوية $ و $ | 1 زاوية\r$ ، على التوالي.
للحصول على هذه الحالة، يمكنك تطبيق عامل التشغيل $R_y(2\cos^{-1}\sqrt{P})$ بالتتابع على كيوبت يبدأ في حالة $|0\rangle$. لتحقيق هذه النتيجة في Q #، استخدم الزر Ry من المكتبة القياسية.
تلميح
لمعرفة المزيد حول الرياضيات وراء عمليات كيوبت أحادية، راجع البرنامج التعليمي بوابات كيوبت الأحادية في Quantum Katas.
لإنشاء حالة تراكب منحرفة في Q #، اتبع الخطوات التالية:
استبدل كافة التعليمات البرمجية في Main.qs بالمثال التالي، ثم احفظ الملف. يختار هذا المثال $\alpha$ ليكون $\frac13$ تقريبا.
import Std.Diagnostics.*; import Std.Math.*; operation Main() : Result { use q = Qubit(); let P = 0.333333; // P is 1/3 Ry(2.0 * ArcCos(Sqrt(P)), q); Message("The qubit is in the desired state."); DumpMachine(); // Dump the state of the qubit Message("Your skewed random bit is:"); let skewedrandomBit = M(q); Reset(q); return skewedrandomBit; }لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية
Mainأو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.افحص الإخراج من
DumpMachineالقياس ونتائجه. على سبيل المثال ، الإخراج مشابه لما يلي:The qubit is in the desired state. Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.5773+0.0000𝑖 | 33.3333% | 0.0000 |1⟩ | 0.8165+0.0000𝑖 | 66.6667% | 0.0000 Your skewed random bit is: One
لاحظ أن احتمال نتيجة القياس Zero يبلغ حوالي 33.33% واحتمال النتيجة One حوالي 66.67%. يميل مولد البت العشوائي هذا نحو One.
إشعار
قد يختلف ناتج نتيجة القياس عن إخراج المثال لأن مولد البتات العشوائية احتمالي. احتمالات النتائج حتمية ، لكن نتيجة القياس الفردي ليست كذلك.
تراكب qubit المتعددة
حتى الآن ، أخذنا في الاعتبار أنظمة الكيوبت المفردة فقط. لكن الكمبيوتر الكمومي الجيد يحتاج إلى الكثير من الكيوبتات لإجراء حسابات مفيدة. كيف تعمل الحالات الكمومية والتراكب عندما يحتوي نظامنا على أكثر من كيوبت واحد؟
على سبيل المثال ، ضع في اعتبارك نظاما من ثلاثة كيوبت. يمكن أن يكون لكل كيوبت قيمة 0 أو 1 عند قياسها ، لذلك هناك ثماني حالات محتملة يمكنك العثور على النظام ليكون فيها:
$ $ | 000 زاوية\r، · 001 زاوية\r، زاوية\r، زاوية ، زاوية\r، زاوية ، زاوية 100\r، زاوية\r101 ، زاوية\r110 ، زاوية\r$ $
هناك ثماني حالات محتملة لهذا النظام لأن كل كيوبت يمكن أن يكون بشكل مستقل إما حالة 0 أو 1 عندما نأخذ القياس. بشكل عام ، عدد الحالات المحتملة يساوي $ 2 ^ n $ ، حيث $n $ هو عدد الكيوبتات.
تماما كما هو الحال مع كيوبت واحد ، يتم تمثيل حالة التراكب التعسفي لنظام 3 كيوبت كمجموع مرجح لهذه الحالات الثماني ، حيث الأوزان هي سعات الاحتمال:
$$|\psi زاوية\r=\alpha_0|000 زاوية\r+\alpha_1|001 زاوية\r+\alpha_2|010\rزاوية+\alpha_3|011\rزاوية+\alpha_4|100\rزاوية+\alpha_5|101\rزاوية+\alpha_6 |110\rزاوية+\alpha_7|111\rزاوية$$
مرة أخرى ، السعات $ \ alpha_i $ هي أرقام معقدة تفي بالشرط $ \ sum \ limits_ {i = 0} ^ {i = 7} |\alpha_i |^ 2 = 1 $.
على سبيل المثال، يمكنك وضع qubits في تراكب موحد عن طريق تطبيق H على كل qubit. يمكنك بعد ذلك استخدام هذا التراكب الموحد لإنشاء مولد أرقام عشوائية كمومية يولد أرقاما ثلاثية البت بدلا من أرقام بت واحدة:
| حالة الأساس | الرقم |
|---|---|
| $ \ كيت{000} $ | 0 |
| $ \ كيت{001} $ | 4 |
| $ \ كيت{010} $ | 2 |
| $ \ كيت{011} $ | 6 |
| $ \ كيت{100} $ | 1 |
| $ \ كيت{101} $ | 5 |
| $ \ كيت{110} $ | 3 |
| $ \ كيت{111} $ | 7 |
إشعار
الطريقة القياسية لكتابة سلاسل البتات هي أن يكون لديك أصغر رقم على اليمين وأكبر رقم على اليسار ، تماما كما هو الحال مع الأرقام العشرية العادية. في Q # (والعديد من لغات البرمجة الكمومية الأخرى) ، يتم عكس الترتيب بحيث يكون أصغر رقم على اليسار وأكبر رقم على اليمين. نظرا لأن الدالة DumpMachine تعرض الحالات الكمومية بالترتيب القياسي ، فإن الأعداد الصحيحة العشرية التي تتوافق معها الحالات لا يتم ترتيبها بالتتابع من 0 إلى $n-1$.
لإنشاء هذا النوع من مولدات الأرقام العشوائية ، اتبع الخطوات التالية:
استبدل التعليمات البرمجية في Main.qs بالمثال التالي، ثم احفظ الملف:
import Std.Diagnostics.*; import Std.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); let result = MeasureEachZ(qubits); Message("Measuring the qubits collapses the superposition to a basis state."); DumpMachine(); ResetAll(qubits); return ResultArrayAsInt(result); }لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية
Mainأو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.افحص الإخراج من
DumpMachineالقياس ونتائجه. على سبيل المثال ، الإخراج مشابه لما يلي:The qubit register in a uniform superposition: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 Measuring the qubits collapses the superposition to a basis state. Basis | Amplitude | Probability | Phase ----------------------------------------------- |011⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 6إشعار
من المحتمل أن يكون للإخراج نتيجة مختلفة عن إخراج المثال لأن مولد الأرقام العشوائية احتمالي. احتمالات النتائج حتمية ، لكن نتيجة القياس الفردي ليست كذلك.
للعمل مع كيوبتات متعددة ، يحتوي رمز Q# الخاص بك على التعديلات التالية:
- يمثل المتغير
qubitsالآن صفيفQubitالذي يبلغ طوله ثلاثة. - العمليات
ApplyToEachوتطبيقMeasureEachZالعمليات الكمومية على كيوبتات متعددة بسطر واحد فقط من التعليمات البرمجية. تقدم مكتبات Q# العديد من الوظائف والعمليات التي تبسط البرمجة الكمومية من أجلك. - تقوم الدالة
ResultArrayAsIntمن المكتبةStd.Convertبتحويل المصفوفة الثنائيةResultإلى عدد صحيح عشري.
يظهر الناتج من DumpMachine أن فعل القياس ينهار حالة التراكب في واحدة من حالات الأساس الثمانية المحتملة ، تماما كما هو الحال مع كيوبت واحد. على سبيل المثال ، إذا حصلت على النتيجة 6، فهذا يعني أن حالة النظام انهارت إلى $ | 011\rزاوية $.
الآن دعونا نلقي نظرة أعمق على كيفية تغير النظام أثناء قياس كل كيوبت. استخدمت MeasureEachZ الكود السابق العملية لقياس جميع الكيوبتات الثلاثة في وقت واحد. بدلا من ذلك، دعنا نستخدم حلقة for لقياس الكيوبتات واحدة تلو الأخرى، ونستخدمها DumpMachine لعرض حالة النظام بعد كل قياس.
استبدل التعليمات البرمجية في Main.qs بالمثال التالي، ثم احفظ الملف:
import Std.Diagnostics.*; import Std.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register is in a uniform superposition: "); DumpMachine(); mutable results = []; for q in qubits { Message(" "); results += [M(q)]; DumpMachine(); } ResetAll(qubits); Message("Your random number is: "); return ResultArrayAsInt(results); }لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية
Mainأو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.افحص الإخراج من
DumpMachineالقياس ونتائجه.
يوضح الإخراج كيف يغير كل قياس متتالي الحالة الكمومية وبالتالي احتمالات الحصول على كل نتيجة. على سبيل المثال ، دعنا نفحص كل جزء من الإخراج في حالة كون نتيجتك 5:
إعداد الحالة: يكون النظام في حالة تراكب متساوية بعد تطبيقه
Hعلى كل كيوبت.The qubit register is in a uniform superposition: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000القياس الأول: النتيجة هي
Oneالقياس الأول ، لذا فإن الحالات الوحيدة الممكنة التي يمكن أن ينتهي بها النظام الآن هي الحالات التي يكون فيها البت الموجود في أقصى اليسار هو 1. اختفت اتساع الحالات التي يكون فيها الكيوبت الموجود في أقصى اليسار هو 0 ، وتزيد احتمالات الحالات المحتملة المتبقية من 12.5% إلى 25.0% بحيث يظل مجموع الاحتمالات 100%.Basis | Amplitude | Probability | Phase ----------------------------------------------- |100⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |101⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |110⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |111⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000القياس الثاني: والنتيجة هي
Zeroالقياس الثاني ، لذا فإن الحالات الوحيدة الممكنة التي يمكن أن ينتهي بها النظام هي الحالات التي تكون فيها البتتان الواقعتان في أقصى اليسار 10. الآن لم يتبق لدينا سوى نتيجتين محتملتين عندما نقيس الكيوبت الثالث، مع احتمال 50% لكل ناتيجة.Basis | Amplitude | Probability | Phase ----------------------------------------------- |100⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |101⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000القياس الثالث: في القياس الثالث ، تكون
Oneالنتيجة. يتم قياس النظام بالكامل ، وبالتالي لم يعد في حالة تراكب ، كما هو متوقع.Basis | Amplitude | Probability | Phase ----------------------------------------------- |101⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Your random number is: 5
باستخدام Q # ، يمكنك إنشاء نظام من الكيوبتات ، ووضع الكيوبتات في حالة التراكب ، وفحص كيفية تغير النظام أثناء تطبيق العمليات الكمومية أو أخذ القياسات.