Microsoft Quantum Development Kit (QDK) Python パッケージには、量子プログラムのテストと開発に使用できるローカル量子シミュレーターが含まれています。 この記事では、シミュレーターをインストールし、QIRまたはJupyter NotebookでPython、Q#、OpenQASM、およびQiskitプログラムを実行する方法について説明します。
QDK Python パッケージには、次の 4 つのプライマリ シミュレーターが含まれています。
- スパース シミュレーター
- スタビライザー シミュレーター
- GPU シミュレーター
- CPU シミュレーター
QDK量子シミュレーターの詳細については、「QDKの量子シミュレーターの概要」を参照してください。
Visual Studio Code (VS Code) のOpenQASM拡張機能でQDKまたはQ#プログラムを直接実行するには、「Visual Studio Code のQDK拡張機能で量子シミュレーションを実行する」を参照してください。
前提条件
この記事のJupyter Notebookの例に従うには、次のツールをインストールしてください。
- Python 3.10 以降と pip を備えた Python 環境
- 最新バージョンのVisual Studio Code (VS Code)
- VS Code の Python 拡張機能 と Jupyter 拡張機能 の最新バージョン
シミュレーターをインストールする
Pythonおよび Jupyter Notebook で量子シミュレーターを使用するには、jupyter extra を指定して、最新バージョンの qdkPython パッケージをインストールします。
pip install --upgrade "qdk[jupyter]"
シミュレーターには追加のjupyterは必要ありませんが、その extra により、Jupyter Notebookでシミュレーション結果を視覚化するためのqdk.widgetsモジュールが追加されます。
使用する量子プログラミング フレームワークと Python API に基づいてシミュレーターを選択します。
スパース シミュレーターを呼び出す
スパース シミュレーターは、 Q#、 OpenQASM、および Qiskit プログラムをサポートします。 次の表は、各フレームワークで qdk パッケージで 10 ショットを実行する方法を示しています。
| プログラミング フレームワーク | Python API (アプリケーション・プログラミング・インターフェース) | 呼び出しの例 |
|---|---|---|
| Q# | qsharp.run |
qsharp.run("MyQsharpProgram()", shots=10) |
| OpenQASM | openqasm.run |
openqasm.run(my_qasm_program, shots=10) |
| Qiskit | qiskit.QSharpBackend |
QSharpBackend().run(my_qiskit_program, shots=10) |
Note
スパース シミュレーターは、OpenQASM プログラムと noise プログラムについては Q# パラメーターを通じてノイズ モデルをサポートしますが、Qiskit プログラムについてはサポートしません。
たとえば、VS Code の Jupyter ノートブックで Bell ペア Q# プログラムを実行するには、次の手順に従います。
VS Code で、[ 表示>コマンド パレット] を選択します。
「Create: New Jupyter Notebook」と入力します。 空のノートブック ファイルが新しいタブで開きます。
最初のセルで、
qdkパッケージからqsharpモジュールをインポートします。from qdk import qsharp新しいセルで、
%%qsharpマジック コマンドを使用して、 Q# コードを記述します。%%qsharp operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); PrepareBellPair(q1, q2); (MResetZ(q1), MResetZ(q2)) } operation PrepareBellPair(q1 : Qubit, q2 : Qubit) : Unit { H(q1); CNOT(q1, q2); }新しいセルを作成します。 スパース シミュレーターでQ# プログラムを実行するには、
runモジュールからqsharp関数を呼び出し、ショットの数を指定します。qsharp.run("Main()", shots=10)
スタビライザー シミュレーターを呼び出す
スタビライザー シミュレータは、Clifford が支配的な回路を効率的に実行します。 また、安定分岐では、$T$ ゲートや $T^\dagger$ ゲート、任意の角度の Clifford回転など、限られた数のPauli 以外の操作もサポートします。 分岐の数は、非Clifford 操作の数に応じて指数関数的に増加する可能性があるため、実質的な非Clifford 進化を伴う回路にはフルステート シミュレーターを使用します。
スタビライザー シミュレーターは、 Q#、 OpenQASM、 Qiskit、および QIR プログラムをサポートします。 次の表は、各フレームワークで 10 ショットを実行する方法を示しています。
| プログラミング フレームワーク | Python API (アプリケーション・プログラミング・インターフェース) | 呼び出しの例 |
|---|---|---|
| Q# | qsharp.run |
qsharp.run("MyQsharpProgram()", type="stabilizer", shots=10) |
| OpenQASM | openqasm.run |
openqasm.run(my_qasm_program, type="stabilizer", shots=10) |
| Qiskit | qiskit.NeutralAtomBackend |
NeutralAtomBackend().run(my_qiskit_program, simulator_type="stabilizer", shots=10) |
| QIR | simulation.NeutralAtomDevice |
simulation.NeutralAtomDevice().simulate(my_qir, type="stabilizer", shots=10) |
| QIR | simulation.run_qir |
simulation.run_qir(my_qir, type="stabilizer", shots=10) |
NeutralAtomDeviceおよびNeutralAtomBackendAPI は、特に中性原子量子コンピューターでのシミュレーション用です。 詳細については、「 ニュートラルアトム デバイス シミュレーターの概要」を参照してください。
たとえば、この Python コードは、スタビライザー シミュレーターで非 Clifford $T$ ゲートを持つ OpenQASM プログラムを実行します。
from qdk.openqasm import run
qasm_code = """
include "stdgates.inc";
qubit[1] q;
bit[1] result;
h q[0];
t q[0];
h q[0];
result = measure q;
"""
run(qasm_code, type="stabilizer", shots=1000)
Note
"stabilizer" と "clifford" の両方で、スタビライザー シミュレーターが選択されています。 API は、パラメーターが type か simulator_typeかを決定します。
$T$ ゲートは、スタビライザー分岐を作成します。 最終的な測定では、これらの分岐間の干渉が測定対象となります。
GPU シミュレーターと CPU シミュレーターを呼び出す
GPUおよびCPU シミュレーターは、QiskitおよびQIRプログラムをサポートします。 次の表は、各フレームワークで GPU パッケージを使用して qdk シミュレーターで 10 ショットを実行する方法を示しています。
CPU シミュレーターを使用するには、シミュレーター型パラメーター内の gpu を cpu に置き換えます。
| プログラミング フレームワーク | Python API (アプリケーション・プログラミング・インターフェース) | 呼び出しの例 |
|---|---|---|
| Qiskit | qiskit.NeutralAtomBackend |
NeutralAtomBackend().run(my_qiskit_program, simulator_type="gpu", shots=10) |
| QIR | simulation.NeutralAtomDevice |
simulation.NeutralAtomDevice().simulate(my_qir, type="gpu", shots=10) |
| QIR | simulation.run_qir |
simulation.run_qir(my_qir, type="gpu", shots=10) |
たとえば、次のPythonコードは、単純なOpenQASMプログラムをQIRに変換し、QIRシミュレーター上でGPUを実行します。
from qdk.openqasm import compile
from qdk.simulation import run_qir
qasm_code = """
include "stdgates.inc";
qubit[2] q;
reset q;
h q[0];
cx q[0], q[1];
bit c = measure q[1];
"""
qir = compile(qasm_code)
run_qir(qir, type="gpu", shots=10)