Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

Змоделюй 127-кубітну модель Ізінга з імпульсним збудженням

У цьому посібнику ми використовуємо пакет pauli-prop, щоб класично змоделювати часову динаміку 127-кубітної моделі Ізінга з імпульсним збудженням на решітці heavy-hex і наближено оцінити намагніченість на одному вузлі, ⟨Z62⟩\langle Z_{62} \rangle. Розглядається такий гамільтоніан:

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

де J>0J>0 описує зв'язок між найближчими сусідніми спінами, i<ji<j, а hh — глобальне поперечне поле. Тротерівський розклад першого порядку оператора часової еволюції буде реалізовано як квантову схему, UU, на 2020 тротерівських кроках. Константу зв'язку, JJ, буде зафіксовано як J=−π2J=-\frac{\pi}{2}, так що UU є кліффордовою щоразу, коли hmod  π2=0h\mod\frac{\pi}{2}=0.

Робочий процес:

  • Створи квантові схеми, що реалізують тротеризовану модель Ізінга

    • Змінюй hh між точками Кліффорда, 0.00.0 і π2\frac{\pi}{2}
  • Обери вузол посередині решітки (кубіт 6262) і оціни намагніченість після 2020 тротерівських кроків для кожної схеми

  • Спостерігай, як намагніченість спадає від 1.01.0 до 0.00.0, коли hh переходить від однієї точки Кліффорда до іншої

Створення схем​

Спершу ми використовуємо FakeSherbrooke з qiskit-ibm-runtime, щоб отримати індекси ребер для карти зв'язків 127-кубітного QPU Eagle. Отримавши індекси ребер, ми створюємо тротерівські схеми для різних значень hh, які хочемо змоделювати. Схеми реалізуватимуть тротеризацію гамільтоніана першого порядку з 20 тротерівськими кроками та 5420 гейтами.

# 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)

Змоделюй часову динаміку за допомогою Pauli propagation​

Далі ми задаємо спостережувану, OO, яку хочемо виміряти. У цьому випадку ми оцінюємо ⟨Z62⟩\langle Z_{62} \rangle.

Щоб дослідити намагніченість між точками Кліффорда, ми наближено поширюємо OO на початок схеми, UU, отримуючи нову спостережувану, O′≈U†OUO^\prime \approx U^{\dagger}OU.

Під час поширення кількість доданків в еволюціонованій спостережуваній зростає експоненційно залежно від кількості гейтів, тому зазвичай потрібно обмежувати, наскільки вона може зрости. Тут ми обмежуємо кількість доданків у O′O^\prime значенням 10510^5 і відкидаємо доданки з коефіцієнтами, меншими за 10−510^{-5}. Відкидання доданків вносить певну похибку. Отримавши O′O^\prime, ми можемо легко оцінити математичне сподівання, ⟨0∣U†OU∣0⟩=⟨0∣O′∣0⟩\langle0|U^{\dagger}OU|0\rangle = \langle0|O^\prime|0\rangle, підсумувавши коефіцієнти діагональних доданків у O′O^\prime (доданки, що складаються лише з I або Z на всіх кубітах).

Ми задаємо frame='h', щоб указати, що хочемо еволюціонувати спостережувану в представленні Гейзенберга (U†OUU^{\dagger}OU). Використовуй frame=s для еволюції Шредінгера (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

Візуалізація​

Нарешті, ми будуємо графік намагніченості як функції від hh. Коли h=0h=0, схема не впливає на початковий стан в обчислювальному базисі, і ми знаємо, що ⟨0∣O∣0⟩=1.0\langle0|O|0\rangle = 1.0. Коли hh віддаляється від 00, намагніченість монотонно спадає, доки hh не досягне наступного кута Кліффорда, π2\frac{\pi}{2}, і намагніченість не збігається до 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