共用方式為


量子程式設計語言簡介 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# 提供 大部分語言通用的內建類型 ,包括 IntDoubleBoolString,以及量子運算特有的類型。 例如, Result 型別代表量子位測量的結果,而且可以有兩個值之一: ZeroOne

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 作業HSuperposition。 假設 Z 基底中的量子位, H 請將量子位放入偶迭置中,其中有 50% 的機會被測量為 ZeroOne

測量量子位元

雖然有許多類型的量子測量, Q# 但著重於單一量子位的投影測量,也稱為 Pauli測量

在 Q#中,作業會 Measure 以指定的Pauli基礎測量一或多個量子位,可以是 PauliXPauliYPauliZMeasure會傳Result回 或OneZero型別。

若要在計算基礎 $\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.CoreMicrosoft.Quantum.Intrinsic,其中包含常用的函式和作業。

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

// 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 還提供量子運算其他語言的支援,例如 QiskitCirq

與 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 包含最新版本的 qsharpazure-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 工作區

下圖顯示提交作業之後的基本工作流程:

顯示作業提交至 Azure Quantum 之後工作流程的圖表。