共用方式為


快速入門:建立您的第一個 Q# 程式

瞭解如何撰寫示範糾纏的基本 Q# 程式,這是量子運算的重要概念。

當兩個或多個量子位元處於糾纏狀態時,它們共享量子資訊,這表示無論其中一個量子位元發生什麼,另一個量子位元也會產生相應變化。 在本快速入門中,您會建立稱為 Bell 配對的特定雙量子位糾纏狀態。 在 Bell 配對中,如果您測量狀態中的 $\ket{0}$ 一個量子位,則您知道另一個量子位也處於 $\ket{0}$ 狀態,而不需要測量它。 如需詳細資訊,請參閱 量子糾纏

在本快速入門中,您將:

  • 建立 Q# 檔案。
  • 分配一對量子位元。
  • 糾纏量子位。

必要條件

建立 Q# 檔案

  1. 打開 Visual Studio Code。
  2. 選擇 檔案>新文字文件
  3. 將檔案儲存為 Main.qs。 .qs 副檔名表示一個程式 Q#。

撰寫程式 Q# 代碼

在您的 Main.qs 檔案中,請按照以下步驟糾纏並測量一對量子位元。

匯入量子連結庫

QDK 包含 Q# 標準連結庫,其中包含量子程式預先定義的函式和作業。 若要使用這些程式庫,您必須先匯入相關的程式庫。

在您的程式中,使用 import 語句開啟 Std.Diagnostics 庫。 這可讓您存取程式庫的所有函數和操作,包括 DumpMachine,稍後會用來顯示糾纏狀態。

import Std.Diagnostics.*;

定義作業

匯入相關函式庫之後,請定義量子運算及其輸入和輸出值。 在本快速入門中,您的操作為 Main。 您將在此撰寫其餘的Q#程式碼,以分配、操作和測量兩個量子位。

Main 不接受任何參數,並傳回兩個 Result 值,或 ZeroOne,代表量子位度量的結果:

    operation Main() : (Result, Result) {
        // Your entanglement code goes here.
}

配置兩個量子位

目前 Main 的作業是空的,因此下一個步驟是配置兩個量子位,q1q2。 在 中 Q#,您會使用 use 關鍵詞來配置量子位:

        // Allocate two qubits, q1 and q2, in the 0 state.
        use (q1, q2) = (Qubit(), Qubit());

注意

在 中 Q#,量子位一律會配置在 $\ket{0}$ 狀態中。

將一個量子位放入疊加態

量子位 q1q2 處於 $\ket{0}$ 狀態。 若要準備量子位元進行糾纏,您必須將其中一個置於均勻疊加態的狀態,有 50% 的機率被測量為 $\ket{0}$ 或 $\ket{1}$。

您可以套用 HadamardH操作,使量子位元進入疊加態:

        // Put q1 into an even superposition.
        H(q1);

產生的狀態q1為$\frac{{1}{\sqrt{2}} (\ket{{0}+\ket{1})$,這是$\ket{0}$$\ket{{1}$的平均疊加。

糾纏量子位元

您現在已準備好使用 controlled-NOT、 CNOT作業來糾纏量子位。 CNOT 是一個控制作業,採用兩個量子位,一個做為控件,另一個作為目標。

在本快速入門中,您會將 設定 q1 為控件量子位和 q2 目標量子位。 這表示,當 q1 的狀態為 $\ket{1}$ 時,CNOT 會翻轉 q2 的狀態。

        // Entangle q1 and q2, making q2 depend on q1.
        CNOT(q1, q2);

這兩個量子位的結果狀態為 Bell 配對 $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$ 。

提示

如果您想要瞭解 Hadamard 和 CNOT 操作如何轉換量子位的狀態,請參閱 使用量子操控建立糾纏

顯示糾纏狀態

在測量量子位元之前,請務必確認先前的程式碼是否成功糾纏它們。 使用DumpMachine操作,此操作是Std.Diagnostics函式庫的一部分,以輸出Q#程式的當前狀態:

    // Show the entangled state of the qubits.
    DumpMachine();

測量量子位

既然您已驗證量子位糾纏,您可以使用 M 操作來測量它們。 測量q1q2使其量子狀態以相等的機率塌縮到ZeroOne

在Q#中,您會使用let關鍵詞來宣告新的變數。 若要儲存和 q1q2度量結果,請分別宣告變數m1m2

        // Measure q1 and q2 and store the results in m1 and m2.
        let (m1, m2) = (M(q1), M(q2));

重設量子位

在每個程序結束時,Q# 發行之前,量子位必須處於 $\ket{0}$ 狀態。 您可以使用 Reset 操作來執行該動作。

        // Reset q1 and q2 to the 0 state.
        Reset(q1);
        Reset(q2);

傳回度量結果

最後,若要完成Main操作並觀察糾纏狀態,請傳回 m1m2的度量結果:

        // Return the measurement results.
        return (m1, m2);

提示

如果您想要深入瞭解 Q# 函式或作業,請將滑鼠停留其上。

執行您的Q#程式

恭喜! 您撰寫了一個Q# 程式,將兩個量子位糾纏在一起,並建立一對貝爾對。

您的最終 Q# 程式看起來應該像這樣:

import Std.Diagnostics.*;

operation Main() : (Result, Result) {  
    // Allocate two qubits, q1 and q2, in the 0 state.
    use (q1, q2) = (Qubit(), Qubit());
    
    // Put q1 into an even superposition.
    // It now has a 50% chance of being measured as 0 or 1.
    H(q1);
    
    // Entangle q1 and q2, making q2 depend on q1.
    CNOT(q1, q2);
    
    // Show the entangled state of the qubits.
    DumpMachine();
    
    // Measure q1 and q2 and store the results in m1 and m2.
    let (m1, m2) = (M(q1), M(q2));
    
    // Reset q1 and q2 to the 0 state.
    Reset(q1);
    Reset(q2);
    
    // Return the measurement results.
    return (m1, m2);
}

若要執行程式並檢視這兩個量子位的結果,請選取作業上方Main的執行,或按 Ctrl+F5

Visual Studio Code 中檔案的 Q# 螢幕快照,其中顯示尋找 [執行] 命令的位置。

您可以在偵錯控制台中以不同的結果執行程式數次。 這顯示量子測量的概率本質和量子比特的糾纏。

例如,如果結果為 Zero,您的偵錯控制台看起來應該像這樣:

DumpMachine:

 Basis | Amplitude      | Probability | Phase
 -----------------------------------------------
  |00⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
  |11⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000

Result: "(Zero, Zero)"

後續步驟

若要深入瞭解與 Q#的量子糾纏,請參閱 教學課程:使用 Q#探索量子糾纏。 本教學會擴充快速入門中涵蓋的概念,並協助您撰寫更進階的量子糾纏程式。