練習 - 使用 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. 檢查除錯主控台以尋找測量結果, ZeroOne

函式 DumpMachine 會建立描述量子系統狀態的資訊表,在此案例中為單一量子位元。 來自 DumpMachine 的資訊包括每個基態的機率幅度、測量機率和以弧度為單位的相位。

您的程式碼呼叫函式 DumpMachine 四次:

  • 分配量子位元之後
  • 將量子位元置於疊加狀態之後
  • 測量量子位元的狀態之後
  • 重設量子位元之後

我們來看看每次調用DumpMachine的輸出:

  • 初始化的量子位: 當您使用陳述式配置 use 量子位時,量子位一律會以 $|0\rangle$ 狀態開始。

    Initialized qubit:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
  • 應用H後的量子位: 套用 H 作業之後,量子位元會處於相等的疊加狀態,$|\psi\rangle=\frac1{\sqrt2} |0\rangle + \frac1{\sqrt2} |1\rangle$。

    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
    
    
  • 量子位元測量後: 測量量子位元之後,結果會是 ZeroOne,且量子位元完全處於您測量的狀態。

    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檢查量子位元系統的狀態,讓我們探索將系統置於不同類型疊加狀態的其他作業。

目前的隨機位元產生器以50%的機率產生ZeroOne。 在下一個範例中,機率不相等。

扭曲的隨機位元產生器

假設您要建立一個偏斜的隨機位元產生器,這意味著獲得 Zero 的機率與獲得 One的機率不同。

例如,您想要機率為 $P$ 的結果 Zero ,而機率為 $1 - P$ 的結果 One 。 可以產生這類隨機位元產生器的有效量子位元狀態如下:

$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1 - P}|1\rangle$$

對於這個狀態 $|\psi\rangle$,$\alpha=\sqrt{P}$ 和 $\beta=\sqrt{1 - P}$ 分別是基態 $|0\rangle$ 和 $|1\rangle$ 的機率幅度。

若要取得此狀態,您可以循序將運算子 $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

備註

您的測量結果輸出可能與範例輸出不同,因為隨機位元產生器是機率性的。 結果的機率是確定性的,但個別測量的結果不是確定性的。

多量子位元疊加

到目前為止,我們只考慮了單量子位元系統。 但一台好的量子電腦需要大量的量子位元來執行有用的計算。 當我們的系統有多個量子位元時,量子態和疊加如何運作?

例如,請考慮三個量子位元的系統。 當您測量每個量子位元時,它們的值可以為 0 或 1,因此您可以找到系統所處的八種可能狀態:

$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle, |110\rangle,|111\rangle $$

該系統有八種可能的狀態,因為當我們進行測量時,每個量子位元可以獨立為 0 或 1 狀態。 一般來說,可能的狀態數等於 $2^n$,其中 $n$ 是量子位元數。

就像單一量子位一樣,3 量子位系統的任意疊加狀態會表示為這八個狀態的加權總和,其中加權是機率振幅:

$$|\psi\rangle=\alpha_0|000\rangle+\alpha_1|001\rangle+\alpha_2|010\rangle+\alpha_3|011\rangle+\alpha_4|100\rangle+\alpha_5|101\rangle+\alpha_6 |110\rangle+\alpha_7|111\rangle$$

同樣,振幅 $\alpha_i$ 是滿足條件 $\sum\limits_{i=0}^{i=7}|\alpha_i|^2=1$ 的複數。

例如,您可以將 H 套用到每個量子位元,來以統一的疊加形式放置量子位元。 接著,您可使用此均勻疊加原理來建立量子隨機數產生器,使其產生三位元數值而非單一位元數值:

基礎狀態 數字
$\ket{000}$ 0
$\ket{001}$ 4
$\ket{010}$ 2
$\ket{011}$ 6
$\ket{100}$ 1
$\ket{101}$ 5
$\ket{110}$ 3
$\ket{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 陣列。
  • 運算 ApplyToEachMeasureEachZ 僅需一行代碼即可對多個量子位應用量子操作。 Q# 程式庫提供許多函式和作業,可為您簡化量子程式設計。
  • 函式庫中的ResultArrayAsInt函數Std.Convert將二進位Result數組轉換為十進位整數。

DumpMachine 輸出顯示,測量行為將疊加狀態折疊成八種可能的基態之一,就像使用單個量子比特一樣。 例如,如果得到結果 6,那麼就意味著系統的狀態塌陷到$|011\rangle$。

現在讓我們更深入地了解系統在測量每個量子位時如何變化。 上述程式碼會使用作業 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#,您可以建立量子位元系統、將量子位元置於疊加狀態,並檢查系統在套用量子運算或進行測量時如何變更。