انتقل إلى المحتوى الرئيسي

هاميلتونيات الكيمياء الكمية

لنبدأ بنظرة عامة مختصرة على دور الهاميلتونيات في خوارزمية VQE.

نظرة عامة على الهاميلتوني في VQE

تقود الدكتورة فيكتوريا ليبينسكا جولةً في الهاميلتونيات وكيفية تعيينها للاستخدام في الحوسبة الكمية.

المراجع

المقالات التالية مُشار إليها في الفيديو أعلاه.

إعداد الهاميلتونيات للكيمياء الكمية

من الخطوات الأولى الجيدة في تطبيق الحوسبة الكمية على مسألة كيميائية هو تعريف هاميلتوني للنظام المعني. سنقتصر هنا على هاميلتونيات الكيمياء الكمية، إذ تتطلب تلك الهاميلتونيات بعض التعيين الخاص بأنظمة الفيرميونات المتطابقة.

بصفتك متخصصاً في الكيمياء الكمية، ربما لديك بالفعل برنامجك المفضل لنمذجة الجزيئات، الذي يمكنه توليد هاميلتوني يصف نظامك المعني. سنستخدم هنا كوداً مبنياً كلياً على PySCF وnumpy وQiskit. لكن عملية إعداد الهاميلتوني تنطبق على الحلول الجاهزة أيضاً. الفرق الوحيد بين هذا النهج والبرامج الأخرى هو اختلافات طفيفة في الصياغة؛ وتُعالَج بعض منها في الفقرة الفرعية "البرامج الخارجية" لتسهيل دمج سير العمل الحالية.

يتضمن توليد هاميلتوني كيميائي كمي للاستخدام على وحدات المعالجة الكمية (QPUs) في IBM Quantum® الخطوات التالية:

  1. تعريف جزيئتك (الهندسة الفراغية، والدوران، والفضاء النشط، وغيره)
  2. توليد الهاميلتوني الفيرميوني (عوامل الإنشاء والإفناء)
  3. التعيين من الهاميلتوني الفيرميوني إلى عامل بوزوني (في هذا السياق، باستخدام عوامل باولي)
  4. في حال استخدام برامج خارجية: التعامل مع أي تعارضات في الصياغة بين البرنامج المولِّد وQiskit

يُكتب الهاميلتوني الفيرميوني بدلالة عوامل فيرميونية، ويأخذ بعين الاعتبار تحديداً كون الإلكترونات فيرميونات غير قابلة للتمييز. هذا يعني أنها تخضع لإحصاءات مختلفة كلياً عن الكيوبتات البوزونية القابلة للتمييز. ومن هنا تأتي ضرورة عملية التعيين.

من يعرفون هذه العمليات مسبقاً يمكنهم على الأرجح تخطي هذا القسم. الهدف:

الهدف النهائي هو الحصول على هاميلتوني بالشكل:

# Added by doQumentation — required packages for this notebook
!pip install -q numpy openfermion pyscf qiskit
H = [(1, "XX"), (1, "YY"), (1, "ZZ")]
print(H)
[(1, 'XX'), (1, 'YY'), (1, 'ZZ')]

أو

from qiskit.quantum_info import SparsePauliOp

H = SparsePauliOp(["XX", "YY", "ZZ"], coeffs=[1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j])
print(H)
SparsePauliOp(['XX', 'YY', 'ZZ'],
coeffs=[1.+0.j, 1.+0.j, 1.+0.j])

نبدأ باستيراد بعض الحزم:

import numpy as np
from pyscf import ao2mo, gto, mcscf, scf
  1. تعريف الجزيء

هنا نُحدد خصائص الجزيء المعني. في هذا المثال، اخترنا الهيدروجين ثنائي الذرة (لأن الهاميلتونيات الناتجة قصيرة بما يكفي للعرض). يحتوي إطار عمل بايثون لمحاكاة الكيمياء (PySCF) على مجموعة واسعة من وحدات البنية الإلكترونية التي يمكن استخدامها، من بين أمور أخرى، لتوليد هاميلتونيات جزيئية مناسبة للحوسبة الكمية. يُعدّ دليل البداية السريعة لـ PySCF مرجعاً ممتازاً للوصف الكامل لجميع المتغيرات والوظائف. سنقدم نظرة عامة مبسطة جداً، إذ ستكون هذه المعلومات مألوفة للكثيرين منكم. لفهم أعمق، تفضل بزيارة موقع PySCF. باختصار:

distance يمكن استخدامه للجزيئات ثنائية الذرة، أو تحديد الإحداثيات الديكارتية لكل ذرة مباشرةً. الوحدات بالأنغستروم.

gto يولّد المدارات من النوع الغاوسي.

basis يشير إلى الدوال المستخدمة لنمذجة المدارات الجزيئية. هنا 'sto-6g' هي أساس دنيا شائع، سُمّي لملاءمة مدارات نوع سلاتر باستخدام 6 مدارات غاوسية أولية.

spin قيمة صحيحة تدل على عدد الإلكترونات غير المزدوجة (تساوي 2S2S). لاحظ أن بعض البرامج تستخدم مضاعف التعددية بدلاً من ذلك (2S+12S+1).

charge شحنة الجزيء.

symmetry - مجموعة تناظر النقطة للجزيء، إما بتحديدها بسلسلة نصية أو الكشف عنها تلقائياً بضبط "symmetry = True". هنا "Dooh" هي مجموعة التناظر المناسبة للجزيئات ثنائية الذرة المكوّنة من نوع ذرة واحد.

distance = 0.735
a = distance / 2
mol = gto.Mole()
mol.build(
verbose=0,
atom=[
["H", (0, 0, -a)],
["H", (0, 0, a)],
],
basis="sto-6g",
spin=0,
charge=0,
symmetry="Dooh",
)
<pyscf.gto.mole.Mole at 0x7fc718f07610>

ضع في اعتبارك أنه يمكن وصف الطاقة الكلية (التي تشمل طاقة التنافر النووي فضلاً عن الطاقة الإلكترونية)، أو إجمالي طاقة المدارات الإلكترونية، أو طاقة مجموعة فرعية من المدارات الإلكترونية (مع تجميد المجموعة المكمّلة). في الحالة المحددة لـ H2\text{H}_2، لاحظ الطاقات المختلفة أدناه، وتحقق أن الطاقة الكلية مطروحاً منها طاقة التنافر النووي تُعطي فعلاً الطاقة الإلكترونية:

mf = scf.RHF(mol)
mf.scf()

print(
mf.energy_nuc(),
mf.energy_elec()[0],
mf.energy_tot(),
mf.energy_tot() - mol.energy_nuc(),
)
0.7199689944489797 -1.8455976628764188 -1.125628668427439 -1.8455976628764188
active_space = range(mol.nelectron // 2 - 1, mol.nelectron // 2 + 1)
  1. توليد الهاميلتوني الفيرميوني

scf يشير إلى مجموعة واسعة من طرق الحقل الذاتي المتسق.

rhf كما في mf = scf.RHF(mol)، هو حلّال يستخدم حساب هارتري-فوك المقيّد. نواة هذا الحساب (E أدناه) هي الطاقة الكلية، شاملةً التنافر النووي والمدارات الجزيئية.

mcscf حزمة حقول ذاتية متسقة متعددة التهيئات.

ao2mo تحويل من المدارات الذرية إلى المدارات الجزيئية.

نستخدم أيضاً المتغيرات التالية:

ncas: عدد المدارات في فضاء النشاط الكامل

nelecas: عدد الإلكترونات في فضاء النشاط الكامل

E1 = mf.kernel()
mx = mcscf.CASCI(mf, ncas=2, nelecas=(1, 1))
mo = mx.sort_mo(active_space, base=0)
E2 = mx.kernel(mo)[:2]

نريد الحصول على هاميلتوني، وكثيراً ما يُقسَّم إلى: طاقة نواة إلكترونية (ecore، غير مشمولة في التصغير)، وعوامل أحادية الإلكترون (h1e)، وطاقات ثنائية الإلكترون (h2e). يتم استخراجها صراحةً في السطرين الأخيرين أدناه.

h1e, ecore = mx.get_h1eff()
h2e = ao2mo.restore(1, mx.get_h2eff(), mx.ncas)

هذه الهاميلتونيات حالياً عوامل فيرميونية (إنشاء وإفناء)، قابلة للتطبيق على أنظمة الفيرميونات (غير القابلة للتمييز)، وبالتالي خاضعة لمناهضة التناظر تحت التبادل. هذا يُنتج إحصاءات مختلفة عما ينطبق على نظام بوزوني أو قابل للتمييز. لتشغيل الحسابات على وحدات معالجة IBM Quantum الكمية، نحتاج إلى عامل بوزوني يصف الطاقة. عادةً ما تُكتب نتيجة هذا التعيين بدلالة عوامل باولي، لكونها إيرميتية وأحادية في آنٍ واحد. ثمة عدة تعيينات يمكن استخدامها. أحد أبسطها هو تحويل جوردان-ويغنر.

  1. تعيين الهاميلتوني

تجدر الإشارة إلى توفر أدوات كثيرة لتعيين هاميلتوني كيميائي إلى آخر مناسب للتشغيل على حاسوب كمي. هنا ننفّذ تعيين جوردان-ويغنر مباشرةً باستخدام PySCF وnumpy وQiskit فحسب. نُعلّق أدناه على اعتبارات الصياغة للحلول الأخرى. تساعدنا دالة Cholesky في الحصول على تحليل منخفض الرتبة لحدود ثنائية الإلكترون في الهاميلتوني.

def cholesky(V, eps):
# see https://arxiv.org/pdf/1711.02242.pdf section B2
# see https://arxiv.org/abs/1808.02625
# see https://arxiv.org/abs/2104.08957
no = V.shape[0]
chmax, ng = 20 * no, 0
W = V.reshape(no**2, no**2)
L = np.zeros((no**2, chmax))
Dmax = np.diagonal(W).copy()
nu_max = np.argmax(Dmax)
vmax = Dmax[nu_max]
while vmax > eps:
L[:, ng] = W[:, nu_max]
if ng > 0:
L[:, ng] -= np.dot(L[:, 0:ng], (L.T)[0:ng, nu_max])
L[:, ng] /= np.sqrt(vmax)
Dmax[: no**2] -= L[: no**2, ng] ** 2
ng += 1
nu_max = np.argmax(Dmax)
vmax = Dmax[nu_max]
L = L[:, :ng].reshape((no, no, ng))
print(
"accuracy of Cholesky decomposition ",
np.abs(np.einsum("prg,qsg->prqs", L, L) - V).max(),
)
return L, ng

تستبدل الدالتان identity وcreators_destructors عوامل الإنشاء والإفناء في الهاميلتوني الفيرميوني بعوامل باولي؛ وتستخدم creators_destructors تعيين جوردان-ويغنر.

def identity(n):
return SparsePauliOp.from_list([("I" * n, 1)])

def creators_destructors(n, mapping="jordan_wigner"):
c_list = []
if mapping == "jordan_wigner":
for p in range(n):
if p == 0:
ell, r = "I" * (n - 1), ""
elif p == n - 1:
ell, r = "", "Z" * (n - 1)
else:
ell, r = "I" * (n - p - 1), "Z" * p
cp = SparsePauliOp.from_list([(ell + "X" + r, 0.5), (ell + "Y" + r, -0.5j)])
c_list.append(cp)
else:
raise ValueError("Unsupported mapping.")
d_list = [cp.adjoint() for cp in c_list]
return c_list, d_list

أخيراً، تستخدم build_hamiltonian دوال cholesky وidentity وcreators_destructors لإنشاء الهاميلتوني النهائي المناسب للتشغيل على حاسوب كمي.

def build_hamiltonian(ecore: float, h1e: np.ndarray, h2e: np.ndarray) -> SparsePauliOp:
ncas, _ = h1e.shape

C, D = creators_destructors(2 * ncas, mapping="jordan_wigner")
Exc = []
for p in range(ncas):
Excp = [C[p] @ D[p] + C[ncas + p] @ D[ncas + p]]
for r in range(p + 1, ncas):
Excp.append(
C[p] @ D[r]
+ C[ncas + p] @ D[ncas + r]
+ C[r] @ D[p]
+ C[ncas + r] @ D[ncas + p]
)
Exc.append(Excp)

# low-rank decomposition of the Hamiltonian
Lop, ng = cholesky(h2e, 1e-6)
t1e = h1e - 0.5 * np.einsum("pxxr->pr", h2e)

H = ecore * identity(2 * ncas)
# one-body term
for p in range(ncas):
for r in range(p, ncas):
H += t1e[p, r] * Exc[p][r - p]
# two-body term
for g in range(ng):
Lg = 0 * identity(2 * ncas)
for p in range(ncas):
for r in range(p, ncas):
Lg += Lop[p, r, g] * Exc[p][r - p]
H += 0.5 * Lg @ Lg

return H.chop().simplify()

أخيراً، نستخدم build_hamiltonian لبناء هاميلتوني الكيوبتات من عوامل باولي عبر تحويل جوردان-ويغنر. يُعطينا هذا أيضاً دقة تحليل تشولسكي المستخدم.

H = build_hamiltonian(ecore, h1e, h2e)
print(H)
accuracy of Cholesky decomposition  2.220446049250313e-16
SparsePauliOp(['IIII', 'IIIZ', 'IZII', 'IIZI', 'ZIII', 'IZIZ', 'IIZZ', 'ZIIZ', 'IZZI', 'ZZII', 'ZIZI', 'YYYY', 'XXYY', 'YYXX', 'XXXX'],
coeffs=[-0.09820182+0.j, -0.1740751 +0.j, -0.1740751 +0.j, 0.2242933 +0.j,
0.2242933 +0.j, 0.16891402+0.j, 0.1210099 +0.j, 0.16631441+0.j,
0.16631441+0.j, 0.1210099 +0.j, 0.17504456+0.j, 0.04530451+0.j,
0.04530451+0.j, 0.04530451+0.j, 0.04530451+0.j])

يُظهر دفتر الجزيئات النموذجي هذا الإعداد والهاميلتونيات لعدة جزيئات بمستويات تعقيد متفاوتة؛ مع بعض التعديل الطفيف، يجب أن يُمكّنك هذا من دراسة معظم الجزيئات الصغيرة.

دعونا نلفت الانتباه بإيجاز إلى نقطتَين مهمتَين عند بناء العوامل الفيرميونية لجزيء ما. مع تغيّر نوع الجزيء تتغيّر التناظرات. وبالمثل، يتغيّر عدد المدارات ذات التناظرات المختلفة، كالـ "A1" ذي التناظر الأسطواني. هذه التغييرات واضحة حتى مع التوسيع البسيط إلى LiH، كما يُرى هنا:

distance = 1.56
mol = gto.Mole()
mol.build(
verbose=0,
atom=[["Li", (0, 0, 0)], ["H", (0, 0, distance)]],
basis="sto-6g",
spin=0,
charge=0,
symmetry="Coov",
)
mf = scf.RHF(mol)
E1 = mf.kernel()

# %% ----------------------------------------------------------------------------------------------

mx = mcscf.CASCI(mf, ncas=5, nelecas=(1, 1))
cas_space_symmetry = {"A1": 3, "E1x": 1, "E1y": 1}
mo = mcscf.sort_mo_by_irrep(mx, mf.mo_coeff, cas_space_symmetry)
E2 = mx.kernel(mo)[:2]
h1e, ecore = mx.get_h1eff()
h2e = ao2mo.restore(1, mx.get_h2eff(), mx.ncas)

تجدر الإشارة أيضاً إلى أنه يمكن أن تضيع الحدسية بسرعة حين نتعامل مع الهاميلتوني الناتج. فهاميلتوني LiH (باستخدام محوّل جوردان-ويغنر) يتألف بالفعل من 276 حداً.

len(build_hamiltonian(ecore, h1e, h2e))
accuracy of Cholesky decomposition  1.1102230246251565e-16
276

حين تساور الشك بشأن التناظرات، يمكن أيضاً توليد بعض معلومات التناظر للجزيء بضبط symmetry = True وverbose = 4:

distance = 1.56
mol = gto.Mole()
mol.build(
verbose=4,
atom=[["Li", (0, 0, 0)], ["H", (0, 0, distance)]],
basis="sto-6g",
spin=0,
charge=0,
symmetry=True,
)
System: uname_result(system='Linux', node='IBM-R912JTRT', release='5.10.102.1-microsoft-standard-WSL2', version='#1 SMP Wed Mar 2 00:30:59 UTC 2022', machine='x86_64')  Threads 16
Python 3.11.12 (main, May 16 2025, 02:33:32) [GCC 11.4.0]
numpy 2.3.1 scipy 1.16.0 h5py 3.14.0
Date: Mon Jun 30 12:56:55 2025
PySCF version 2.9.0
PySCF path /home/porter284/.pyenv/versions/3.11.12/lib/python3.11/site-packages/pyscf

[CONFIG] conf_file None
[INPUT] verbose = 4
[INPUT] num. atoms = 2
[INPUT] num. electrons = 4
[INPUT] charge = 0
[INPUT] spin (= nelec alpha-beta = 2S) = 0
[INPUT] symmetry True subgroup None
[INPUT] Mole.unit = angstrom
[INPUT] Symbol X Y Z unit X Y Z unit Magmom
[INPUT] 1 Li 0.000000000000 0.000000000000 0.000000000000 AA 0.000000000000 0.000000000000 0.000000000000 Bohr 0.0
[INPUT] 2 H 0.000000000000 0.000000000000 1.560000000000 AA 0.000000000000 0.000000000000 2.947972754321 Bohr 0.0

nuclear repulsion = 1.01764848253846
point group symmetry = Coov
symmetry origin: [0. 0. 0.73699319]
symmetry axis x: [1. 0. 0.]
symmetry axis y: [0. 1. 0.]
symmetry axis z: [0. 0. 1.]
num. orbitals of irrep A1 = 4
num. orbitals of irrep E1x = 1
num. orbitals of irrep E1y = 1
number of shells = 4
number of NR pGTOs = 36
number of NR cGTOs = 6
basis = sto-6g
ecp = {}
CPU time: 9.85
<pyscf.gto.mole.Mole at 0x7fc719f94850>

من بين المعلومات المفيدة الأخرى، يُعطي هذا point group symmetry = Coov وأيضاً عدد المدارات في كل تمثيل اختزالي.

point group symmetry = Coov
num. orbitals of irrep A1 = 4
num. orbitals of irrep E1x = 1
num. orbitals of irrep E1y = 1
number of shells = 4

هذا لا يخبرك بالضرورة بعدد المدارات التي تريد إدراجها في فضاءك النشط، لكنه يساعدك على رؤية المدارات الموجودة وتناظراتها.

تحديد التناظر والمدارات مفيد في الغالب، لكن يمكنك أيضاً تحديد عدد المدارات التي تريد إدراجها. تأمّل حالة الإيثين أدناه. باستخدام verbose = 4، يمكننا طباعة تناظرات المدارات المختلفة:

# Replace these variables with correct distances:
a = 1
b = 1
c = 1

# Build
mol = gto.Mole()
mol.build(
verbose=4,
atom=[
["C", (0, 0, a)],
["C", (0, 0, -a)],
["H", (0, c, b)],
["H", (0, -c, b)],
["H", (0, c, -b)],
["H", (0, -c, -b)],
],
basis="sto-6g",
spin=0,
charge=0,
symmetry=True,
)
System: uname_result(system='Linux', node='IBM-R912JTRT', release='5.10.102.1-microsoft-standard-WSL2', version='#1 SMP Wed Mar 2 00:30:59 UTC 2022', machine='x86_64')  Threads 16
Python 3.11.12 (main, May 16 2025, 02:33:32) [GCC 11.4.0]
numpy 2.3.1 scipy 1.16.0 h5py 3.14.0
Date: Mon Jun 30 12:57:07 2025
PySCF version 2.9.0
PySCF path /home/porter284/.pyenv/versions/3.11.12/lib/python3.11/site-packages/pyscf

[CONFIG] conf_file None
[INPUT] verbose = 4
[INPUT] num. atoms = 6
[INPUT] num. electrons = 16
[INPUT] charge = 0
[INPUT] spin (= nelec alpha-beta = 2S) = 0
[INPUT] symmetry True subgroup None
[INPUT] Mole.unit = angstrom
[INPUT] Symbol X Y Z unit X Y Z unit Magmom
[INPUT] 1 C 0.000000000000 0.000000000000 1.000000000000 AA 0.000000000000 0.000000000000 1.889726124565 Bohr 0.0
[INPUT] 2 C 0.000000000000 0.000000000000 -1.000000000000 AA 0.000000000000 0.000000000000 -1.889726124565 Bohr 0.0
[INPUT] 3 H 0.000000000000 1.000000000000 1.000000000000 AA 0.000000000000 1.889726124565 1.889726124565 Bohr 0.0
[INPUT] 4 H 0.000000000000 -1.000000000000 1.000000000000 AA 0.000000000000 -1.889726124565 1.889726124565 Bohr 0.0
[INPUT] 5 H 0.000000000000 1.000000000000 -1.000000000000 AA 0.000000000000 1.889726124565 -1.889726124565 Bohr 0.0
[INPUT] 6 H 0.000000000000 -1.000000000000 -1.000000000000 AA 0.000000000000 -1.889726124565 -1.889726124565 Bohr 0.0

nuclear repulsion = 29.3377079104231
point group symmetry = D2h
symmetry origin: [0. 0. 0.]
symmetry axis x: [0. 1. 0.]
symmetry axis y: [1. 0. 0.]
symmetry axis z: [-0. -0. -1.]
num. orbitals of irrep Ag = 4
num. orbitals of irrep B2g = 2
num. orbitals of irrep B3g = 1
num. orbitals of irrep B1u = 4
num. orbitals of irrep B2u = 1
num. orbitals of irrep B3u = 2
number of shells = 10
number of NR pGTOs = 84
number of NR cGTOs = 14
basis = sto-6g
ecp = {}
CPU time: 9.92
<pyscf.gto.mole.Mole at 0x7fc719fa9290>

نحصل على:

num. orbitals of irrep Ag = 4

num. orbitals of irrep B2g = 2

num. orbitals of irrep B3g = 1

num. orbitals of irrep B1u = 4

num. orbitals of irrep B2u = 1

num. orbitals of irrep B3u = 2

لكن بدلاً من تحديد جميع المدارات بالتناظر، يمكننا ببساطة كتابة:

active_space = range(mol.nelectron // 2 - 2, mol.nelectron // 2 + 2)

في هذا النهج، نختار عدة مدارات قريبة من مستوى الامتلاء (التكافؤ وغير المشغول). هنا تم اختيار 5 مدارات لإدراجها في الفضاء النشط (المدار السادس حتى العاشر).

print(
mol.nelectron // 2 - 2,
mol.nelectron // 2 + 2,
)
6 10
  1. البرامج الخارجية

ثمة عدة حزم برمجية طُوِّرت للكيمياء الكمية، بعضها يوفر محوّلات متعددة وأدوات لتقييد الفضاءات النشطة. الخطوات الموصوفة أعلاه عامة وتنطبق على البرامج الخارجية أيضاً. غير أن تلك البرامج قد تُعيد الهاميلتونيات بتنسيق لا يقبله Qiskit. فمثلاً، تُعيد بعض البرامج الهاميلتونيات بالشكل:

H = -0.042 [] + -0.045 [X0 X1 Y2 Y3] + ... + 0.178 [Z0] + ... + 0.176 [Z2 Z3] + -0.243 [Z3]

لاحظ تحديداً أن البوابات مرقّمة وأن عوامل الهوية غير مُظهَرة. هذا يتعارض مع الهاميلتونيات المستخدمة في Qiskit، التي تكتب الحد [Z2 Z3] كـ ZZII (الكيوبتان 0 و1 تعمل عليهما عوامل الهوية، والكيوبتان 2 و3 تعمل عليهما عوامل Z، مرتّبةً بحيث يكون الكيوبت 0 في أقصى اليمين).

لاستيعاب أي سير عمل حالية لديك، يقوم كتلة الكود التالية بتحويل من صياغة إلى الأخرى. تأخذ الدالة convert_openfermion_to_qiskit كوسيطتَين هاميلتونياً مولَّداً في OpenFermion أو Tangelo (ومُعيَّناً مسبقاً على عوامل باولي بأي محوّل متاح)، وعدد الكيوبتات اللازمة للجزيء.

from openfermion import QubitOperator
from qiskit.quantum_info import SparsePauliOp

def convert_openfermion_to_qiskit(
openfermion_operator: QubitOperator, num_qubits: int
) -> SparsePauliOp:
terms = openfermion_operator.terms

labels = []
coefficients = []

for term, constant in terms.items():
# Default set to identity
operator = list("I" * num_qubits)

# Iterate through PauliSum and replace I with Pauli
for index, pauli in term:
operator[index] = pauli
label = "".join(operator)
labels.append(label)
coefficients.append(constant)

return SparsePauliOp(labels, coefficients)

علاوةً على ذلك، يحتوي دفتر Python هذا على كود كامل للنقل من سير عمل البرامج الأخرى إلى Qiskit، بما في ذلك التحويل أعلاه.

يجب أن تكون الآن في حوزتك مجموعة من الأدوات للحصول على الهاميلتوني الذي تحتاجه لإجراء حسابات الكيمياء الكمية على الحواسيب الكمية من IBM®.