تمرين - إنشاء حالات تراكب مختلفة باستخدام Q#

مكتمل

في الوحدات السابقة، تعرفت على التراكب وتلميع Dirac. هذه نظرية كافية في الوقت الحالي! دعنا نكتب بعض التعليمات البرمجية لاستكشاف التراكب في Q #.

في هذه الوحدة ، يمكنك إنشاء حالات تراكب كمي في Q # واستكشاف دور الاحتمال في نتائج القياس. يمكنك أيضا استخدام الوظيفة DumpMachine في Q# لفحص كيفية تغير حالة النظام أثناء الحساب الكمي.

إنشاء ملف Q# جديد

  1. افتح Visual Studio Code (VS Code).
  2. افتح القائمة ملف ، ثم اختر ملف نصي جديد لإنشاء ملف جديد.
  3. احفظ الملف بتنسيق Main.qs.

بدء استخدام التراكب

لنبدأ ببرنامج Q # بسيط يستخدم كيوبت في حالة تراكب لإنشاء قيمة بت عشوائية ، 0 أو 1. في الكود الخاص بنا ، نستخدم الدالة DumpMachine لرؤية حالة الكيوبت في نقاط مختلفة في البرنامج.

  1. انسخ التعليمات البرمجية التالية والصقها في ملف 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;
    }
    
  2. لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية Main أو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.

  3. افحص وحدة تحكم تصحيح الأخطاء للعثور على نتيجة القياس الخاص بك، إما 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 #، اتبع الخطوات التالية:

  1. استبدل كافة التعليمات البرمجية في 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;
    }
    
  2. لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية Main أو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.

  3. افحص الإخراج من 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$.

لإنشاء هذا النوع من مولدات الأرقام العشوائية ، اتبع الخطوات التالية:

  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);
    }
    
  2. لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية Main أو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.

  3. افحص الإخراج من 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 لعرض حالة النظام بعد كل قياس.

  1. استبدل التعليمات البرمجية في 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);
    }
    
  2. لتشغيل برنامجك على جهاز المحاكاة المدمج ، اختر عدسة تشغيل التعليمات البرمجية أعلى العملية Main أو اضغط على Ctrl + F5. يظهر الإخراج الخاص بك في وحدة تحكم تصحيح الأخطاء.

  3. افحص الإخراج من 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 # ، يمكنك إنشاء نظام من الكيوبتات ، ووضع الكيوبتات في حالة التراكب ، وفحص كيفية تغير النظام أثناء تطبيق العمليات الكمومية أو أخذ القياسات.