を使用して量子回路図を視覚化する方法 Q#
量子回路図は、量子演算を視覚的に表現したものです。 量子プログラムを通る量子ビットの流れを示します。これには、ゲートとそれらに適用される測定値が含まれます。
この記事では、Visual Studio Code または Jupyter Notebook を使用して、量子アルゴリズムを量子回路図で視覚的に表現する方法について説明します。
量子回路図の規則の詳細については、「量子回路の規則」を参照してください。
前提条件
VS Code
最新バージョンの Visual Studio Code または VS Code on the Web を開きます。
Azure Quantum 開発キット拡張機能の最新バージョン。
最新の Azure Quantum
qsharp
およびazure-quantum
Python パッケージ。python -m pip install --upgrade qsharp azure-quantum
Jupyter Notebook
最新バージョンの Visual Studio Code または VS Code on the Web を開きます。
Azure Quantum Development Kit、Python、Jupyter 拡張機能がインストールされた VS Code。
最新の Azure Quantum
qsharp
とqsharp-widgets
パッケージ、およびipykernel
パッケージ。python -m pip install --upgrade qsharp qsharp-widgets ipykernel
Visual Studio Code を使用した量子回路
Visual Studio Code でプログラムの量子回路を視覚化するには、次の Q# 手順に従います。 量子回路図の規則の詳細については、「量子回路の規則」を参照してください。
プログラムの回路図の Q# 表示
Visual Studio Code でファイルを Q# 開くか、量子 サンプルのいずれかを読み込みます。
プログラムのQ#量子回路を視覚化するには、[表示 ] -> [コマンド パレット] を選択し、「回線」と入力します。このオプションを選択すると、[回線の表示] オプションがQ#表示されます。 前
Main()
のコマンドの一覧から [回線] をクリックすることもできます。回路ウィンドウに回路が Q# 表示されます。 たとえば、次の回路は、量子ビットを重ね合わせに入れて測定する演算に対応しています。 この回路図は、|0⟩ 状態に初期化された 1 つの量子ビット レジスタを示しています。 次に、ハダマールゲート Hが量子ビットに適用され、続いて 測定演算が行われ、これがメーターシンボルで表されます。
操作の回路図の表示
量子回路は、1 回 Q# の操作で視覚化できます。 これを行うには、操作宣言の 上に表示されるコード レンズの [回線 ] ボタンをクリックします。
デバッグ時の回路図の表示
プログラムをデバッグするときにQ#、プログラムの現在の状態に基づいて量子回路を視覚化できます。
前の コード レンズ コマンドの一覧から [デバッグ ] ボタンを
Main()
選択します。左側の [実行とデバッグ] ビューで、[変数] ウィンドウの [Quantum Circuit] セクションを展開して、プログラムをステップ実行するときに回線を表示します。
コードをステップ実行し、さまざまなポイントにブレークポイントを設定して、プログラムの実行時に回線の更新を確認できます。
現在の量子回路が回路パネルにQ#表示されます。 この回路図は、シミュレーターの現在の状態、つまり、現在の実行ポイントまで適用されたゲートを表します。
Jupyter Notebook を使用した量子回路
Jupyter Notebook では、パッケージを使用して量子回路を qsharp-widgets
視覚化できます。 このパッケージは、SVG 画像として量子回路図をレンダリングするウィジェットを提供します。
Visual Studio Code で、[表示] > [コマンド パレット] を選択して、[作成:新しい Jupyter Notebook] を選択します。
ノートブックの最初のセルで、次のコードを実行してモジュールをQ#インポートします。
import qsharp
新しいセル を追加し、コードを入力します Q# 。 たとえば、次のコードはベル状態を準備します。
%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
この関数を
dump_circuit()
使用すると、プログラムの現在の状態に基づいて量子回路を表示できます。 たとえば、次の図は、|0⟩ 状態に初期化された 2 つの量子ビット レジスタを示しています。 次に、最初の量子ビットにハダマール ゲート H が適用されます。 その後、CNOT ゲートは、ドットとして表されるコントロールとして最初の量子ビットを使用し、2 番目の量子ビット ( targetX として表される) を使用して適用されます。qsharp.dump_circuit()
q_0 ── H ──── ● ── q_1 ───────── X ──
パッケージを使用
qsharp-widgets
して、量子回路を SVG 画像として視覚化できます。 この場合、CNOT ゲートは、2 つの量子ビットを結ぶ線として表され、制御量子ビットにはドットが、量子ビットには周接十字が target 付いています。 詳細については、「量子回路の規則」を参照してください。from qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
エントリ式の回路図の表示
エントリ式を呼び出qsharp.circuit()
して引数として渡すことで、エントリ式を持つ任意のプログラムの回路図を生成できます。
たとえば、新しいセルを追加し、GHZ 状態を準備する次のコードをコピーします。
%%qsharp import Std.Diagnostics.*; import Std.Measurement.*; operation GHZSample(n: Int) : Result[] { use qs = Qubit[n]; H(qs[0]); ApplyToEach(CNOT(qs[0], _), qs[1...]); let results = MeasureEachZ(qs); ResetAll(qs); return results; }
新しいセルを追加し、次のコードを実行して回線を視覚化します。 たとえば、3 量子ビットの GHZ 状態を準備します。
Circuit(qsharp.circuit("GHZSample(3)"))
量子ビットを使用した操作の回路図の表示
量子ビットまたは量子ビットの配列を受け取る任意の操作の回路図を生成できます。 この図は、入力量子ビットと同数のワイヤに加えて、操作内に割り当てられる追加の量子ビットを示しています。 演算が量子ビット (Qubit[])
の配列を受け取ると、回路は配列を 2 量子ビットのレジスタとして示します。
新しいセルを追加し、次の例をコピーします。 このコードは、猫の状態を準備します。
%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
新しいセルを追加し、次のコードを実行して、操作の回線を
PrepareCatState
視覚化します。Circuit(qsharp.circuit(operation="PrepareCatState"))
回路図に影響する条件
量子回路を視覚化する場合、次の条件が回路図の視覚化に影響を与える可能性があります。
動的回路
回路図は、プログラム内 Q# のすべての古典的なロジックを実行し、割り当てられた量子ビットまたは適用されたゲートを追跡することによって生成されます。 ループと条件は、古典的な値のみを処理する限りサポートされます。
ただし、量子ビットの測定結果を使用するループと条件式を含むプログラムは、回路図で表す方が複雑です。 たとえば、次のような式があります。
if (M(q) == One) {
X(q)
}
ゲートは測定結果に条件付きであるため、簡単な回路図では表すことができません。 このような回路は動的回路と呼ばれます。
量子シミュレーターでプログラムを実行し、ゲートの適用に応じてトレースすることで、動的回路の回路図を生成できます。 シミュレーションの実行中に量子ビットとゲートがトレースされるため、これはトレース モードと呼ばれます。
トレース回路の欠点は、単一のシミュレーションに対して測定結果と結果ゲート アプリケーションのみをキャプチャすることです。 上記の例では、測定結果が Zero
次の場合、図にゲートが X
表示されません。 シミュレーションの別の実行では、少し異なる回路が表示される場合があります。
Target プロファイル
現在選択されている target プロファイルは、回路図の生成方法に影響します。 Target プロファイルは、ハードウェアの target 機能と、量子プログラムに課される制限を指定するために使用されます。
プロファイルが target Unrestricted または QIR Adaptive RI に設定されている場合、回路図には、プログラムで呼び出される量子演算がQ#示されます。 プロファイルが target QIR ベースに設定されている場合、プログラムがこのtargetプロファイルを使用して Azure Quantum に送信された場合にハードウェアで実行される量子操作が回路図に示されます。
Note
VS Code でプロファイルをtarget選択するには、[表示] -> [コマンド パレット] を選択し、[Azure Quantum QIR target プロファイルの設定] を選択Q#します。 またはドロップダウン リストから選択
QIR base
QIR Adaptive RI
unrestricted
できます。Python でプロファイルを target 選択するには、呼び出し
qsharp.init(target_profile=qsharp.TargetProfile.Base)
、qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)
またはqsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
.
具体的には、ゲート分解が適用され、結果として得られる回路がハードウェアの機能と互換性を target 持つことになります。 これらは、コードの生成と Azure Quantum への送信時に適用されるのと同じ分解です。
たとえば、量子ビットと量子ビットの配列を測定する次 Q# のプログラムを考えてみましょう。
import Std.Measurement.*; operation Main() : (Result, Result[]) { // The `M` operation performs a measurement of a single qubit in the // computational basis, also known as the Pauli Z basis. use q = Qubit(); let result = M(q); Reset(q); // The `MeasureEachZ` operation measures each qubit in an array in the // computational basis and returns an array of `Result` values. use qs = Qubit[2]; let results = MeasureEachZ(qs); return (result, results); }
プロファイルが Unrestricted または QIR Adaptive RI に設定されている場合target、回線に表示されるゲートは、プログラムで呼び出される量子演算に正確にQ#対応します。
プロファイルが target QIR ベースの場合、回線の外観は異なります。 ベース プロファイル targets では測定後の量子ビットの再利用が許可されないため、代わりに、エンタングルされた量子ビットに対して測定が実行されるようになりました。 操作は基本プロファイルでサポートされているゲートではないので
Reset
、削除されます。 結果の回線は、このプログラムがこのプロファイルを使用して Azure Quantum に送信された場合にハードウェアで実行される内容と target 一致します。