次の方法で共有


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

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

量子プログラミング言語として、 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 Superposition {
    // Your code goes here.
}

名前空間は、関連する機能を整理するのに役立ちます。 各 Q# プログラムは 1 つだけ namespaceを持つことができます。 名前空間が指定されていない場合、コンパイラは Q# 名前空間としてファイル名を使用します。 たとえば、プログラムは 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;
}

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

エントリ ポイント

既定では、コンパイラは Q# 、プログラム内の任意の Main() 場所に配置できる操作 (使用可能な場合) からプログラムの実行を開始します。 必要に応じて、この属性を @EntryPoint() 使用して、プログラム内の任意の操作を実行ポイントとして指定できます。

プログラムでは Superposition 、よりわかりやすい MeasureOneQubit() 操作は、プログラムのエントリ ポイントです。

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

ただし、操作Main()の名前を次のように変更することで、@EntryPoint()属性なしでプログラムをMeasureOneQubit()書き込むこともできます。

// The Q# compiler automatically detects the Main() operation as the entry point. 

operation Main() : 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;
}

種類

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

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

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

量子演算

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

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

operation MeasureOneQubit() : Result {
    ...
}

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

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

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

量子ビットの測定

量子測定には多くの種類がありますが、 Q# 単一量子ビット (パウリ測定とも呼ばれます) に対する射射測定に焦点を当てています。

でQ#、この演算はMeasure、指定されたパウリ基準で 1 つ以上の量子ビットを測定します。これは、次PauliZPauliYのいずれかになりますPauliXMeasureは、いずれかの型または Result OneZero の型を返します。

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

このプログラムでは Superposition 、次の操作が M 使用されます。

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

量子ビットのリセット

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

// Reset a qubit.
Reset(q);

組み込みの名前空間

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

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

Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");

// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`. 
import Std.Intrinsic.*;
Message("Hello quantum world!");

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

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

// Import the namespace for the MResetZ operation.
import 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);
}

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

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

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

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

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

開発環境を選択する

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

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

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

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

Python と統合する

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

%%qsharp コマンド

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

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

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

Note

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

リソースの見積もり

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

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

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

Note

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

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

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

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

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

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

Note

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

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

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