Q# プログラムの構造について

完了

Q# 量子プログラミング言語には、明確に定義された構造があります。 このユニットでは、Q# プログラムの主要なコンポーネントを確認します。

名前空間

すべての Q# ファイルは名前空間で始まります。 次に例を示します。

namespace HelloQuantum {
    // Your code goes here.
}

名前空間を定義するには、namespace キーワードを使います。 名前空間は、Q# コードを論理的な単位に整理するために使われます。 自分のプログラムで Q# ライブラリを使用したり、独自のライブラリを作成したりするときに、これらを使用することが重要になります。

ライブラリ

Q# ライブラリには、量子プログラムで使用できる関数と演算が含まれます。 ライブラリの関数または演算を呼び出すときは、open ディレクティブを使い、ライブラリの名前空間を指定します。 次に例を示します。

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

    @EntryPoint()
    operation HelloQ() : Unit {
        Message("Hello quantum world!");
    }
}

この例の open ディレクティブは、Microsoft.Quantum.Intrinsic 名前空間で Message 演算を探すよう Q# コンパイラに指示します。

エントリ ポイント

EntryPoint は、プログラムの実行を開始する場所を Q# コンパイラに指示します。 すべての Q# プログラムには、少なくとも 1 つのエントリ ポイントとそれに続く演算が必要です。

量子ビットの割り当て

Q# で量子ビットを取得するには、use キーワードを使用します。 use キーワードを使って割り当てたすべての量子ビットは、|0〉 状態で開始します。

一度に 1 つまたは複数の量子ビットを割り当てることができます。 1 つと 5 つの量子ビットを割り当てる例を次に示します。

use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

量子演算

演算は Q# プログラムを構成する基本要素です。 Q# の演算は、量子サブルーチンです。 つまり、量子レジスタの状態を変更する量子演算を格納する呼び出し可能なルーチンです。

Q# 演算を定義するには、演算の名前とその入力および出力を指定します。 基本的な例を次に示します。

@EntryPoint()
operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

ここで、SayHelloQ は演算の名前です。 これは入力としてゼロ引数を受け取り、型 Unit を返します。これは演算が情報を返さないことを意味します。

Q# ライブラリには、プログラムで使用できる演算も用意されています。 後で使用する 1 つの演算は、H 演算です。 Z 基底の量子ビットを指定すると、H 演算によって量子ビットが "均一" の重ね合わせになります。 重ね合わせ状態では、量子ビットは 0 または 1 として測定される確率が 50% になります。

種類

Q# には、IntDoubleBoolString などのなじみのある多くの組み込み型に加えて、量子コンピューティングに固有の型が用意されています。 Q# には、範囲、配列、およびタプルを定義する型も用意されています。 独自のカスタム型を定義することもできます。

このモジュールでは、Result 型を操作します。 Result は量子ビット測定の結果を表し、OneZero の 2 つの値のいずれかを取ることができます。

量子ビットの測定

Q# では、パウリ測定は、指定されたパウリ基底の 1 つ以上の量子ビットの結合測定を実行する Measure 演算を適用することによって行われます。 Measure 演算は、One または Zero である Result 型を返します。

Note

基底配列と量子ビット配列の長さが異なる場合、Measure 演算は失敗します。

計算基底 {|0〉 ,|1} で測定を実装するには、パウリ Z 基底で単一量子ビットの測定を実行する M 演算を使うこともできます。 したがって、M 演算は Measure([PauliZ], [qubit]) を適用することと同じです。

次に示す簡単なプログラムの例では、|0〉 状態で 1 つの量子ビットを割り当てた後、それにアダマール演算 H を適用し、結果を PauliZ 基底で測定しています。

@EntryPoint()
operation MeasureOneQubit() : Result {
    // Allocate a qubit, by default it is in zero state      
    use q = Qubit();  
    // We apply a Hadamard operation H to the state
    // It now has a 50% chance of being measured 0 or 1  
    H(q);      
    // Now we measure the qubit in Z-basis.
    let result = M(q);

    // Reset the qubit so it can be safely released.
    Reset(qubit);
    return result;
}

Note

量子ビットを |0〉 状態にリセットするには、Reset 演算を使います。 Q# では、量子ビットは解放される時点までに |0〉 状態になっている必要があります。