マルチプロダクト公式によるハミルトニアンダイナミクスのトロッター誤差の低減
このノートブックでは、**マルチプロダクト公式(MPF)**を使用して、実際に実行する最も深いトロッター回路によって生じるトロッター誤差よりも低い、観測量に対するトロッター誤差を達成する方法を学びます。 Qiskit パターンのステップを通じて実践します。
- ステップ 1: 量子 問題へのマッピング
- 問題のハミルトニアンを初期化する
- MPF を使用してトロッター化された時間発展回路を生成する
- ステップ 2: 問題の最適化
- ここでは GenericBackendV2 向けに回路をトランスパイルします
- ステップ 3: 実験の実行
- このノートブックでは簡便さのために StatevectorEstimator を使用します
- ステップ 4: 結果の再構成
- MPF の期待値を計算する
ステップ 1: 量子問題へのマッピング
1a: ハミルトニアンの設定
10 サイトの直線上のイジングモデルを使用します。
ここで は 2 つのサイト間の結合強度、 は外部磁場です。 qiskit_addon_utils パッケージは、さまざまな目的のための再利用可能な機能を提供します。
その qiskit_addon_utils.problem_generators モジュールは、指定された接続グラフ上でハイゼンベルク型ハミルトニアンを生成する関数を提供します。 このグラフは rustworkx.PyGraph または CouplingMap のいずれかを使用でき、Qiskit 中心のワークフローで簡単に利用できます。
以下では、CouplingMap.from_line メソッドを使用して 10 Qubit の単純な直線を作成します。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-mpf qiskit-addon-utils rustworkx scipy
from qiskit.transpiler import CouplingMap
# Generate some coupling map to use for this example
coupling_map = CouplingMap.from_line(10, bidirectional=False)
from rustworkx.visualization import graphviz_draw
graphviz_draw(coupling_map.graph, method="circo")
次に、指定された接続性と所望の定数を持つ SparsePauliOp を生成します。
from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian
# Get a qubit operator describing the Ising field model
hamiltonian = generate_xyz_hamiltonian(
coupling_map,
coupling_constants=(0.0, 0.0, 1.0),
ext_magnetic_field=(0.4, 0.0, 0.0),
)
print(hamiltonian)
SparsePauliOp(['IIIIIIIZZI', 'IIIIIZZIII', 'IIIZZIIIII', 'IZZIIIIIII', 'IIIIIIIIZZ', 'IIIIIIZZII', 'IIIIZZIIII', 'IIZZIIIIII', 'ZZIIIIIIII', 'IIIIIIIIIX', 'IIIIIIIIXI', 'IIIIIIIXII', 'IIIIIIXIII', 'IIIIIXIIII', 'IIIIXIIIII', 'IIIXIIIIII', 'IIXIIIIIII', 'IXIIIIIIII', 'XIIIIIIIII'],
coeffs=[1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j,
1. +0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j,
0.4+0.j, 0.4+0.j, 0.4+0.j])
測定する観測量は全磁化であり、以下のように単純に構成できます。
from qiskit.quantum_info import SparsePauliOp
L = coupling_map.size()
observable = SparsePauliOp.from_sparse_list([("Z", [i], 1 / L / 2) for i in range(L)], num_qubits=L)
print(observable)
SparsePauliOp(['IIIIIIIIIZ', 'IIIIIIIIZI', 'IIIIIIIZII', 'IIIIIIZIII', 'IIIIIZIIII', 'IIIIZIIIII', 'IIIZIIIIII', 'IIZIIIIIII', 'IZIIIIIIII', 'ZIIIIIIIII'],
coeffs=[0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j,
0.05+0.j, 0.05+0.j, 0.05+0.j])
1b: マルチプロダクット公式
MPF は、複数の回路実行の重 み付き組み合わせを通じてハミルトニアンダイナミクスのトロッター誤差を低減します。
より具体的には、MPF を次のように定義します。
ここで は重み係数、 は 個のトロッターステップを含むプロダクット公式 で初期状態を発展させることにより得られる純粋状態に対応する密度行列、 は MPF を構成するプロダクット公式の数のインデックスです。
ここで重要な点は、残りのトロッター誤差が最大の 値を単純に使用した場合に得られるトロッター誤差よりも小さいことです。
MPF の有用性は 2 つの視点から見ることができます。
- 実行可能なトロッターステップの固定バジェットに対して、合計のトロッター誤差がより小さい結果を得ることができます。
- 深い回路をもたらすトロッターステップ数に対して、MPF を使用して同様のトロッター誤差をもたらす複数の短い深さの回路を見つけて実行できます。