Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

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

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 menerangkan gandingan spin jiran terdekat, i<ji<j, dan hh ialah medan melintang global. Penguraian Trotter peringkat pertama bagi pengendali yang berevolusi masa akan dilaksanakan sebagai litar kuantum, UU, melebihi 2020 langkah Trotter. Pemalar gandingan, JJ, akan ditetapkan pada J=−π2J=-\frac{\pi}{2} supaya UU ialah Clifford pada bila-bila masa hmod  π2=0h\mod\frac{\pi}{2}=0.

Aliran kerja:

  • Cipta litar kuantum yang melaksanakan model Ising Trotter

    • Ubah hh antara titik Clifford, 0.00.0 dan π2\frac{\pi}{2}
  • Pilih satu tapak di tengah kekisi (qubit 6262) dan anggarkan magnetisasi selepas 2020 langkah Trotter bagi setiap litar

  • Perhatikan magnetisasi menurun daripada 1.01.0 kepada 0.00.0 apabila hh 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 hh 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, OO, yang ingin kita ukur. Dalam kes ini, kita menganggarkan ⟨Z62⟩\langle Z_{62} \rangle.

Untuk mengkaji magnetisasi antara titik Clifford, kita merambatkan OO secara anggaran ke permulaan litar, UU, menghasilkan observable baharu, O′≈U†OUO^\prime \approx U^{\dagger}OU.

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 O′O^\prime kepada 10510^5 dan memangkas sebutan dengan pekali lebih kecil daripada 10−510^{-5}. Pemangkasan sebutan menyebabkan sedikit ralat. Setelah kita mempunyai O′O^\prime, kita boleh menganggarkan nilai jangkaan dengan mudah, ⟨0∣U†OU∣0⟩=⟨0∣O′∣0⟩\langle0|U^{\dagger}OU|0\rangle = \langle0|O^\prime|0\rangle, dengan menjumlahkan pekali sebutan pepenjuru dalam O′O^\prime (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 (U†OUU^{\dagger}OU). Gunakan 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​

Akhir sekali, kita memplot magnetisasi sebagai fungsi hh. Apabila h=0h=0, litar tidak menjejaskan keadaan awal dalam asas pengiraan, dan kita tahu ⟨0∣O∣0⟩=1.0\langle0|O|0\rangle = 1.0. Apabila hh bergerak lebih jauh daripada 00, magnetisasi mereput secara monotonik sehingga hh mencapai sudut Clifford seterusnya, π2\frac{\pi}{2}, dan magnetisasi menumpu kepada 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