Q# は、量子プログラムを記述するために Microsoft によって開発された高レベル のオープンソース プログラミング言語です。 Q# は、Quantum Development Kit (QDK) に含まれています。 詳細については、「Quantum 開発キットのセットアップ」を参照してください。
量子プログラミング言語として、 Q# は言語、コンパイラ、ランタイムに関する次の要件を満たしています。
- ハードウェアに依存しない: 量子アルゴリズムの量子ビットは、特定の量子ハードウェアまたはレイアウトに関連付けられません。 Q#コンパイラとランタイムは、プログラム量子ビットから物理量子ビットへのマッピングを処理し、同じコードを異なる量子プロセッサで実行できるようにします。
- 量子コンピューティングとクラシック コンピューティングの統合:Q# は、ユニバーサル量子コンピューティングに不可欠な量子計算と古典的計算の統合を可能にします。
- 量子ビット管理:Q# には、重ね合わせ状態の作成、量子ビットのエンタング、量子測定の実行など、量子ビットを管理するための組み込みの操作と関数が用意されています。
- 物理学の法則を尊重する:Q# 量子アルゴリズムは、量子物理学の規則に従う必要があります。 たとえば、量子ビットの状態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;
}
}
コメント (//
) に基づいて、 Q# プログラムは最初に量子ビットを割り当て、量子ビットを重ね合わせに配置する操作を適用し、量子ビットの状態を測定し、量子ビットをリセットして、最後に結果を返します。
この Q# プログラムをコンポーネントに分割しましょう。
ユーザー名前空間
Q# プログラムは、必要に応じて、次のようなユーザー定義の名前空間で開始できます。
namespace Superposition {
// Your code goes here.
}
名前空間は、関連する機能を整理するのに役立ちます。 名前空間は、 Q# プログラムでは optionaL です。つまり、名前空間を定義せずにプログラムを記述できます。
たとえば、この例の 重ね合わせ プログラムは、名前空間なしで次のように記述することもできます。
@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;
}
Note
各 Q# プログラムは 1 つだけ namespace
を持つことができます。 名前空間を指定しない場合、 Q# コンパイラは名前空間としてファイル名を使用します。
入口点
すべての Q# プログラムには、プログラムの開始点であるエントリ ポイントが必要です。 既定では、コンパイラは Q# 、プログラム内の任意の Main()
場所に配置できる操作 (使用可能な場合) からプログラムの実行を開始します。 必要に応じて、この属性を @EntryPoint()
使用して、プログラム内の任意の操作を実行ポイントとして指定できます。
たとえば、 重ね合わせ プログラムでは、 MeasureOneQubit()
演算は、操作定義の前に @EntryPoint()
属性があるため、プログラムのエントリ ポイントです。
@EntryPoint()
operation MeasureOneQubit() : Result {
...
}
ただし、次のようなMeasureOneQubit()
操作の名前をMain()
に変更することで、@EntryPoint()
属性なしでプログラムを記述することもできます。
// 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# には、 Int
、 Double
、 Bool
、 String
、範囲、配列、タプルを定義する型など、ほとんどの言語に共通する組み込み型が用意されています。
Q# には、量子コンピューティングに固有の型も用意されています。 たとえば、 Result
型は量子ビット測定の結果を表し、 Zero
または One
の 2 つの値を持つことができます。
重ね合わせプログラムでは、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);
...
}
量子固有の型のもう 1 つの例として、量子ビットを表す Qubit
型があります。
Q# では、独自のカスタム型を定義することもできます。 詳細については、「 型宣言」を参照してください。
量子ビットの割り当て
Q#では、use
キーワードとQubit
型を使用して量子ビットを割り当てます。 量子ビットは常に$\ket{0}$状態で割り当てられます。
たとえば、 重ね合わせ プログラムは 1 つの量子ビットを定義し、変数 q
に格納します。
// 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.
量子演算
量子ビットを割り当てた後、それを操作と関数に渡すことができます。 操作は、 Q# プログラムの基本的な構成要素です。 Q#演算は、量子サブルーチン、または量子ビット レジスタの状態を変更する量子演算を含む呼び出し可能なルーチンです。
操作を Q# 定義するには、操作の名前、入力、および出力を指定します。 重ね合わせプログラムでは、MeasureOneQubit()
操作はパラメーターを受け取らず、Result
型を返します。
operation MeasureOneQubit() : Result {
...
}
パラメーターを受け取らないし、戻り値を期待しない基本的な例を次に示します。 Unit
の値は、他の言語では NULL
に相当します。
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
Q# 標準ライブラリには、Superposition
プログラムのアダマール演算 (H
) など、量子プログラムで使用できる演算も用意されています。 Z基準で量子ビットを指定すると、H
は量子ビットを等しい重ね合わせ状態に配置し、Zero
またはOne
として測定される確率がそれぞれ50%になります。
量子ビットの測定
量子測定には多くの種類がありますが、 Q# 単一量子ビット (パウリ測定とも呼ばれます) に対する射射測定に焦点を当てています。
Q#において、Measure
演算は、指定されたパウリ基底で1つ以上の量子ビットを測定します。この基底はPauliX
、PauliY
、またはPauliZ
のいずれかになります。 Measure
は、Zero
または One
のいずれかの型を返します。
計算基準 $\lbrace\ket{0},\ket{1}\rbrace$ で測定を実装するには、Pauli Z 基準で量子ビットを測定する演算を使用 M
することもできます。 これにより、M
は Measure([PauliZ], [qubit])
と同等になります。
たとえば、 重ね合わせ プログラムでは、 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!");
注
重ね合わせプログラムには、完全な名前空間を持つimport
ステートメントや呼び出しはありません。 これは、開発環境が自動的に Q# 2 つの名前空間を読み込むからです。このMicrosoft.Quantum.Core
名前空間Microsoft.Quantum.Intrinsic
には、一般的に使用される関数と操作が含まれています。
MResetZ
操作を使用して重ね合わせプログラムを最適化することで、Microsoft.Quantum.Measurement
名前空間を利用できます。 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);
}
Q#と Azure Quantum を使用して量子プログラムを開発する方法について説明します
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# することもできます。 たとえば、 Q# プロジェクトと Python ホスト プログラムを使用して、 Q# 操作を呼び出したり、Jupyter Notebooks で Q# と Python を統合したりできます。 詳細については、「Q#と Python の統合」を参照してください。
%%qsharp コマンド
既定では、 Q# Jupyter Notebook のプログラムでは Python パッケージが使用されます ipykernel
。 ノートブックセルにQ#コードを追加するには、qsharp
Python パッケージで有効化された%%qsharp
コマンドを使用し、その後にQ#コードを入力します。
使用 %%qsharp
する場合は、次の点に注意してください。
import qsharp
を最初に実行して%%qsharp
を有効にする必要があります。%%qsharp
は、そのノートブックセル内に何が表示されるかを決定し、セルのタイプを Python から Q# に変更します。- Python ステートメントを前後に
%%qsharp
配置することはできません。 - Q# のコードは
%%qsharp
の後に Q# 構文に準拠する必要があります。 たとえば、コメントを示すために//
を使用し、コード行を終了するために;
を使用します。
リソースの見積もり
実際の量子ハードウェアで実行する前に、プログラムを既存のハードウェアで実行できるかどうか、および使用するリソースの数を把握する必要があります。
Azure Quantum Resource Estimator を使用すると、アーキテクチャの決定を評価し、量子ビット テクノロジを比較し、特定の量子アルゴリズムを実行するために必要なリソースを決定できます。 事前に定義されたフォールト トレラント プロトコルから選択し、基になる物理量子ビット モデルの前提条件を指定できます。
詳細については、「最初のリソース見積もりの実行」を参照してください。
Note
Azure Quantum Resources Estimator は無料であり、Azure アカウントは必要ありません。
シミュレーションでプログラムを実行する
量子プログラムをコンパイルして実行すると、QDK によって量子シミュレーターのインスタンスが作成され、コードが Q# 渡されます。 シミュレーターでは、Q# コードを使用して量子ビット (量子粒子のシミュレーション) を作成し、変換を適用してその状態を変更します。 その後、シミュレーター内の量子演算の結果がプログラムに返されます。 シミュレーター内で Q# コードを分離すると、アルゴリズムが量子物理学の法則に従うようになり、量子コンピューターで正しく実行できます。
実際の量子ハードウェアにプログラムを送信する
シミュレーションでプログラムをテストしたら、実際の量子ハードウェアで実行できます。 Azure Quantum で量子プログラムを実行するときは、ジョブを作成して実行 します。 Azure Quantum プロバイダーにジョブを送信するには、Azure アカウントと量子ワークスペースが必要です。 量子ワークスペースがない場合は、「Azure Quantum ワークスペースの作成」を参照してください。
Azure Quantum には、最も魅力的で多様な量子ハードウェアがいくつか用意されています。 現在サポートされているハードウェア プロバイダーの一覧については、量子コンピューティング プロバイダーに関する記事を参照してください。
ジョブを送信すると、ジョブのスケジュール、実行、監視など、ジョブのライフサイクルが Azure Quantum によって管理されます。 ジョブの状態を追跡し、Azure Quantum ポータルで結果を表示できます。