I-simulate ang 127-qubit na kicked-Ising model
Sa gabay na ito, gagamitin natin ang pauli-prop package para i-simulate nang classical ang time dynamics ng isang 127-qubit na kicked-Ising model sa heavy-hex lattice at tantiyahin ang single-site magnetization, . Ang Hamiltonian na isinasaalang-alang ay:
kung saan ang ay naglalarawan ng coupling ng mga magkatabing spin, , at ang ay ang global na transverse field. Ang first-order na Trotter decomposition ng time-evolved na operator ay ipapatupad bilang isang quantum circuit, , sa loob ng Trotter step. Ang coupling constant, , ay ifi-fix sa kaya't Clifford ang tuwing .
Daloy ng trabaho:
-
Gumawa ng mga quantum circuit na nagpapatupad ng Trotterized na Ising model
- Baryahin ang sa pagitan ng mga Clifford point, at
-
Pumili ng site sa gitna ng lattice (qubit ) at tantiyahin ang magnetization pagkatapos ng Trotter step para sa bawat circuit
-
Obserbahan ang pagbaba ng magnetization mula hanggang habang lumilipat ang mula sa isang Clifford point patungo sa isa pa
Gumawa ng mga circuit
Una, gagamitin natin ang FakeSherbrooke mula sa qiskit-ibm-runtime para makuha ang mga edge index para sa coupling map ng 127-qubit na Eagle QPU. Kapag mayroon na tayong mga edge index, gagawa tayo ng mga Trotter circuit para sa iba't ibang halaga ng na gusto nating i-simulate. Ipapatupad ng mga circuit ang first-order na Trotterization ng Hamiltonian gamit ang 20 Trotter step at 5420 gate.
# 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_ibm_runtime": "qiskit-ibm-runtime"}
_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_ibm_runtime.fake_provider import FakeSherbrooke
# Get the edges in the device coupling map
backend = FakeSherbrooke()
edges = backend.coupling_map.get_edges()
# Num Trotter steps
num_steps = 20
# Create Trotter circuits with varying global fields
hs = [i * np.pi / 32 for i in range(17)]
circuits = []
for h in hs:
circuit = QuantumCircuit(backend.num_qubits)
for _ in range(num_steps):
circuit.rx(h, [i for i in range(backend.num_qubits)])
for edge in edges:
circuit.rzz(-np.pi / 2, edge[0], edge[1])
circuits.append(circuit)
I-simulate ang time dynamics gamit ang Pauli propagation
Susunod, tutukuyin natin ang observable, , na gusto nating sukatin. Sa kasong ito, tinatantiya natin ang .
Para pag-aralan ang magnetization sa pagitan ng mga Clifford point, tinatantiya nating i-propagate ang pabalik sa simula ng circuit, , na magreresulta sa bagong observable, .
Habang nagpo-propagate, exponential na lumalaki ang bilang ng mga term sa evolved na observable ayon sa bilang ng mga gate, kaya karaniwang kailangang limitahan kung gaano ito kalaki. Dito, nililimitahan natin ang bilang ng mga term sa sa at tinatanggal ang mga term na may coefficient na mas maliit sa . Nagdudulot ng kaunting error ang pag-truncate ng mga term.
Kapag mayroon na tayong , madali nating matatantiya ang expectation value, , sa pamamagitan ng pagsasama-sama ng mga coefficient ng mga diagonal na term sa (mga term na binubuo lamang ng I o Z sa lahat ng qubit).
Itinakda natin ang frame='h' para tukuyin na gusto nating i-evolve ang observable sa Heisenberg framework (). Gamitin ang frame=s para sa Schrödinger evolution ().
import time
from pauli_prop import propagate_through_circuit
from qiskit.quantum_info import Pauli, SparsePauliOp
# Z_62 observable
id_pauli = Pauli("I" * backend.num_qubits)
observable = SparsePauliOp(id_pauli.dot(Pauli("Z"), [62]))
# Estimate the single-site magnetization for varying magnetic fields
times = []
approx_evs = []
for circuit in circuits:
st = time.perf_counter()
propagated_obs = propagate_through_circuit(
observable, circuit, 100_000, 1e-5, frame="h"
)[0]
times.append(time.perf_counter() - st)
approx_evs.append(
float(
propagated_obs.coeffs[~propagated_obs.paulis.x.any(axis=1)].sum()
)
)
print(f"Finished {len(circuits)} simulations in {sum(times):.0f}s")
Finished 17 simulations in 494s
I-visualize
Panghuli, ipi-plot natin ang magnetization bilang function ng . Kapag , hindi naaapektuhan ng circuit ang initial state sa computational basis, at alam nating . Habang lumalayo ang mula sa , monotonic na bumababa ang magnetization hanggang umabot ang sa susunod na Clifford angle, , at nagko-converge ang magnetization sa .
import matplotlib.pyplot as plt
plt.xlabel(r"$R_x$ angle $\theta_h$")
plt.ylabel(r"$\langle Z_{62} \rangle$")
plt.plot(hs, approx_evs, marker="o")
[<matplotlib.lines.Line2D at 0x123f68b00>]
