Simulasikan model Ising berdenyut 127-qubit
Dalam panduan ini kita menggunakan pakej pauli-prop untuk mensimulasikan secara klasik dinamik masa bagi model Ising berdenyut 127-qubit pada kekisi heavy-hex dan menganggarkan magnetisasi satu-tapak, . 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 supaya ialah Clifford pada bila-bila masa .
Aliran kerja:
-
Cipta litar kuantum yang melaksanakan model Ising Trotter
- Ubah antara titik Clifford, dan
-
Pilih satu tapak di tengah kekisi (qubit ) dan anggarkan magnetisasi selepas langkah Trotter bagi setiap litar
-
Perhatikan magnetisasi menurun daripada kepada apabila bergerak dari satu titik Clifford ke titik yang lain
Cipta litar
Pertama, kita menggunakan FakeSherbrooke daripada qiskit-ibm-runtime untuk mendapatkan indeks tepi bagi peta gandingan QPU Eagle 127-qubit. Setelah kita mempunyai indeks tepi, kita mencipta litar Trotter untuk pelbagai nilai yang ingin kita simulasikan. Litar tersebut akan melaksanakan Trotterisasi peringkat pertama bagi Hamiltonian menggunakan 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 dinamik masa dengan perambatan Pauli
Seterusnya, kita menentukan observable, , yang ingin kita ukur. Dalam kes ini, kita menganggarkan .
Untuk mengkaji magnetisasi antara titik Clifford, kita merambatkan secara anggaran ke permulaan litar, , menghasilkan observable baharu, .
Semasa perambatan, bilangan sebutan dalam observable yang berevolusi bertambah secara eksponen dengan bilangan gate, jadi biasanya perlu mengehadkan seberapa besar ia boleh berkembang. Di sini, kita mengehadkan bilangan sebutan dalam kepada dan memangkas sebutan dengan pekali lebih kecil daripada . Pemangkasan sebutan menyebabkan sedikit ralat.
Setelah kita mempunyai , kita boleh menganggarkan nilai jangkaan dengan mudah, , dengan menjumlahkan pekali sebutan pepenjuru dalam (sebutan yang hanya terdiri daripada I atau Z pada semua qubit).
Kita menetapkan frame='h' untuk menentukan bahawa kita ingin mengevolusikan observable dalam rangka kerja Heisenberg (). Gunakan 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
Akhir sekali, kita memplot magnetisasi sebagai fungsi . Apabila , litar tidak menjejaskan keadaan awal dalam asas pengiraan, dan kita tahu . Apabila bergerak lebih jauh daripada , magnetisasi mereput secara monotonik sehingga mencapai sudut Clifford seterusnya, , dan magnetisasi menumpu kepada .
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>]
