Q#程序的結構

本文將探索構成程式的一 Q# 般元件。 請注意, Q# 在 Jupyter Notebook 中撰寫的程式不會使用其中一些元件, 這些差異會在每一節中說明。

請考慮下列 Q# 程式:

namespace Superposition {

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Finally, we return the result of the measurement.
        return result;
    }
}

只要讀取批注 () // ,您就可以告訴此程式配置量子位、套用作業以放入迭加、測量量子位的狀態,然後重設它並傳回結果。

若要在 Visual Studio Code 中執行此程式,請參閱開始使用Q#程式和 VS Code

使用者命名空間

Q# 程式通常會以使用者命名的命名空間開始,例如

namespace Superposition {
    // Your code goes here.
}

命名空間可協助您整理相關功能。 命名空間是使用者命名的,而且每個 qsharp 只能有一個 namespace (*.qs) 檔案。

Q#標準連結庫具有預先定義的命名空間,其中包含可在量子程式中使用的函式和作業。 如需詳細資訊,請參閱 內建命名空間

Jupyter Notebook 不會使用使用者命名空間。

EntryPoint ()

屬性 @EntryPoint() 會告知編譯程序 Q# 開始執行程式的位置。 在具有多個函式和作業定義的程式中, @EntryPoint() 可以在任何函式或作業和程式流程從該處開始並循序繼續之前放置 。

    ...
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        ...

Jupyter Notebook 不會使用進入點。

%%qsharp 命令

根據預設, Q# Jupyter Notebook 中的程式會使用 ipykernel Python 核心。 若要將程式代碼新增 Q# 至筆記本數據格,您必須使用 %%qsharp 命令,該命令會與 Python 套件一起 qsharp 啟用。 例如,Jupyter Notebook 中的上一個範例程式代碼看起來像這樣:

import qsharp
%%qsharp

    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Display the result
        Message($"Result is {result}");
        // Finally, we return the result of the measurement.
        return result;
    
    }
    MeasureOneQubit();

請注意,沒有 Jupyter Notebook 不需要的使用者命名空間或 @EntryPoint()。 作業會直接在最後一行中呼叫,而不是進入點。 另請注意,Message語句已新增至 Jupyter Notebook 程式代碼以顯示結果。 當您在 VS Code 中執行先前 Q# 的程式時,內建模擬器預設會顯示結果。

使用 %%qsharp 命令時:

  • 您必須先執行 import qsharp ,才能啟用 %%qsharp 命令。
  • 此命令 %%qsharp 的範圍設定為其顯示所在的整個儲存格。 請注意,它會將 Notebook 儲存格型態從 Python 變更為 Q#
  • Q#遵循命令的程式代碼必須遵守標準程式Q#代碼語法。 例如,您可以使用 來表示批註 // ,而不是 # 在儲存格內 %%qsharp ,而且程式代碼行的結尾必須是分號 ;
  • %%qsharp命令前面不能加上或後面接著其單元格中的 Python 語句。

如需使用 Jupyter Notebook 程式的範例,請參閱開始使用Q#程式和 VS Code

類型

Q#提供許多適用於大部分語言的內建類型,包括 IntDoubleBool、 和 String,以及量子運算特有的類型。 例如, Result 類型代表任何量子位測量的結果,而且可以有兩個可能定義的值之一: OneZero。 在範例程式中,作業 MeasureOneQubit() 需要 的傳回型別, ResultM 作業會測量量子位並傳 Result回 。

...
// operation definition expecting a return type of Result
operation MeasureOneQubit() : Result {
    ...
    // Now we measure the qubit in Z-basis, returning a Result type
    let result = M(q);
    ...
}

Q# 也提供定義範圍、陣列與 Tuple 的類型。 您甚至可以定義自己的自訂類型

配置量子位元

在 Q# 中,量子位元是透過 use 關鍵字來配置。

我們的範例會定義單一量子位:

// Allocate a qubit.
use q = Qubit();
...

但您也可以配置多個量子位,並透過其索引存取每個量子位:

...
use qubits = Qubit[2];
X(qubits[1]);
H(qubits[0]);
...

依預設,您使用 use 關鍵字配置的每個量子位元都會以零狀態開始。 每個量子位 都必須 重設零狀態,才能在程序結束時釋放。 無法重設量子位會觸發運行時錯誤。

// Reset a qubit.
Reset(q);
...

量子作業

配置之後,就可以將量子位元傳遞給作業和函式,也稱為可呼叫檔作業是 Q# 程式的基本建置組塊。 Q# 作業是量子副程式。 也就是說,其為可呼叫的常式,其中包含修改量子位元暫存器狀態的量子作業。

若要定義 Q# 作業,您可以指定作業的名稱與其輸入和輸出。 在我們的範例中,單一作業基本上是整個程式。 它不需要任何參數,而且預期 傳回類型為 Result

operation MeasureOneQubit() : Result {
    ...
}

以下是不採用任何參數且不預期傳回值的基本範例。 此值 Unit 相當於 NULL 其他語言。

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

Q#標準連結庫也提供可在程式中使用的作業,例如 Hadamard 或H範例程式中所使用的作業。 假設以 Z 為基礎的量子位, H 作業會將量子位放入 數迭加。 一旦進入迭加,量子位就會有50%的機會測量為零或一。

測量量子位

量子測量有許多類型,但 Q# 著重於單一量子位的投影測量,也稱為 Pauli度量。 例如,以指定為基礎測量 (時,計算基礎 $\ket,\ket{0}{1}$) 量子位狀態會投射到任何測量基礎狀態,因此終結兩者之間的任何迭加。

我們的範例程式會 M 使用 作業,它會在Pauli Z基礎中執行單一量子位的測量,並傳 Result 回類型。

內建命名空間

標準連結 Q# 庫會使用內建命名空間,其中包含可在量子程式中使用的函式和作業。 例如,命名空間 Microsoft.Quantum.Intrinsic 包含常用的作業和函式,例如 M,用來測量結果和 Message,以顯示程式中的任何位置的使用者訊息。

您可以藉由指定完整命名空間來呼叫函式或作業,或使用 語句讓該命名空間的所有函式和作業都可供使用 open ,並讓您的程式代碼更容易閱讀。 這兩個範例會呼叫相同的作業:

 Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");

請注意,在範例程式中,沒有 open 具有完整命名空間的語句或呼叫。 這是因為 Q# 開發環境預設會自動載入兩個命名空間, Microsoft.Quantum.CoreMicrosoft.Quantum.Intrinsic ,其中包含常用的函式和作業。

您可以利用 Microsoft.Quantum.Measurement 命名空間,並使用 MResetZ 作業將範例程式中的程式代碼優化。 MResetZ 將度量和重設作業結合成一個步驟,如下列範例所示:

namespace Superposition {

    // open the namespace for the MResetZ operation
    open Microsoft.Quantum.Measurement;

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);   
        // Measure and reset the qubit, and return the result value   
        return MResetZ(q);
    }
    
}