انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

محاكاة نموذج Ising المدفوع بـ 127 كيوبت

في هذا الدليل نستخدم حزمة pauli-prop لمحاكاة الديناميكا الزمنية لنموذج 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 للحصول على فهارس الحواف لخريطة الاقتران الخاصة بـ QPU من نوع Eagle بـ 127 كيوبت. وبعد الحصول على فهارس الحواف، ننشئ دوائر Trotter لقيم hh المتنوعة التي نريد محاكاتها. ستنفّذ الدوائر تحليل Trotter من الرتبة الأولى للهاميلتونيان باستخدام 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)

حاكِ الديناميكا الزمنية باستخدام انتشار باولي​

بعد ذلك، نحدد القابل للرصد، 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' لتحديد أننا نريد تطوير القابل للرصد في إطار هايزنبرغ (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 إلى زاوية 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