QDK Python パッケージを使用して量子シミュレーションを実行する

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および 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# プログラムを実行するには、次の手順に従います。

  1. VS Code で、[ 表示>コマンド パレット] を選択します。

  2. 「Create: New Jupyter Notebook」と入力します。 空のノートブック ファイルが新しいタブで開きます。

  3. 最初のセルで、qdk パッケージから qsharp モジュールをインポートします。

    from qdk import qsharp
    
  4. 新しいセルで、 %%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);
    }
    
  5. 新しいセルを作成します。 スパース シミュレーターで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およびNeutralAtomBackend API は、特に中性原子量子コンピューターでのシミュレーション用です。 詳細については、「 ニュートラルアトム デバイス シミュレーターの概要」を参照してください。

たとえば、この 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)