Lumaktaw sa pangunahing nilalaman
Ang proyektong ito ay nasa beta. Nakakita ng bug? Mag-bukas ng GitHub issue. May tanong o ideya? Magtanong sa Discussions — gusto naming marinig ang iyong feedback!
Gaano kaganda ang kalidad ng pagsasalin sa pahinang ito?

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, ⟨Z62⟩\langle Z_{62} \rangle. Ang Hamiltonian na isinasaalang-alang ay:

H=−J∑⟨i,j⟩ZiZj+h∑iXiH = -J\sum\limits_{\langle i,j \rangle} Z_iZ_j + h\sum\limits_iX_i

kung saan ang J>0J>0 ay naglalarawan ng coupling ng mga magkatabing spin, i<ji<j, at ang hh ay ang global na transverse field. Ang first-order na Trotter decomposition ng time-evolved na operator ay ipapatupad bilang isang quantum circuit, UU, sa loob ng 2020 Trotter step. Ang coupling constant, JJ, ay ifi-fix sa J=−π2J=-\frac{\pi}{2} kaya't Clifford ang UU tuwing hmod  π2=0h\mod\frac{\pi}{2}=0.

Daloy ng trabaho:

  • Gumawa ng mga quantum circuit na nagpapatupad ng Trotterized na Ising model

    • Baryahin ang hh sa pagitan ng mga Clifford point, 0.00.0 at π2\frac{\pi}{2}
  • Pumili ng site sa gitna ng lattice (qubit 6262) at tantiyahin ang magnetization pagkatapos ng 2020 Trotter step para sa bawat circuit

  • Obserbahan ang pagbaba ng magnetization mula 1.01.0 hanggang 0.00.0 habang lumilipat ang hh 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 hh 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, OO, na gusto nating sukatin. Sa kasong ito, tinatantiya natin ang ⟨Z62⟩\langle Z_{62} \rangle.

Para pag-aralan ang magnetization sa pagitan ng mga Clifford point, tinatantiya nating i-propagate ang OO pabalik sa simula ng circuit, UU, na magreresulta sa bagong observable, O′≈U†OUO^\prime \approx U^{\dagger}OU.

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 O′O^\prime sa 10510^5 at tinatanggal ang mga term na may coefficient na mas maliit sa 10−510^{-5}. Nagdudulot ng kaunting error ang pag-truncate ng mga term. Kapag mayroon na tayong O′O^\prime, madali nating matatantiya ang expectation value, ⟨0∣U†OU∣0⟩=⟨0∣O′∣0⟩\langle0|U^{\dagger}OU|0\rangle = \langle0|O^\prime|0\rangle, sa pamamagitan ng pagsasama-sama ng mga coefficient ng mga diagonal na term sa O′O^\prime (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 (U†OUU^{\dagger}OU). Gamitin ang frame=s para sa Schrödinger evolution (UOU†UOU^{\dagger}).

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 hh. Kapag h=0h=0, hindi naaapektuhan ng circuit ang initial state sa computational basis, at alam nating ⟨0∣O∣0⟩=1.0\langle0|O|0\rangle = 1.0. Habang lumalayo ang hh mula sa 00, monotonic na bumababa ang magnetization hanggang umabot ang hh sa susunod na Clifford angle, π2\frac{\pi}{2}, at nagko-converge ang magnetization sa 00.

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>]

Output of the previous code cell