ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

จำลองโมเดล kicked-Ising 127 ควอนตัมบิต

ในคู่มือนี้ เราใช้แพ็กเกจ pauli-prop เพื่อจำลองพลวัตเชิงเวลาของโมเดล kicked-Ising 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 คือสนามตามขวางส่วนกลาง การแยกส่วนแบบ Trotter อันดับหนึ่งของตัวดำเนินการที่วิวัฒน์ตามเวลาจะถูกสร้างเป็นควอนตัมเซอร์กิต UU ตลอด 2020 ขั้นของ Trotter ค่าคงที่การคับปลิง JJ จะถูกกำหนดเป็น J=−π2J=-\frac{\pi}{2} ทำให้ UU เป็น Clifford ทุกครั้งที่ hmod  π2=0h\mod\frac{\pi}{2}=0

ขั้นตอนการทำงาน:

  • สร้างควอนตัมเซอร์กิตที่สร้างโมเดล Ising แบบ Trotter

    • แปรค่า hh ระหว่างจุด Clifford คือ 0.00.0 และ π2\frac{\pi}{2}
  • เลือกไซต์ตรงกลางของแลตทิซ (ควอนตัมบิต 6262) และประมาณค่าแมกนีไทเซชันหลังผ่าน 2020 ขั้นของ Trotter สำหรับแต่ละเซอร์กิต

  • สังเกตแมกนีไทเซชันที่ลดลงจาก 1.01.0 ไปเป็น 0.00.0 เมื่อ hh เคลื่อนจากจุด Clifford หนึ่งไปอีกจุดหนึ่ง

สร้างเซอร์กิต​

ก่อนอื่น เราใช้ FakeSherbrooke จาก qiskit-ibm-runtime เพื่อหาดัชนีขอบของ coupling map ของ QPU Eagle 127 ควอนตัมบิต เมื่อได้ดัชนีขอบแล้ว เราสร้างเซอร์กิต Trotter สำหรับค่า hh ต่าง ๆ ที่ต้องการจำลอง เซอร์กิตเหล่านี้จะสร้าง Trotterization อันดับหนึ่งของแฮมิลโทเนียนโดยใช้ 20 ขั้นของ Trotter และเกต 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

เพื่อศึกษาแมกนีไทเซชันระหว่างจุด Clifford เราแพร็อพาเกต 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' เพื่อระบุว่าต้องการวิวัฒน์ออบเซอร์เวเบิลในกรอบ Heisenberg (U†OUU^{\dagger}OU) ใช้ frame=s สำหรับวิวัฒนาการแบบ 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

แสดงผลเป็นภาพ​

สุดท้าย เราพล็อตแมกนีไทเซชันเป็นฟังก์ชันของ hh เมื่อ h=0h=0 เซอร์กิตจะไม่กระทบสถานะเริ่มต้นในฐานการคำนวณ และเรารู้ว่า ⟨0∣O∣0⟩=1.0\langle0|O|0\rangle = 1.0 เมื่อ hh ห่างจาก 00 มากขึ้น แมกนีไทเซชันจะลดลงแบบเอกภาพจนกระทั่ง hh ถึงมุม Clifford ถัดไป π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