Lewati ke konten utama
Proyek ini masih dalam tahap beta. Menemukan bug? Buat isu GitHub. Punya pertanyaan atau ide? Tanya di Discussions — kami sangat menghargai masukan kamu!
Bagaimana kualitas terjemahan di halaman ini?

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, ⟨Z62⟩\langle Z_{62} \rangle. Hamiltonian yang dipakai adalah:

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

dengan J>0J>0 menggambarkan kopling antar spin tetangga terdekat, i<ji<j, dan hh adalah medan transversal global. Dekomposisi Trotter orde pertama dari operator yang berevolusi waktu akan diimplementasikan sebagai circuit kuantum, UU, selama 2020 langkah Trotter. Konstanta kopling, JJ, akan dibuat tetap di J=−π2J=-\frac{\pi}{2} sehingga UU adalah Clifford kapan pun hmod  π2=0h\mod\frac{\pi}{2}=0.

Alur kerja:

  • Buat circuit kuantum yang mengimplementasikan model Ising Trotter

    • Variasikan hh di antara titik-titik Clifford, 0.00.0 dan π2\frac{\pi}{2}
  • Pilih satu situs di tengah kisi (qubit 6262) dan estimasi magnetisasi setelah 2020 langkah Trotter untuk setiap circuit

  • Amati magnetisasi turun dari 1.01.0 ke 0.00.0 saat hh 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 hh 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, OO, yang ingin diukur. Dalam kasus ini, kita mengestimasi ⟨Z62⟩\langle Z_{62} \rangle.

Untuk mempelajari magnetisasi di antara titik-titik Clifford, kita mempropagasikan OO secara aproksimasi ke awal circuit, UU, sehingga menghasilkan observable baru, O′≈U†OUO^\prime \approx U^{\dagger}OU.

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 O′O^\prime sampai 10510^5 dan memotong suku dengan koefisien lebih kecil dari 10−510^{-5}. Pemotongan suku menimbulkan sedikit error. Setelah punya O′O^\prime, kita bisa dengan mudah mengestimasi nilai ekspektasi, ⟨0∣U†OU∣0⟩=⟨0∣O′∣0⟩\langle0|U^{\dagger}OU|0\rangle = \langle0|O^\prime|0\rangle, dengan menjumlahkan koefisien suku-suku diagonal di O′O^\prime (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 (U†OUU^{\dagger}OU). Pakai frame=s untuk evolusi Schrödinger (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

Visualisasi​

Terakhir, kita plot magnetisasi sebagai fungsi dari hh. Saat h=0h=0, circuit tidak memengaruhi keadaan awal dalam basis komputasi, dan kita tahu ⟨0∣O∣0⟩=1.0\langle0|O|0\rangle = 1.0. Saat hh bergerak menjauh dari 00, magnetisasi meluruh secara monoton sampai hh mencapai sudut Clifford berikutnya, π2\frac{\pi}{2}, dan magnetisasi konvergen ke 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