量子程式設計語言簡介 Q#
Q# 是開發和執行量子演算法的高階 開放原始 碼程式設計語言。 Q# 包含在 Quantum Development Kit (QDK) 中。 如需詳細資訊,請參閱 設定 Quantum 開發工具包。
作為量子程式設計語言, Q# 符合下列語言、編譯程式和運行時間需求:
- 硬體無關: 量子演算法中的量子位不會系結至特定的量子硬體或配置。 編譯 Q# 程式和運行時間會處理從程式量子位到實體量子位的對應。
- 整合量子和傳統運算: 在通用量子計算機中,執行傳統和量子計算的能力至關重要。
- 尊重物理規律:Q# 和量子演算法遵循量子物理的規則。 例如,您無法直接複製或存取 中的 Q#量子位狀態。
Q#程序的結構
開始撰寫量子程式之前,請務必瞭解其結構和元件。 請考慮下列 Q# 程式,以建立迭加狀態:
namespace Superposition {
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
}
根據批注 (//
), Superposition
程式會先配置量子位、套用作業以將量子位置於迭加中、測量量子位狀態、重設量子位,最後傳回結果。 讓我們將此程式分解成其元件。
使用者命名空間
Q# 程式可以選擇性地以使用者定義 命名空間開頭,例如:
namespace Superposition {
// Your code goes here.
}
命名空間可協助您組織相關的功能。 每個 Q# 程式只能有一個 namespace
。 如果未指定命名空間,編譯程式會 Q# 使用檔名作為命名空間。 例如, Superposition
程式可以撰寫為:
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
標準 Q# 連結庫具有預先定義的命名空間,其中包含您可以在量子程式中使用的函式和作業。 如需詳細資訊,請參閱 內建命名空間。
進入點
根據預設,編譯程式 Q# 會從 Main()
作業開始執行程式,如果有的話,它可以位於程式中的任何位置。 您可以選擇性地使用 @EntryPoint()
屬性,將程式中的任何作業指定為執行點。
在 Superposition
程式中,更具描述性的 MeasureOneQubit()
作業是程序的進入點。
@EntryPoint()
operation MeasureOneQubit() : Result {
...
不過,程式也可以藉由將作業重新命名MeasureOneQubit()
為 Main()
,來撰寫不含 @EntryPoint()
屬性的程式:
// The Q# compiler automatically detects the Main() operation as the entry point.
operation Main() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
類型
Q# 提供 大部分語言通用的內建類型 ,包括 Int
、 Double
、 Bool
和 String
,以及量子運算特有的類型。 例如, Result
型別代表量子位測量的結果,而且可以有兩個值之一: Zero
或 One
。
在 Superposition
程式中,作業會 MeasureOneQubit()
傳回類型 Result
,其對應於作業的 M
傳回型別。 度量結果會儲存在使用 let
語句定義的新變數中:
// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
...
// Measure the qubit in the Z-basis, returning a Result type.
let result = M(q);
...
Q# 也提供定義範圍、陣列和 Tuple 的類型。 您甚至可以定義自己的 自定義類型。
配置量子位元
在 中 Q#,您會使用 use
關鍵詞來配置量子位。 量子位一律會配置在 $\ket{0}$ 狀態中。
程式 Superposition
會定義單一量子位:
// Allocate a qubit.
use q = Qubit();
您也可以設定多個量子位,並透過其索引存取每個量子位:
use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.
如需詳細資訊,請參閱 Use語句。
量子運算
配置量子位之後,您可以將它傳遞給作業和函式,也稱為 可呼叫者。 作業 是程式的基本建置組塊 Q# 。 作業 Q# 是量子子程式,或可呼叫的例程,其中包含變更量子位緩存器狀態的量子作業。
若要定義 Q# 作業,您可以指定作業的名稱、其輸入和輸出。 在 Superposition
程式中,作業 MeasureOneQubit()
基本上是整個程式。 它不需要任何參數並傳 Result
回類型:
operation MeasureOneQubit() : Result {
...
}
以下是不採用任何參數且不需要傳回值的基本範例。 此值 Unit
相當於 NULL
其他語言:
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
標準Q#連結庫也提供您可以在量子程式中使用的作業,例如程式中的 Hadamard 作業H
Superposition
。 假設 Z 基底中的量子位, H
請將量子位放入偶迭置中,其中有 50% 的機會被測量為 Zero
或 One
。
測量量子位元
雖然有許多類型的量子測量, Q# 但著重於單一量子位的投影測量,也稱為 Pauli測量。
在 Q#中,作業會 Measure
以指定的Pauli基礎測量一或多個量子位,可以是 PauliX
、 PauliY
或 PauliZ
。 Measure
會傳Result
回 或One
的Zero
型別。
若要在計算基礎 $\lbrace、\ket{1}\rbrace\ket{0}$ 中實作測量,您也可以使用 M
作業,以測量 Pauli Z 基底中的量子位。 這相當於 M
Measure([PauliZ], [qubit])
。
程式 Superposition
會使用 M
作業:
// Measure the qubit in the Z-basis.
let result = M(q);
重設量子位元
在 中 Q#,量子位 在釋放時必須 處於 $\ket{0}$ 狀態。 使用 作業, Reset
將每個量子位 $\ket{0}$ 重設為狀態,再於程序結尾釋放它。 無法重設量子位會導致運行時錯誤。
// Reset a qubit.
Reset(q);
內建命名空間
標準 Q# 連結庫具有內建命名空間,其中包含您可以在量子程式中使用的函式和作業。 例如, Microsoft.Quantum.Intrinsic
命名空間包含常用的作業和函式,例如 M
測量結果,以及 Message
顯示程式中的任何位置的使用者訊息。
若要呼叫函式或作業,您可以指定完整命名空間或使用 語句,讓該命名空間的所有函式和作業都可供使用 import
,並讓您的程式代碼更容易閱讀。 下列範例會呼叫相同的作業:
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`.
import Std.Intrinsic.*;
Message("Hello quantum world!");
程序 Superposition
沒有任何 import
語句或具有完整命名空間的呼叫。 這是因為 Q# 開發環境會自動載入兩個命名空間: Microsoft.Quantum.Core
和 Microsoft.Quantum.Intrinsic
,其中包含常用的函式和作業。
您可以使用 作業將程式優化Superposition
,以利用 Microsoft.Quantum.Measurement
命名空間MResetZ
。 MResetZ
將度量和重設作業結合成一個步驟,如下列範例所示:
// Import the namespace for the MResetZ operation.
import Microsoft.Quantum.Measurement.*;
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure and reset the qubit, and then return the result value.
return MResetZ(q);
}
使用 Q# 和 Azure Quantum 開發量子程式
Q# 和 Azure Quantum 是開發及執行量子程式的強大組合。 透過 Q# 和 Azure Quantum,您可以撰寫量子程式、模擬其行為、預估資源需求,並在實際的量子硬體上執行它們。 此整合可讓您探索量子運算的潛力,並開發複雜問題的創新解決方案。 無論您是初學者還是經驗豐富的量子開發人員, Q# Azure Quantum 都提供您解除鎖定量子運算能力所需的工具和資源。
下圖顯示當您使用 Q# 和 Azure Quantum 開發量子程式時,量子程式通過的階段。 您的程式會從開發環境開始,並以將作業提交到實際的量子硬體結束。
讓我們細分圖表中的步驟。
選擇您的開發環境
在慣用的開發環境中執行量子程式。 您可以使用 Azure Quantum 網站中的在線程式代碼編輯器、Azure 入口網站 中 Azure Quantum 工作區中裝載的 Jupyter Notebook,或使用 Visual Studio Code 的本機開發環境。 如需詳細資訊,請參閱 執行 Q# 程式的不同方式。
撰寫量子程式
您可以使用 Quantum Development Kit (QDK) 在 中 Q# 撰寫量子程式。 若要開始使用,請參閱 快速入門:建立您的第一個 Q# 程式。
Q#此外,QDK 還提供量子運算其他語言的支援,例如 Qiskit 和 Cirq。
與 Python 整合
您可以在各種 IDE 中單獨或搭配 Python 使用 Q# 。 例如,您可以搭配 Q# Python 主程式 使用專案來呼叫 Q# 作業。 您也可以在 Jupyter Notebook 中與 Python 整合 Q# 。 如需詳細資訊,請參閱 執行 Q# 程式的不同方式。
%%qsharp 命令
根據預設, Q# Jupyter Notebook 中的程式會 ipykernel
使用 Python 套件。 若要將程式代碼新增 Q# 至筆記本數據格,請使用 %%qsharp
命令,該命令會啟用 qsharp
Python 套件,後面接著您的程式 Q# 碼。
使用 %%qsharp
時,請記住下列事項:
- 您必須先執行
import qsharp
才能開啟%%qsharp
。 %%qsharp
範圍到其出現的筆記本資料格,並將儲存格型態從 Python 變更為 Q#。- 您無法在 之前或之後
%%qsharp
放置 Python 語句。 - Q# 下列程式
%%qsharp
代碼必須遵守 Q# 語法。 例如,使用//
而非#
表示批注和;
結束程式代碼行。
注意
Azure 入口網站 中的 Azure Notebook 包含最新版本的 qsharp
和 azure-quantum
Python 套件,因此您不需要安裝任何專案。 如需詳細資訊,請參閱 開始使用 Q# 和 Azure Quantum Notebook。
估計資源
在實際量子硬體上執行之前,您必須瞭解程式是否可以在現有硬體上執行,以及其耗用的資源數量。
Azure Quantum 資源估算器可讓您評估架構決策、比較量子位技術,以及判斷執行指定量子演算法所需的資源。 您可以選擇預先定義的容錯通訊協定,並指定基礎實體量子位模型的假設。
如需詳細資訊,請參閱 執行您的第一個資源估計值。
注意
Azure Quantum Resources 估算器是免費的,不需要 Azure 帳戶。
在模擬中執行程式
當您編譯和執行量子程式時,QDK 會建立量子模擬器的實例,並將程式 Q# 代碼傳遞給它。 模擬器會使用程式 Q# 代碼來建立量子位(量子粒子的模擬),並套用轉換來修改其狀態。 然後,模擬器中的量子作業結果會傳回給程式。 隔離模擬器中的程式 Q# 代碼可確保演算法遵循量子物理法,而且可以在量子計算機上正確執行。
將您的程式提交到真正的量子硬體
您可以透過本機和在線慣用的開發環境,將您的程式(也稱為作業)提交 Q# 至 Azure Quantum。 如需詳細資訊,請參閱 如何提交 Q# 作業。 您也可以執行並提交以 Qiskit 和 Cirq 語言撰寫的量子線路。
Azure Quantum 提供業界領導者目前最引人注目且最多樣化的量子硬體。 如需目前支持的硬體提供者清單,請參閱 量子運算提供者 。
注意
雲端型 Quantinuum H 系列模擬器 目標可在沒有 Azure 帳戶的情況下使用。 若要將作業提交至 Azure Quantum 提供者的其餘部分,您需要 Azure 帳戶和量子工作區。 如果您沒有量子工作區,請參閱 建立 Azure Quantum 工作區。
下圖顯示提交作業之後的基本工作流程: