量子プログラミング言語の概要 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#には、量子コンピューティングに固有の型などBool
Int
Double
String
、ほとんどの言語に共通する組み込み型が用意されています。 たとえば、この型はResult
量子ビット測定の結果を表し、次の 2 つの値のいずれかを持つことができます。One
Zero
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# 定義するには、操作の名前、入力、および出力を指定します。 プログラムでは Superposition
、 MeasureOneQubit()
操作は基本的にプログラム全体です。 パラメーターを受け取り、型を 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 つ以上の量子ビットを測定します。これは、次PauliZ
PauliY
のいずれかになりますPauliX
。 Measure
は、いずれかの型または Result
One
〗 Zero
の型を返します。
計算基準 $\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 パッケージで%%qsharp
qsharp
有効になっているコマンドを使用し、その後にコードを追加しますQ#。
使用 %%qsharp
する場合は、次の点に注意してください。
- 最初に実行
import qsharp
して有効にする%%qsharp
必要があります。 %%qsharp
スコープは、それが表示されるノートブックセルに対して、セルの種類を Python から変更します Q#。- Python ステートメントを前後に
%%qsharp
配置することはできません。 - Q# 次
%%qsharp
のコードは構文に従う Q# 必要があります。 たとえば、コメントを#
示したり、コード行を終了したり;
する代わりに使用//
します。
Note
Azure portal の Azure Notebook には最新バージョンの Python パッケージがqsharp
azure-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 ワークスペースの作成」を参照してください。
次の図は、ジョブを送信した後の基本的なワークフローを示しています。