Q# プログラムの構造について
量子プログラムの作成を開始する前に、Q# プログラムの構造とコンポーネントについて理解することが重要です。
このユニットでは、Q# プログラムの主要なコンポーネントを確認します。
名前空間
すべての Q# ファイルは名前空間で始まります。 次に例を示します。
namespace HelloQuantum {
// Your code goes here.
}
名前空間を定義するには、namespace
キーワードを使います。 名前空間は、Q# コードを論理的な単位に整理するために使われます。 自分のプログラムで Q# ライブラリを使用したり、独自のライブラリを作成したりするときに、これらを使用することが重要になります。
量子ビットの割り当て
Q# で量子ビットを取得するには、use
キーワードを使用します。 use
キーワードを使って割り当てたすべての量子ビットは、$\ket{0}$ 状態で開始します。
一度に 1 つまたは複数の量子ビットを割り当てることができます。 1 つと 5 つの量子ビットを割り当てる例を次に示します。
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
量子演算
演算は Q# プログラムを構成する基本要素です。 Q# の演算は、量子サブルーチンです。 つまり、量子レジスタの状態を変更する量子演算を格納する呼び出し可能なルーチンです。
Q# 演算を定義するには、演算の名前とその入力および出力を指定します。 基本的な例を次に示します。
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
ここで、SayHelloQ
は演算の名前です。 これは入力としてゼロ引数を受け取り、型 Unit
を返します。これは演算が情報を返さないことを意味します。
Q# ライブラリには、量子ビットを重ね合わせ状態に設定する仇マール演算 H
など、プログラムで使用できる演算も用意されています。
種類
Q# には、Int
、Double
、Bool
、String
などのなじみのある多くの組み込み型が用意されています。
この例では、Unit
型は、演算によって情報が返されないことを示すために使用されます。
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
次のユニットでは、量子コンピューティングに固有の型である Result
型を使用します。 Result
型は量子ビットの計測の結果であり、One
または Zero
になります。
量子ライブラリ
Q# ライブラリには、量子プログラムで使用できる関数と演算が含まれます。 ライブラリの関数または演算を呼び出すときは、open
ディレクティブを使い、ライブラリの名前空間を指定します。 たとえば、Microsoft.Quantum.Intrinsic
ライブラリを使用するには、以下を行います。
open Microsoft.Quantum.Intrinsic;
エントリ ポイント
EntryPoint
は、プログラムの実行を開始する場所を Q# コンパイラに指示します。 すべての Q# プログラムには、1 つのエントリ ポイントとそれに続く演算が必要です。 たとえば、次のコードは、コンソールに "Hello quantum world!" を出力するエントリ ポイント演算 HelloQ
を定義します。
namespace HelloQuantum {
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation HelloQ() : Unit {
Message("Hello quantum world!");
}
}
Note
上記の Q# プログラムは、Microsoft.Quantum.Intrinsic
ライブラリを開き、コンソールにメッセージを書き込む Message
演算を使用することに注意してください。
量子ビットの測定
Q# では、Measure
演算は、指定されたパウリ基底の 1 つ以上の量子ビットの結合測定を実行します (PauliX
、PauliY
、または PauliZ
)。 Measure
演算は、One
または Zero
である Result
型を返します。
計算基底 $\lbrace\ket{0},\ket{1}\rbrace$ で測定を実装するには、パウリ Z 基底で測定を実行する M
演算を使うこともできます。 したがって、M
演算は Measure([PauliZ], [qubit])
を適用することと同じです。
量子ビットのリセット
Q# では、量子ビットは解放される時点までに $\ket{0}$ 状態になっている必要があります。 量子ビットの使用が完了したら、Reset
演算を使って、量子ビットを $\ket{0}$ にリセットします。
// Reset the qubit so it can be safely released.
Reset(qubit);