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#提供許多適用於大部分語言的內建類型,包括 Int
、Double
Bool
、 和 String
,以及量子運算特有的類型。 例如, Result
類型代表任何量子位測量的結果,而且可以有兩個可能定義的值之一: One
和 Zero
。 在範例程式中,作業 MeasureOneQubit()
需要 的傳回型別, Result
而 M
作業會測量量子位並傳 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.Core
和 Microsoft.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);
}
}
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應