Q# プログラムの主要なコンポーネントは何か
量子プログラムの作成を開始する前に、Q# プログラムの構造とコンポーネントについて理解することが重要です。
このユニットでは、Q# プログラムの主要なコンポーネントを確認します。
Main
操作
すべての Q# プログラムには、少なくとも 1 つの操作が含まれている必要があり、これは通常、Main
操作となります。 Main
操作は、プログラムのエントリ ポイントです。 既定では、Q# コンパイラは Main()
操作からプログラムの実行を開始します。 オプションとして、@EntryPoint()
属性を使用することで、プログラム内の任意の操作を実行ポイントとして指定できます。
たとえば、次のコードはエントリ ポイント操作の MeasureOneQubit
を定義します。
@EntryPoint()
operation MeasureOneQubit() : Result {
...
}
ただし、以下のように MeasureOneQubit()
操作の名前を Main()
に変更することで、@EntryPoint()
属性を使用せずにこのコードを記述することもできます。
// The Q# compiler automatically detects the Main() operation as the entry point.
operation Main() : Result {
...
}
種類
Q# には、Int
、Double
、Bool
、String
などのなじみのある多くの組み込み型が用意されています。 Q# には、Qubit
や Result
などの量子コンピューティングに特有の型も用意されています。
この例では、MeasureOneQubit
操作は Result
型を返します。 Result
型は量子ビットの計測の結果であり、One
または Zero
のどちらかになります。
operation MeasureOneQubit() : Result {
...
}
量子ライブラリ
Q# ライブラリには、量子プログラム内で使用できる関数と操作が含まれています。 ライブラリの関数または演算を呼び出すときは、import
ディレクティブを使い、ライブラリの名前空間を指定します。 たとえば、Standard 量子ライブラリの Microsoft.Quantum.Intrinsic
名前空間の Message
関数を使用するには、以下を実行します。
// imports all functions and operations from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
Standard ライブラリの名前空間は、Microsoft.Quantum
の代わりに Std
を使用してインポートできます。 次に例を示します。
// imports all functions and operations from Microsoft.Quantum.Intrinsic == Std.Intrinsic
import Std.Intrinsic.*;
Message("Hello quantum world!");
量子ビットの割り当て
Q# において、量子ビットを割り当てるには、use
キーワードと Qubit
型を使用します。 use
キーワードを使って割り当てたすべての量子ビットは、$\ket{0}$ 状態で開始します。
一度に 1 つまたは複数の量子ビットを割り当てることができます。 1 つと 5 つの量子ビットを割り当てる例を次に示します。
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
量子ビットの測定
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);