Simulasikan model kicked-Ising 127-qubit
Di panduan ini kita pakai paket pauli-prop untuk mensimulasikan secara klasik dinamika waktu model kicked-Ising 127-qubit pada kisi heavy-hex dan mengaproksimasi magnetisasi satu situs, . Hamiltonian yang dipakai adalah:
dengan menggambarkan kopling antar spin tetangga terdekat, , dan adalah medan transversal global. Dekomposisi Trotter orde pertama dari operator yang berevolusi waktu akan diimplementasikan sebagai circuit kuantum, , selama langkah Trotter. Konstanta kopling, , akan dibuat tetap di sehingga adalah Clifford kapan pun .
Alur kerja:
-
Buat circuit kuantum yang mengimplementasikan model Ising Trotter
- Variasikan di antara titik-titik Clifford, dan
-
Pilih satu situs di tengah kisi (qubit ) dan estimasi magnetisasi setelah langkah Trotter untuk setiap circuit
-
Amati magnetisasi turun dari ke saat bergerak dari satu titik Clifford ke titik Clifford lainnya
Buat circuit
Pertama, kita pakai FakeSherbrooke dari qiskit-ibm-runtime untuk mendapatkan indeks edge dari coupling map QPU Eagle 127-qubit. Setelah punya indeks edge, kita buat circuit Trotter untuk berbagai nilai yang ingin kita simulasikan. Circuit ini mengimplementasikan Trotterisasi orde pertama dari Hamiltonian memakai 20 langkah Trotter dan 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)
Simulasikan dinamika waktu dengan Pauli propagation
Selanjutnya, kita tentukan observable, , yang ingin diukur. Dalam kasus ini, kita mengestimasi .
Untuk mempelajari magnetisasi di antara titik-titik Clifford, kita mempropagasikan secara aproksimasi ke awal circuit, , sehingga menghasilkan observable baru, .
Selama propagasi, jumlah suku dalam observable yang berevolusi tumbuh secara eksponensial terhadap jumlah gate, jadi biasanya perlu membatasi seberapa besar ia boleh tumbuh. Di sini, kita membatasi jumlah suku di sampai dan memotong suku dengan koefisien lebih kecil dari . Pemotongan suku menimbulkan sedikit error.
Setelah punya , kita bisa dengan mudah mengestimasi nilai ekspektasi, , dengan menjumlahkan koefisien suku-suku diagonal di (suku yang hanya terdiri dari I atau Z pada semua qubit).
Kita set frame='h' untuk menentukan bahwa kita ingin mengevolusikan observable dalam kerangka Heisenberg (). Pakai frame=s untuk evolusi Schrödinger ().
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
Visualisasi
Terakhir, kita plot magnetisasi sebagai fungsi dari . Saat , circuit tidak memengaruhi keadaan awal dalam basis komputasi, dan kita tahu . Saat bergerak menjauh dari , magnetisasi meluruh secara monoton sampai mencapai sudut Clifford berikutnya, , dan magnetisasi konvergen ke .
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>]
