練習 - 使用 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\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量子位元測量後: 測量量子位元之後,結果會是
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檢查量子位元系統的狀態,讓我們探索將系統置於不同類型疊加狀態的其他作業。
目前的隨機位元產生器以50%的機率產生Zero或One。 在下一個範例中,機率不相等。
扭曲的隨機位元產生器
假設您要建立一個偏斜的隨機位元產生器,這意味著獲得 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# 中建立傾斜的疊加狀態,請遵循下列步驟:
將 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。
備註
您的測量結果輸出可能與範例輸出不同,因為隨機位元產生器是機率性的。 結果的機率是確定性的,但個別測量的結果不是確定性的。
多量子位元疊加
到目前為止,我們只考慮了單量子位元系統。 但一台好的量子電腦需要大量的量子位元來執行有用的計算。 當我們的系統有多個量子位元時,量子態和疊加如何運作?
例如,請考慮三個量子位元的系統。 當您測量每個量子位元時,它們的值可以為 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$ 依序排序。
要創建這種隨機數生成器,請按照下列步驟操作:
將 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\rangle$。
現在讓我們更深入地了解系統在測量每個量子位時如何變化。 上述程式碼會使用作業 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#,您可以建立量子位元系統、將量子位元置於疊加狀態,並檢查系統在套用量子運算或進行測量時如何變更。