量子プログラミング言語の概要 Q#

Q# は、量子アルゴリズムを開発および実行するための オープン ソース プログラミング言語です。 Q# は、Quantum Development Kit (QDK) に含まれています。 詳細については、「 Quantum Development Kit のセットアップ」を参照してください。

量子プログラミング言語として、 Q# は次の言語、コンパイラ、およびランタイムの要件を満たしています。

  • ハードウェアに依存しない:量子アルゴリズムの 量子ビットは、特定の量子ハードウェアまたはレイアウトに関連付けられません。 Q#コンパイラとランタイムは、プログラムの量子ビットから物理量子ビットへのマッピングを処理します。
  • 量子コンピューティングとクラシック コンピューティングを統合する: ユニバーサル量子コンピューターでは、古典的計算と量子計算を実行する機能が不可欠です。
  • 物理の法則を尊重する:Q# と量子アルゴリズムは、量子物理学の規則に従います。 たとえば、 Q#の量子ビット状態を直接コピーまたはアクセスすることはできません。

Q# プログラムの構造

量子プログラムの記述を開始する前に、その構造とコンポーネントを理解することが重要です。 重ね合わせ状態を作成する次の Q# プログラムについて考えてみましょう。

namespace Superposition {
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit. By default, it's in the 0 state.  
        use q = Qubit();  
        // Apply the Hadamard operation, H, to the state.
        // It now has a 50% chance of being measured as 0 or 1.
        H(q);      
        // Measure the qubit in the Z-basis.
        let result = M(q);
        // Reset the qubit before releasing it.
        Reset(q);
        // Return the result of the measurement.
        return result;
    }
}

コメント (//) に基づいて、 Superposition プログラムは最初に量子ビットを割り当て、量子ビットを重ね合わせに配置する操作を適用し、量子ビットの状態を測定し、量子ビットをリセットして、最終的に結果を返します。 このプログラムをコンポーネントに分割しましょう。

ユーザー名前空間

Q# プログラムは、次のようなユーザー定義 namespaceで始まります。

namespace Superposition {
    // Your code goes here.
}

名前空間は、関連する機能を整理するのに役立ちます。 各 Q# プログラムは、1 つの namespaceのみを持つことができます。

Q#標準ライブラリには、量子プログラムで使用できる関数と操作を含む定義済みの名前空間があります。 詳細については、「 組み込み名前空間」を参照してください。

エントリ ポイント

@EntryPoint()属性は、プログラムの実行を開始する場所をQ#コンパイラに指示します。 複数の関数と操作を含むプログラムでは、その前に @EntryPoint() を配置して、プログラムをそこから開始し、順番に続行することができます。

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...

種類

Q#には組み込み型IntDoubleBoolStringなど、ほとんどの言語に共通する型と、量子コンピューティングに固有の型が用意されています。 たとえば、 Result 型は量子ビット測定の結果を表し、 Zero または Oneの 2 つの値のいずれかを持つことができます。

Superposition プログラムでは、MeasureOneQubit()操作は、M操作の戻り値の型に対応するResult型を返します。 測定結果は、 let ステートメントを使用して定義された新しい変数に格納されます。

// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
    ...
    // Measure the qubit in the Z-basis, returning a Result type.
    let result = M(q);
    ...

Q# には、範囲、配列、タプルを定義する型も用意されています。 独自のカスタム型を定義することもできます。

量子ビットの割り当て

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

Superposition プログラムは、1 つの量子ビットを定義します。

// Allocate a qubit.
use q = Qubit();

複数の量子ビットを割り当て、インデックスを使用して各量子ビットにアクセスすることもできます。

use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.

詳細については、 ステートメントを参照してください。

量子演算

量子ビットを割り当てた後、それを操作と関数 ( callables とも呼ばれます) に渡すことができます。 演算は Q# プログラムを構成する基本要素です。 Q#演算は、量子サブルーチン、または量子ビット レジスタの状態を変更する量子演算を含む呼び出し可能なルーチンです。

Q#操作を定義するには、操作の名前、その入力、および出力を指定します。 Superpositionプログラムでは、MeasureOneQubit()操作は基本的にプログラム全体です。 パラメーターを受け取り、 Result 型を返します。

operation MeasureOneQubit() : Result {
    ...
}

パラメーターを受け取らないし、戻り値を期待しない基本的な例を次に示します。 Unit値は、他の言語のNULLと同じです。

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

Q#標準ライブラリには、Superposition プログラムの Hadmard 演算、Hなどの量子プログラムで使用できる操作も用意されています。 Z 基準で量子ビットを指定すると、 H は量子ビットを偶数重ね合わせに配置します。ここで、 Zero または Oneとして測定される確率は 50% です。

量子ビットの測定

量子測定にはさまざまな種類がありますが、 Q# では、単一量子ビット ( Pauli 測定とも呼ばれます) に対する射投影測定に重点を置いています

Q#では、Measure演算は、指定されたパウリ単位で 1 つ以上の量子ビットを測定します。これは、PauliXPauliY、またはPauliZできます。 Measureは、ZeroまたはOneのいずれかのResult型を返します。

計算基準 $\lbrace\ket{0},\ket{1}\rbrace$で測定を実装するには、pauli Z 基準で量子ビットを測定する M 演算を使用することもできます。 これにより、MMeasure([PauliZ], [qubit])と同等になります。

Superposition プログラムは、M操作を使用します。

// Measure the qubit in the Z-basis.
let result = M(q);

量子ビットのリセット

Q#では、量子ビットmust解放されると$\ket{0}$状態になります。 Reset操作を使用して、各量子ビットを$\ket{0}$状態にリセットしてから、プログラムの終了時に解放します。 量子ビットをリセットしないと、ランタイム エラーが発生します。

// Reset a qubit.
Reset(q);

組み込みの名前空間

Q#標準ライブラリには、量子プログラムで使用できる関数と操作を含む名前空間が組み込まれています。 たとえば、 Microsoft.Quantum.Intrinsic 名前空間には、結果を測定する M や、プログラム内の任意の場所にユーザー メッセージを表示する Message など、一般的に使用される操作と関数が含まれています。

関数または操作を呼び出すには、名前空間全体を指定するか、 open ステートメントを使用します。これにより、その名前空間のすべての関数と操作を使用でき、コードを読みやすくすることができます。 次の例では、同じ操作を呼び出します。

Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");

Superposition プログラムには、完全な名前空間を持つopenステートメントや呼び出しはありません。 これは、 Q# 開発環境では、 Microsoft.Quantum.CoreMicrosoft.Quantum.Intrinsicの 2 つの名前空間が自動的に読み込まれ、一般的に使用される関数と操作が含まれているためです。

MResetZ操作を使用してSuperposition プログラムを最適化することで、Microsoft.Quantum.Measurement名前空間を利用できます。 MResetZ は、次の例のように、測定操作とリセット操作を 1 つのステップに結合します。

namespace Superposition {
    // Open the namespace for the MResetZ operation.
    open Microsoft.Quantum.Measurement;

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit. By default, it's in the 0 state.      
        use q = Qubit();  
        // Apply the Hadamard operation, H, to the state.
        // It now has a 50% chance of being measured as 0 or 1. 
        H(q);   
        // Measure and reset the qubit, and then return the result value.
        return MResetZ(q);
    }
}

Q#と Azure Quantum を使用して量子プログラムを開発する

Q# と Azure Quantum は、量子プログラムを開発して実行するための強力な組み合わせです。 Q#と Azure Quantum を使用すると、量子プログラムを記述し、その動作をシミュレートし、リソース要件を見積もり、実際の量子ハードウェアで実行できます。 この統合により、量子コンピューティングの可能性を探り、複雑な問題に対する革新的なソリューションを開発できます。 初心者でも経験豊富な量子開発者でも、 Q# と Azure Quantum には、量子コンピューティングの能力を引き出すために必要なツールとリソースが用意されています。

次の図は、 Q# と Azure Quantum を使用して量子プログラムを開発するときに、量子プログラムが通過する段階を示しています。 プログラムは開発環境から始まり、実際の量子ハードウェアへのジョブの送信で終わります。

量子プログラミング開発のワークフローを示す図。

図の手順を分解しましょう。

開発環境を選択する

任意の開発環境で量子プログラムを実行します。 Azure Quantum Web サイトのオンライン コード エディター、Azure Portal の Azure Quantum ワークスペースでホストされている Jupyter Notebook、または Visual Studio Code を使用したローカル開発環境を使用できます。 詳細については、「Q# プログラムを実行する方法を参照してください。

量子プログラムを記述する

量子開発キット (QDK) を使用して、 Q# で量子プログラムを記述できます。 開始するには、「 Quickstart: 初めての Q# プログラムを作成するを参照してください。

QDK では、 Q#に加えて、 Qiskit Cirq など、量子コンピューティング用の他の言語もサポートされています。

Python と統合する

Q#は単独で使用することも、さまざまな IDE で Python と共に使用することもできます。 たとえば、Python ホスト プログラムでQ# プロジェクトを使用してQ#操作を呼び出すことができます。 Jupyter Notebooks で Q# と Python を統合することもできます。 詳細については、「Q# プログラムを実行する方法を参照してください。

%%qsharp コマンド

既定では、Jupyter Notebooks の Q# プログラムでは、 ipykernel Python パッケージが使用されます。 Q#コードをノートブック セルに追加するには、%%qsharp コマンドを使用します。このコマンドは、qsharp Python パッケージで有効にされ、その後にQ# コードが続きます。

%%qsharpを使用する場合は、次の点に注意してください。

  • %%qsharpを有効にするには、最初にimport qsharpを実行する必要があります。
  • %%qsharp スコープをノートブック セルに追加し、セルの種類を Python から Q# に変更します。
  • %%qsharpの前または後に Python ステートメントを記述することはできません。
  • Q#次のコード%%qsharpQ#構文に従う必要があります。 たとえば、#ではなく//を使用してコメントを示し、;してコード行を終了します。

Note

Azure portal の Azure ノートブックには、最新バージョンの qsharp パッケージと azure-quantum Python パッケージが含まれているため、何もインストールする必要はありません。 詳細については、「 Get started with Q# and Azure Quantum notebooksを参照してください。

リソースの見積もり

実際の量子ハードウェアで実行する前に、プログラムを既存のハードウェアで実行できるかどうか、および使用するリソースの数を把握する必要があります。

Azure Quantum Resource Estimator を使用すると、アーキテクチャの決定を評価し、量子ビット テクノロジを比較し、特定の量子アルゴリズムを実行するために必要なリソースを決定できます。 事前に定義されたフォールト トレラント プロトコルから選択し、基になる物理量子ビット モデルの前提条件を指定できます。

詳細については、「 最初のリソース見積もりを実行する」を参照してください。

Note

Azure Quantum Resources Estimator は無料であり、Azure アカウントは必要ありません。

シミュレーションでプログラムを実行する

量子プログラムをコンパイルして実行すると、QDK によって量子シミュレーターのインスタンスが作成され、 Q# コードが渡されます。 シミュレーターでは、Q# コードを使用して量子ビット (量子粒子のシミュレーション) を作成し、変換を適用してその状態を変更します。 その後、シミュレーター内の量子演算の結果がプログラムに返されます。 シミュレーター内で Q# コードを分離すると、アルゴリズムが量子物理学の法則に従うようになり、量子コンピューターで正しく実行できます。

実際の量子ハードウェアにプログラムを送信する

Q# プログラム (ジョブとも呼ばれます) は、ローカルとオンラインの両方で、好みの開発環境を通じて Azure Quantum に送信できます。 詳細については、Q# ジョブの送信方法に関する記事を参照してください。 Qiskit 言語と Cirq 言語で記述された量子回路を実行して送信することもできます。

Azure Quantum は、業界のリーダーから現在利用できる最も魅力的で多様な量子ハードウェアの一部を提供しています。 現在サポートされているハードウェア プロバイダーの一覧については、量子コンピューティング プロバイダーに関する記事を参照してください。

Note

クラウドベースの Quantinuum H シリーズ エミュレーター ターゲットは、Azure アカウントなしで使用できます。 Azure Quantum プロバイダーの残りの部分にジョブを送信するには、Azure アカウントと量子ワークスペースが必要です。 量子ワークスペースがない場合は、「 Azure Quantum ワークスペースを作成する」を参照してください。

次の図は、ジョブを送信した後の基本的なワークフローを示しています。

Azure Quantum へのジョブの送信後のワークフローを示す図。