量子コンピューティングの主要概念であるエンタングルメントを示す基本的な Q# プログラムを記述する方法について説明します。
2 つ以上の量子ビットが絡み合うと、量子情報が共有されます。つまり、1つの量子ビットに何が起こっても、それがもう一方の量子ビットにも影響を及ぼします。 このクイック スタートでは、ベル ペアと呼ばれる特定の 2 量子ビットの絡み合った状態を作成します。 ベル ペアでは、ある量子ビットを状態で $\ket{0}$ 測定すると、もう一方の量子ビットも測定せずに状態になっている $\ket{0}$ ことがわかります。 詳細については、「量子エンタングルメント」を参照してください。
このクイック スタートでは次の作業を行います。
- Q# ファイルを作成します。
- 量子ビットのペアを割り当てます。
- 量子ビットをエンタングルします。
前提条件
- 最新バージョンの Visual Studio Code。
- Microsoft Quantum Development Kit (QDK) 拡張機能。 インストールの詳細については、「 Microsoft Quantum Development Kit のセットアップ」を参照してください。
Q# ファイルを作成します。
- Visual Studio Code を開きます。
- ファイル>を選択し、新しいテキストファイルを作成します。
- このファイルを
Main.qsとして保存します。 .qs 拡張子はプログラムを Q# 表します。
コードを記述するQ#
Main.qsファイルで、次の手順に従って、量子ビットのペアをエンタングルして測定します。
量子ライブラリをインポートする
QDK には、量子プログラム用の Q# 定義済みの関数と演算を含む標準ライブラリが含まれています。 それらを使用するには、まず関連するライブラリをインポートする必要があります。
プログラムで、ステートメントを import 使用してライブラリを Std.Diagnostics 開きます。 これにより、 DumpMachineを含むすべてのライブラリの関数と操作にアクセスできます。この操作は、後でエンタングル状態を表示するために使用します。
import Std.Diagnostics.*;
操作を定義する
関連するライブラリをインポートした後、量子演算とその入力値と出力値を定義します。 このクイックスタートでは、操作は Main. ここでは、2 つの量子ビットを割り当て、操作し、測定する残りの Q# コードを記述します。
Mainはパラメーターを受け取らず、量子ビットの測定値の結果を表すZeroまたはOneという2つのResult値を返します。
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());
注意
では、Q# では、量子ビットは常に $\ket{0}$ 状態で割り当てられます。
重ね合わせに量子ビットを 1 つ配置する
キュービット q1 と q2 は $\ket{0}$ 状態にあります。 量子ビットをエンタングルメントの準備として、1つを等しい重ね合わせ状態にする必要があります。この状態では、$\ket{0}$として測定される確率も$\ket{1}$として測定される確率もそれぞれ50%です。
あなたは、キュービットを重ね合わせ状態にするために、ハダマード操作を適用します。
// 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 は、状態 q1 が $\ket{1}$ のときに状態 q2 を反転します。
// 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 使用してそれらを測定できます。 測定することでq1とq2の量子状態はZeroまたはOneになり、均等な確率で収束する。
で 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完了し、絡み合った状態を観察するには、次の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#を探索する」 を参照してください。 このチュートリアルでは、このクイック スタートで説明する概念を詳しく説明し、より高度なエンタングルメント プログラムを作成するのに役立ちます。