量子コンピューティングの主要概念であるエンタングルメントを示す基本的な Q# プログラムを記述する方法について説明します。
2 つ以上 の 量子ビットが絡み合うと、量子情報が共有されます。つまり、1 つの量子ビットに対して何が起こっても、もう一方の量子ビットが発生します。 このクイック スタートでは、ベル ペアと呼ばれる特定の 2 量子ビットの絡み合った状態を作成します。 ベル ペアでは、ある量子ビットを状態で $\ket{0}$ 測定すると、もう一方の量子ビットも測定せずに状態になっている $\ket{0}$ ことがわかります。 詳細については、「量子エンタングルメント」を参照してください。
このクイック スタートでは次の作業を行います。
- Q# ファイルを作成します。
- 量子ビットのペアを割り当てます。
- 量子ビットをエンタングルします。
前提条件
- 最新バージョンの Visual Studio Code。
- Azure Quantum Development Kit (QDK) 拡張機能。 インストールの詳細については、「Quantum 開発キットのセットアップ」を参照してください。
Q# ファイルを作成します。
- Visual Studio Code を開きます。
- [ファイル>します。
- このファイルを
Main.qsとして保存します。 .qs 拡張子はプログラムを Q# 表します。
コードを記述するQ#
Main.qsファイルで、次の手順に従って、量子ビットのペアをエンタングルして測定します。
量子ライブラリをインポートする
QDK には、量子プログラム用の Q# 定義済みの関数と演算を含む標準ライブラリが含まれています。 それらを使用するには、まず関連するライブラリをインポートする必要があります。
プログラムで、ステートメントを import 使用してライブラリを Std.Diagnostics 開きます。 これにより、 DumpMachineを含むすべてのライブラリの関数と操作にアクセスできます。この操作は、後でエンタングル状態を表示するために使用します。
import Std.Diagnostics.*;
操作を定義する
関連するライブラリをインポートした後、量子演算とその入力値と出力値を定義します。 このクイック スタートでは、操作は Main. ここでは、2 つの量子ビットを割り当て、操作し、測定する残りの Q# コードを記述します。
Mainはパラメーターを受け取り、量子ビットの測定値の結果を表す 2 つのResult値ZeroOneを返します。
operation Main() : (Result, Result) {
// Your entanglement code goes here.
}
2 つの量子ビットを割り当てる
操作は Main 現在空であるため、次の手順では 2 つの量子ビット q1q2を割り当てます。 では Q#、キーワードを使用して量子ビットを use 割り当てます。
// Allocate two qubits, q1 and q2, in the 0 state.
use (q1, q2) = (Qubit(), Qubit());
Note
では Q#、量子ビットは常に状態で $\ket{0}$ 割り当てられます。
重ね合わせに量子ビットを 1 つ配置する
量子ビットであり q1 、 q2 状態です $\ket{0}$ 。 エンタングルメントのために量子ビットを準備するには、それらのうちの1つを偶数重ね合わせに配置する必要があります。ここで、測定される$\ket{0}$$\ket{1}$確率は50%です。
あなたは、Hadmard入れます。
// Put q1 into an even superposition.
H(q1);
結果としてq1得られる状態は$\frac{{1}{\sqrt{2}} (\ket{{0}+\ket{1})$ で、重ね合わせ$\ket{0}$$\ket{{1}$と .
量子ビットをエンタングルする
これで、制御 NOT CNOT演算を使用して量子ビットをエンタングルする準備ができました。
CNOT は 2 つの量子ビットを受け取る制御演算です。1 つはコントロールとして機能し、もう 1 つはターゲットとして機能します。
このクイック スタートでは、制御量子ビットとq1ターゲット量子ビットを設定q2します。 つまり、 CNOT 状態 q2q1$\ket{1}$が .
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
両方の量子ビットの結果の状態は、ベル ペア $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11}) です$。
ヒント
Hadmard 演算と CNOT 演算によって量子ビットの状態がどのように変換されるかについては、「量子演算を使用したエンタングルメントの作成」を参照してください。
絡み合った状態を表示する
量子ビットを測定する前に、前のコードで量子ビットが正常に絡み合っていることを確認することが重要です。
DumpMachine ライブラリの一部であるStd.Diagnostics操作を使用して、Q# プログラムの現在の状態を出力します。
// Show the entangled state of the qubits.
DumpMachine();
量子ビットを測定する
量子ビットが絡み合っていることを確認したら、操作を M 使用してそれらを測定できます。 量子状態q1q2を測定Zeroし、One均等な確率で折りたたむ。
で Q#、キーワードを let 使用して新しい変数を宣言します。 の測定結果q1q2を格納するには、変数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完了し、絡み合った状態を観察するには、次のm1m2測定結果を返します。
// Return the measurement results.
return (m1, m2);
ヒント
関数または操作の詳細を Q# 確認するには、その上にマウス ポインターを置きます。
コードを実行するQ#
おめでとうございます。 あなたは、2 つの量子ビットを絡み合わせ、ベル ペアを作成するプログラムを記述 Q# しました。
最終的な 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);
}
プログラムを実行して両方の量子ビットの結果を表示するには、操作の上にある [実行] を選択するか、Ctrl + F5 キーをMain押します
プログラムは複数回実行でき、それぞれ異なる結果がデバッグ コンソールに表示されます。 これは、量子測定の確率論的性質と量子ビットの絡み合いを示しています。
たとえば、結果が得られた場合、デバッグ コンソールは 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#を探索する」 を参照してください。 このチュートリアルでは、このクイック スタートで説明する概念を詳しく説明し、より高度なエンタングルメント プログラムを作成するのに役立ちます。