Permulaan Pantas
title: Mula pantas description: Panduan mula pantas untuk pakej addon Qiskit pauli-prop
Dalam panduan ini kita menggunakan pakej pauli-prop untuk mensimulasikan secara klasik dinamik masa bagi model Ising berdenyut 10-qubit pada rantai spin 1D.
Sediakan input untuk perambatan Pauli
Hamiltonian yang dipertimbangkan ialah:
dengan menerangkan gandingan spin jiran terdekat, , dan ialah medan melintang global. Penguraian Trotter peringkat pertama bagi pengendali yang berevolusi masa akan dilaksanakan sebagai litar kuantum, , melebihi langkah Trotter. Pemalar gandingan, , akan ditetapkan pada , dan akan ditetapkan pada . Interaksi akan dilaksanakan menggunakan gate Clifford (, , ).
Kita melaksanakan evolusi masa Trotter sebagai litar kuantum dan menggunakan untuk putaran bukan Clifford pada paksi-x. Semakin jauh sudut ini daripada sudut Clifford (contohnya, ), semakin sukar sistem itu untuk disimulasikan bagi kaedah perambatan Pauli.
Untuk pilihan observable, kita mempertimbangkan purata magnetisasi satu-tapak, , dengan ialah bilangan spin.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "pauli_prop": "pauli-prop", "qiskit": "qiskit", "qiskit_aer": "qiskit-aer"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import CouplingMap
num_qubits = 10
coupling_map = CouplingMap.from_line(num_qubits, bidirectional=False)
# Num Trotter steps
num_steps = 20
theta_rx = np.pi / 6
# Average single-site magnetization
observable = (
SparsePauliOp(
[
"I" * iq + "Z" + "I" * (num_qubits - iq - 1)
for iq in range(num_qubits)
]
)
/ num_qubits
)
# Create the Trotter circuit
num_qubits = 10
num_steps = 20
theta_rx = np.pi / 6
circuit = QuantumCircuit(num_qubits)
edges = CouplingMap.from_line(num_qubits, bidirectional=False).get_edges()
for _ in range(num_steps):
circuit.rx(theta_rx, [i for i in range(num_qubits)])
for edge in edges:
circuit.sdg(edge)
circuit.ry(np.pi / 2, edge[1])
circuit.cx(edge[0], edge[1])
circuit.ry(-np.pi / 2, edge[1])
circuit.draw("mpl", fold=-1)
Simulasikan evolusi masa sistem dengan perambatan Pauli
Setelah kita mempunyai litar, , dan observable, , kita boleh mensimulasikan sistem dengan mudah dalam beberapa langkah:
-
Asingkan kepada bahagian Clifford, , dan bahagian bukan Clifford, , supaya menggunakan
evolve_through_cliffords -
Rambatkan melalui , menghasilkan pengendali baharu, , menggunakan
pauli_prop.propagate_through_circuit -
Evolusikan melalui bahagian Clifford litar menggunakan sokongan evolusi Clifford yang terbina dalam Qiskit
-
Anggarkan nilai jangkaan sebagai dengan menjumlahkan pekali dalam yang dikaitkan dengan sebutan Pauli pepenjuru sepenuhnya (sebutan Pauli yang mengandungi
IatauZpada semua qubit). Ingat, ini ialah anggaran kerana kita memangkas sebutan daripada semasa merambatkannya melalui bahagian bukan Clifford litar.
import time
from pauli_prop import evolve_through_cliffords, propagate_through_circuit
cliff, non_cliff = evolve_through_cliffords(circuit)
max_terms_list = [10**i for i in range(8)]
approx_evs = []
durations = []
for max_terms in max_terms_list:
st = time.perf_counter()
evolved_obs = propagate_through_circuit(
observable, non_cliff, max_terms=max_terms, atol=1e-12, frame="h"
)[0]
evolved_obs.paulis = evolved_obs.paulis.evolve(cliff, frame="h")
durations.append(time.perf_counter() - st)
approx_evs.append(
float(evolved_obs.coeffs[~evolved_obs.paulis.x.any(axis=1)].sum())
)
Apabila kita menjalankan pengiraan yang lebih besar, anggaran nilai jangkaan menjadi lebih tepat. Dalam contoh ini, kita menepukan ruang Pauli penuh pada sekitar , yang ditunjukkan oleh lengkung yang mendatar antara dua titik terakhir.
Walaupun plot di bawah menunjukkan penumpuan monotonik, simulasi perambatan Pauli secara amnya tidak menumpu secara monotonik. Adalah tidak luar biasa untuk melihat tingkah laku "berombak" dalam plot jenis ini.
import matplotlib.pyplot as plt
from qiskit_aer import AerSimulator
sim_circ = circuit.copy()
sim_circ.save_statevector()
backend = AerSimulator(method="statevector")
psi = backend.run(sim_circ).result().data()["statevector"]
exact_ev = psi.expectation_value(observable)
ax1 = plt.gca()
ax1.plot(max_terms_list, approx_evs, marker="o", label="Approximate")
ax1.axhline(exact_ev, linestyle="--", color="green", label="Exact")
ax1.set_xscale("log")
ax1.set_xlabel("# terms kept")
ax1.set_ylabel(r"$\frac{1}{N} \sum_{i=1}^{N} \langle z_i \rangle$")
ax2 = ax1.twinx()
ax2.plot(
max_terms_list, durations, marker=".", label="Runtime", color="orange"
)
ax2.set_ylabel("Runtime (s)", color="orange")
ax2.set_yscale("log")
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(handles1 + handles2, labels1 + labels2, loc="lower right")
plt.title(f"Simulating {num_steps}-step 1D Ising Model")
Text(0.5, 1.0, 'Simulating 20-step 1D Ising Model')

