クイック スタート: 初めての Q# プログラムを作成する
量子コンピューティングの主要な概念であるエンタングルメントを示す基本的な Q# プログラムを記述する方法について説明します。
2 つ以上の 量子ビット が絡み合うと、量子情報が共有されます。つまり、1 つの量子ビットに対して何が起こっても、もう一方の量子ビットにも発生します。 このクイック スタートでは、ベル ペアと呼ばれる特定の 2 量子ビットの絡み合った状態を作成します。 ベル ペアでは、 $\ket{0}$ 状態の 1 つの量子ビットを測定すると、もう 1 つの量子ビットも測定せずに $\ket{0}$ 状態であることがわかります。 詳細については、「 Quantum エンタングルメントを参照してください。
このクイック スタートでは次の作業を行います。
- Q# ファイルを作成します。
- 量子ビットのペアを割り当てます。
- 量子ビットをエンタングルします。
前提条件
- 最新バージョンの Visual Studio Code。
- Azure Quantum Development Kit (QDK) 拡張機能。 インストールの詳細については、「 Quantum Development Kit のセットアップを参照してください。
Q# ファイルを作成します。
- Visual Studio Code を開きます。
- ファイル>新しいテキスト ファイルを選択します。
- このファイルを
Entanglement.qs
として保存します。 .qs 拡張子は、 Q# プログラムを表します。
Q# コードを記述する
Entanglement.qs
ファイルで、次の手順に従って、量子ビットのペアをエンタングルして測定します。
名前空間を定義する
各 Q# プログラムは、関連する機能を整理するのに役立つユーザー定義の名前空間で始まります。 このクイック スタートでは、名前空間は BellPair
。
namespace BellPair {
// Your code goes here.
}
量子ライブラリを開く
QDK には、量子プログラムの定義済みの関数と演算を含む Q# 標準ライブラリが含まれています。 それらを使用するには、まず関連するライブラリを開く必要があります。
BellPair
名前空間で、open
ステートメントを使用してMicrosoft.Quantum.Diagnostics
ライブラリをインポートします。 これにより、 DumpMachine()
を含むすべての関数と操作にアクセスできます。この操作は、後で絡み合った状態を表示するために使用します。
open Microsoft.Quantum.Diagnostics;
操作を定義する
関連するライブラリを開いた後、量子演算とその入力値と出力値を定義します。 このクイック スタートでは、操作は EntangleQubits
。 ここでは、残りの Q# コードを記述して、2 つの量子ビットを割り当て、操作し、測定します。
EntangleQubits
はパラメーターを受け取り、量子ビット測定の結果を表す 2 つの Result
値 ( Zero
または One
) を返します。
operation EntangleQubits() : (Result, Result) {
// Your entanglement code goes here.
}
2 つの量子ビットを割り当てる
EntangleQubits
操作は現在空であるため、次の手順では、q1
とq2
の 2 つの量子ビットを割り当てます。 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}$ 状態です。 量子ビットをエンタングルメント用に準備するには、いずれかの量子ビットを偶数重ね合わせに配置する必要があります。この場合、 $\ket{0}$ または $\ket{1}$として測定される可能性は 50% です。
重ね合わせに量子ビットを配置するには、Hadmard、 H
、操作を適用します。
// Put q1 into an even superposition.
H(q1);
結果として得られる q1
の状態は $\frac{{1}{\sqrt{2}}(\ket{{0}+\ket{1})$であり、これは $\ket{0}$ と $\ket{{1}$の重ね合わせです。
量子ビットをエンタングルする
これで、制御されていない、 CNOT
、操作を使用して量子ビットをエンタングルする準備ができました。 CNOT
は 2 つの量子ビットを受け取る制御演算です。1 つはコントロールとして機能し、もう 1 つはターゲットとして機能します。
このクイック スタートでは、 q1
を制御量子ビットとして設定し、 q2
をターゲット量子ビットとして設定します。 つまり、CNOT
q1
の状態が$\ket{1}$されたときに、q2
の状態が反転します。
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
両方の量子ビットの結果の状態は、Bell ペア $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$です。
ヒント
Hadmard 操作と CNOT 演算によって量子ビットの状態がどのように変換されるかについては、「 量子演算を使用したエンタングルメントの作成」を参照してください。
絡み合った状態を表示する
量子ビットを測定する前に、前のコードで量子ビットが正常に絡み合っていることを確認することが重要です。 Microsoft.Quantum.Diagnostics
ライブラリの一部であるDumpMachine
操作を使用して、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);
測定結果を返す
最後に、 EntangleQubits
操作を完了し、絡み合った状態を観察するには、 m1
と m2
の測定結果を返します。
// Return the measurement results.
return (m1, m2);
ヒント
Q#関数または操作の詳細については、その上にマウス ポインターを置きます。
Q# コードを実行する
お疲れさまでした。 あなたは、2つの量子ビットを絡み合わせ、ベルペアを作成する Q# プログラムを書きました。 プログラムを実行する前に、 @EntryPoint()
属性を使用して、プログラムの実行を開始する場所を Q# コンパイラに指示します。 すべての Q# プログラムには、1 つの @EntryPoint()
が含まれている必要があります。 この場合は、EntangleQubits
操作の前に@EntryPoint()
を配置します。
最終的な Q# プログラムは次のようになります。
namespace BellPair {
open Microsoft.Quantum.Diagnostics;
@EntryPoint()
operation EntangleQubits() : (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);
}
}
プログラムを実行して両方の量子ビットの結果を表示するには、@EntryPoint()
で Run を選択するか、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#を使用した量子エンタングルメントの詳細については、「Tutorial: Q#を使用した量子エンタングルメントの探索」を参照してください。 このチュートリアルでは、このクイック スタートで説明する概念を詳しく説明し、より高度なエンタングルメント プログラムを作成するのに役立ちます。