瞭解如何撰寫示範糾纏的基本 Q# 程式,這是量子運算的重要概念。
當兩個或多個 量子位糾纏時,它們會共用量子資訊,這表示一個量子位 也會發生另一個量子位的情況。 在本快速入門中,您會建立稱為 Bell 配對的特定雙量子位糾纏狀態。 在 Bell 配對中,如果您測量狀態中的 $\ket{0}$ 一個量子位,則您知道另一個量子位也處於 $\ket{0}$ 狀態,而不需要測量它。 如需詳細資訊,請參閱 量子糾纏。
在本快速入門中,您將:
- 建立 Q# 檔案。
- 配置一組量子位。
- 糾纏量子位。
必要條件
- 最新版的 Visual Studio Code。
- Azure Quantum 開發工具包 (QDK) 延伸模組。 如需安裝詳細數據,請參閱 設定 Quantum Development Kit。
建立 Q# 檔案
- 打開 Visual Studio Code。
- 選取 [檔案>新文本檔]。
- 將檔案儲存為
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}$ 狀態中。
將一個量子位放入迭加
量子位 q1 和 q2 處於 $\ket{0}$ 狀態。 若要準備量子位進行糾纏,您必須將其中一個放入平均迭加中,其中 50% 的機會被測量為 $\ket{0}$ 或 $\ket{1}$。
您可以套用 Hadamard、 H作業,將量子位放入迭加:
// 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 目標量子位。 這表示CNOT當 的狀態為 q2時,會翻轉 的狀態q1$\ket{1}$。
// 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 作業來測量它們。 測量q1和q2折疊其量子狀態,甚至ZeroOne機率。
在 中Q#let,您會使用 關鍵詞來宣告新的變數。 若要儲存和 q1的q2度量結果,請分別宣告變數m1和 m2:
// 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作業並觀察糾纏狀態,請傳回 和 m1的m2度量結果:
// Return the measurement results.
return (m1, m2);
提示
如果您想要深入瞭解函 Q# 式或作業,請將滑鼠停留在函式或作業上。
執行您的程序 Q# 代碼
恭喜! 您撰寫了一個程式,將兩個 Q# 量子位糾纏在一起,並建立一對Bell。
您的最終 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
您可以在偵錯控制台中以不同的結果執行程式數次。 這示範量子測量的概率本質和量子位的糾纏。
例如,如果結果為 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#探索量子糾纏。 本教學課程會擴充本快速入門中涵蓋的概念,並協助您撰寫更進階的糾纏程式。