Q# プログラムの主要なコンポーネントは何か

完了

独自の量子プログラムを記述する前に、Q# プログラミング言語の構造とコンポーネントを理解することが重要です。

このユニットでは、Q# プログラムの基本的なコンポーネントについて説明します。

Main 操作

すべての Q# プログラムには、少なくとも 1 つの操作が含まれている必要があります。 Q# コンパイラは、エントリ ポイント操作 (既定では Main 操作) からプログラムの実行を開始します。 たとえば、次の Q# プログラムには、量子ビットを作成し、量子ビットの状態の測定値を返す Main という操作が含まれています。

// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
    use q = Qubit();
    return M(q);
}

Q# コードは、エントリポイント操作なしでは実行できません。 エントリ ポイントとして Main 以外の操作を使用する場合は、 @EntryPoint() 属性を使用します。 たとえば、次のコードは、前の操作によりわかりやすい名前を付け、 MeasureOneQubitし、その操作を Q# プログラムへのエントリ ポイントとして定義します。

// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
    use q = Qubit();
    return M(q);
}

種類

Q# には、 IntDoubleBoolStringなど、既に使い慣れている可能性がある多くの組み込みデータ型が用意されています。 Q# には、 QubitResultなど、量子コンピューティングに固有の型も用意されています。

たとえば、 MeasureOneQubit 操作は Result 型の値を返します。 Result型は、量子ビットが測定されたときの量子ビットの状態を表し、ZeroまたはOneのいずれかの値を持つことができます。

量子ライブラリ

Q# には、量子プログラムの記述に役立つ関数と操作を含む複数のライブラリが付属しています。 ライブラリから関数または操作を呼び出すには、 import キーワードを使用し、ライブラリの名前空間を指定します。 たとえば、標準量子ライブラリのMessage名前空間のMicrosoft.Quantum.Intrinsic関数を使用するには、次のコードを使用します。

// import all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

アスタリスクは、 Microsoft.Quantum.Intrinsic 名前空間からすべての関数をインポートすることを意味します。 または、 Message 関数のみをインポートできます。

// import only the Message function from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.Message;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

Q# では、 Unit 型は、関数または操作が値を返さないことを意味します。 Q# の型の詳細については、「 型システム」を参照してください。

Stdではなく、Microsoft.Quantumを使用して標準ライブラリに名前空間をインポートできます。 たとえば、次のコードは、 Microsoft.Quantum.Intrinsic 名前空間からすべての関数と操作をインポートします。

// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Std.Intrinsic
    Message("Hello quantum world!");
}

Q# 標準ライブラリを調べるには、 API リファレンスを参照してください

量子ビットの割り当て

Q# で量子ビットを割り当てるには、 use キーワードと Qubit 型を使用します。 use キーワードで割り当てる量子ビットは、常に $\ket{0}$ 状態で開始されます。

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

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

量子ビット測定

Q# では、Measure 演算は、指定されたパウリ基底の 1 つ以上の量子ビットの結合測定を実行します (PauliXPauliY、または PauliZ)。 Measure操作は、ResultまたはZeroのいずれかの値を持つOne型を返します。

計算基底 $\lbrace\ket{0},\ket{1}\rbrace$ で測定を実行するには、M 操作を使用することもできます。 M操作は、Pauli-Z ベースのMeasure操作と同じであるため、M([qubit])Measure([PauliZ], [qubit])とまったく同じように動作します。 ただし、 M 操作では、量子ビット配列ではなく、入力として 1 つの量子ビットのみを受け入れます。

量子ビットのリセット

Q# では、量子ビットを解放するには$\ket{0}$ 状態である必要があります。 量子ビットの使用が完了したら、 Reset 操作を呼び出して、量子ビットを $\ket{0}$ 状態にリセットします。 たとえば、次のコードは量子ビットを割り当て、量子ビットの状態を測定してから、量子ビットをリセットします。

operation Main() : Result {
    use q = Qubit();
    let result = M(q);

    // Reset the qubit so that you can release it
    Reset(q);

    return result;
    }