Simulează un model Ising cu lovituri (kicked Ising) cu 127 de qubiți
În acest ghid folosim pachetul pauli-prop pentru a simula clasic dinamica în timp a unui model Ising cu lovituri (kicked Ising) cu 127 de qubiți pe o rețea heavy-hex și pentru a aproxima magnetizarea pe un singur situs, . Hamiltonianul considerat este:
unde descrie cuplajul dintre spinii vecini cei mai apropiați, , iar este câmpul transversal global. O descompunere Trotter de ordinul întâi a operatorului evoluat în timp va fi implementată ca un circuit cuantic, , pe parcursul a de pași Trotter. Constanta de cuplaj, , va fi fixată la , astfel încât este Clifford oricând .
Flux de lucru:
-
Creează circuite cuantice care implementează modelul Ising Trotterizat
- Variază între punctele Clifford, și
-
Alege un situs din mijlocul rețelei (qubitul ) și estimează magnetizarea după de pași Trotter pentru fiecare circuit
-
Observă cum magnetizarea scade de la la pe măsură ce se deplasează de la un punct Clifford la altul
Creează circuitele
Mai întâi, folosim FakeSherbrooke din qiskit-ibm-runtime pentru a obține indicii muchiilor hărții de cuplaj a QPU-ului Eagle cu 127 de qubiți. Odată ce avem indicii muchiilor, creăm circuitele Trotter pentru valorile variabile ale lui pe care vrem să le simulăm. Circuitele vor implementa o Trotterizare de ordinul întâi a Hamiltonianului folosind 20 de pași Trotter și 5420 de porți.
# 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)
Simulează dinamica în timp cu propagare Pauli
În continuare specificăm observabila, , pe care vrem să o măsurăm. În acest caz, estimăm .
Pentru a studia magnetizarea între punctele Clifford, propagăm aproximativ până la începutul circuitului, , rezultând o nouă observabilă, .
În timpul propagării, numărul de termeni din observabila evoluată crește exponențial cu numărul de porți, deci de obicei este necesar să limităm cât de mult poate crește. Aici limităm numărul de termeni din la și trunchiem termenii cu coeficienți mai mici decât . Trunchierea termenilor introduce o anumită eroare.
Odată ce avem , putem estima ușor valoarea de așteptare, , însumând coeficienții termenilor diagonali din (termeni formați doar din I sau Z pe toți qubiții).
Setăm frame='h' pentru a specifica că vrem să evoluăm observabila în cadrul Heisenberg (). Folosește frame=s pentru evoluția 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
Vizualizează
În final, reprezentăm grafic magnetizarea în funcție de . Când , circuitul nu afectează starea inițială în baza computațională, și știm că . Pe măsură ce se îndepărtează de , magnetizarea scade monoton până când ajunge la următorul unghi Clifford, , iar magnetizarea converge la .
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>]
