양자화학용 해밀토니안
VQE에서 해밀턴의 역할에 대한 간략한 개요부터 시작하겠습니다.
VQE 개요에서의 해밀토니안
빅토리아 리핀스카 박사가 해밀턴과 이를 양자 컴퓨팅에 사용하기 위해 매핑하는 방법에 대해 설명합니다.
참조
위 동영상에서 참조한 문서는 다음과 같습니다.
- 페르미온 시뮬레이션을 위한 양자 알고리즘, Ortiz 외.
- 양자 컴퓨터를 이용한 화학 시뮬레이션, Kassal 외.
- 양자 화학 양자 시뮬레이션을 위한 브라비-키타예프 변환과 조던-위그너 변환의 비교, Tranter 외.
- ‘양자 컴퓨팅 시대의 양자 화학’, Cao 외.
- 양자 계산 화학, McArdle, 외.
- 전자 구조의 양자 계산을 위한 브라비-키타예프 변환, Seeley 외.
햄리턴 함수를 이용한 양자화학 준비
양자 컴퓨팅을 화학 문제에 적용하는 좋은 첫 단계는 관심 있는 시스템에 대한 해밀턴을 정의하는 것입니다. 여기서는 양자 화학 해밀턴론으로 논의를 제한하겠습니다. 해밀턴론은 동일한 페르미온 시스템과 관련된 일부 매핑이 필요하기 때문입니다.
양자 화학 분야에서 일하는 사람이라면 관심 있는 시스템을 설명하는 해밀턴을 생성할 수 있는 분자 모델링에 자주 사용하는 소프트웨어를 이미 가지고 있을 것입니다. 여기서는 PySCF, numpy와 키스킷으로만 구축된 코드를 사용하겠습니다. 하지만 해밀턴의 준비 과정은 사전 패키지화된 솔루션에도 그대로 적용됩니다. 이 접근 방식과 다른 소프트웨어의 유일한 차이점은 사소한 구문 차이뿐이며, 이 중 일부는 기존 워크플로의 통합을 용이하게 하기 위해 '타사 소프트웨어' 하위 섹션에서 다루고 있습니다.
IBM Quantum® QPU에서 사용할 양자 화학 해밀턴을 생성하는 단계는 다음과 같습니다:
- 분자 정의(지오메트리, 스핀, 활성 공간 등)
- 페르미온 해밀턴 연산자(생성 및 소멸 연산자)를 생성합니다
- 페르미온 해밀턴 연산자에서 보손 연산자로 매핑(여기서는 파울리 연산자 사용)
- 타사 소프트웨어를 사용하는 경우: 생성 소프트웨어와 키스킷 사이의 구문 불일치를 처리한다
페르미온 해밀턴은 페르미온 연산자의 관점에서 쓰여졌으며, 특히 전자가 구별할 수 없는 페르미온이라는 점을 고려합니다. 즉, 구별 가능한 보손 큐비트와는 완전히 다른 통계를 따릅니다. 따라서 매핑 프로세스가 시작됩니다.
이러한 프로세스에 이미 익숙하신 분들은 이 섹션을 건너뛰셔도 됩니다.
목표:
최종 목표는 해밀턴 형태의 해밀턴을 구하는 것입니다:
H = [(1, "XX"), (1, "YY"), (1, "ZZ")]
print(H)Output:
[(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)Output:
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- 분자 정의
여기서는 관심 있는 분자의 속성을 지정합니다. 이 예에서는 이원자 수소를 선택했습니다(결과 해밀턴이 표시하기에 충분히 짧기 때문입니다).
Python 을 기반으로 한 ‘Simulations of Chemistry Framework’( PySCF )에는, 특히 양자 계산에 적합한 분자 해밀토니안을 생성하는 데 활용할 수 있는 다양한 전자 구조 모듈이 포함되어 있습니다. PySCF 빠른 시작 가이드는 모든 변수와 기능에 대한 자세한 설명을 확인할 수 있는 훌륭한 자료입니다. 이 내용은 이미 많은 분들이 잘 알고 계실 테니, 아주 간략하게만 개요를 설명드리겠습니다. 이에 대해 더 자세히 알아보시려면 PySCF 을 방문해 주세요. 요약하자면:
거리를 이원자 분자에 사용하거나 각 원자에 대한 데카르트 좌표를 간단히 지정할 수 있습니다. 거리는 옹스트롬 단위입니다.
gto는 가우스형 궤도를 생성합니다.
기초는 분자 궤도를 모델링하는 데 사용되는 함수를 말합니다. 여기서 ' sto-6g ' 는 6개의 원시 가우스 궤도를 사용하는 슬레이터형 궤도를 맞추기 위해 명명된 일반적인 최소 기준입니다.
짝을 이루지 않은 전자의 수를 나타내는 정수 값( )을 회전시킵니다. 일부 소프트웨어는 다중성을 대신 사용합니다( ).
분자의 전하를 충전합니다.
대칭 - 분자의 점 대칭 그룹으로, 문자열로 지정하거나 "대칭 = True"를 설정하여 자동으로 감지합니다. 여기서 '두'는 두 개의 동일한 원자 종을 가진 이원자 분자에 적합한 대칭 그룹입니다.
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",
)Output:
<pyscf.gto.mole.Mole at 0x7fc718f07610>
총 에너지(전자뿐만 아니라 핵 반발 에너지 포함), 총 전자 궤도 에너지 또는 전자 궤도의 일부 하위 집합의 에너지(상보적인 하위 집합은 고정된 상태)를 설명할 수 있다는 점을 기억하세요. 의 구체적인 경우 아래의 다른 에너지에 주목하고, 핵 반발 에너지를 뺀 총 에너지가 실제로 전자 에너지를 산출한다는 점에 유의하세요:
mf = scf.RHF(mol)
mf.scf()
print(
mf.energy_nuc(),
mf.energy_elec()[0],
mf.energy_tot(),
mf.energy_tot() - mol.energy_nuc(),
)Output:
0.7199689944489797 -1.8455976628764188 -1.125628668427439 -1.8455976628764188
active_space = range(mol.nelectron // 2 - 1, mol.nelectron // 2 + 1)- 페르미온 해밀턴 생성
scf는 광범위한 자체 일관성 있는 필드 메서드를 의미합니다.
mf = scf.RHF (몰)에서와 같이 rhf는 제한된 하트리 포크 계산을 사용하는 솔버입니다. 이것의 핵심(아래 E)은 핵 반발력과 분자 궤도를 포함한 총 에너지입니다.
mcscf는 다중 구성 자체 일관성 필드 패키지입니다.
ao2mo 는 원자 궤도에서 분자 궤도로의 변환입니다.
또한 다음 변수를 사용합니다:
nCAS : 전체 활성 공간의 궤도 수
넬레카 : 전체 활성 공간의 전자 수
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]해밀턴은 전자핵의 에너지(에코어, 최소화에 관여하지 않음), 단일 전자 연산자( h1e ), 2전자 에너지( h2e )로 구분하기도 합니다. 아래 마지막 두 줄에 명시적으로 추출되어 있습니다.
h1e, ecore = mx.get_h1eff()
h2e = ao2mo.restore(1, mx.get_h2eff(), mx.ncas)이 해밀턴은 현재 페르미온(생성 및 소멸) 연산자이며, (구별할 수 없는) 페르미온 시스템에 적용 가능하며, 교환 시 반비례성의 적용을 받습니다. 따라서 구별 가능 또는 보손 시스템에 적용되는 것과는 다른 정적이 발생합니다. IBM 퀀텀 QPU에서 계산을 실행하려면 에너지를 설명하는 보손 연산자가 필요합니다. 이러한 매핑의 결과는 일반적으로 폴리 연산자의 관점에서 작성되는데, 이는 폴리 연산자가 헤르미트 연산자이자 단일 연산자이기도 하기 때문입니다. 사용할 수 있는 매핑은 여러 가지가 있습니다. 가장 간단한 방법 중 하나는 조던 위그너의 변신입니다.
- 해밀턴 매핑하기
화학 해밀턴을 양자 컴퓨터에서 실행하기에 적합한 해밀턴으로 매핑하는 데 사용할 수 있는 도구가 많이 있다는 점에 유의해야 합니다. 여기서는 조던 위그너 매핑을 PySCF, numpy와 키스킷만을 사용하여 직접 구현합니다. 다른 솔루션의 구문 고려 사항에 대해서는 아래에서 설명합니다.
콜레스키 함수는 해밀턴의 2전자 항의 낮은 순위 분해를 구하는 데 도움이 됩니다.
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, ngidentity 및 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)Output:
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 (Jordan-Wigner 매퍼 사용)의 해밀턴은 이미 276개의 용어로 구성되어 있습니다.
len(build_hamiltonian(ecore, h1e, h2e))Output:
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,
)Output:
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,
)Output:
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>
우리는 얻습니다:
irrep Ag의 궤도 수 = 4
iRREP 궤도 수 B2g = 2
iRREP 궤도 수 B3g = 1
iRREP 궤도 수 B1u = 4
iRREP 궤도 수 B2u = 1
iRREP 궤도 수 B3u = 2
하지만 모든 궤도를 대칭으로 지정하는 대신 간단히 작성할 수 있습니다:
active_space = range(mol.nelectron // 2 - 2, mol.nelectron // 2 + 2)이 접근 방식에서는 채우기 수준(원자가와 비어 있는 궤도)에 가까운 여러 궤도를 사용합니다. 여기에서는 활성 공간에 포함되도록 5개의 궤도(6번째부터 10번째까지)가 선택되었습니다.
print(
mol.nelectron // 2 - 2,
mol.nelectron // 2 + 2,
)Output:
6 10
- 써드파티 소프트웨어
양자 화학을 위해 개발된 여러 소프트웨어 패키지가 있으며, 그중 일부는 활성 공간을 제한하기 위한 여러 매퍼와 도구를 제공합니다. 위에서 설명한 단계는 일반적이며 타사 소프트웨어에도 적용됩니다. 그러나 이 다른 소프트웨어는 키스킷에서 허용되지 않는 형식으로 해밀턴을 반환할 수 있습니다. 예를 들어, 일부 소프트웨어는 해밀토니안 형식을 반환합니다:
H = -0.042 [] + -0.045 [X0 X1 Y2 Y3] + ... + 0.178 [Z0] + ... + 0.176 [Z2 Z3] + -0.243 [Z3]
특히 게이트에는 번호가 매겨져 있으며 ID 운영자는 표시되지 않는다는 점에 유의하세요. 이는 키스킷에서 사용되는 해밀턴 연산자와는 대조적으로, [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 노트북에는 위의 변환을 포함하여 다른 소프트웨어 워크플로우에서 해밀턴을 키스킷으로 마이그레이션하기 위한 전체 샘플 코드가 포함되어 있습니다.
이제 IBM® 양자 컴퓨터에서 양자 화학 계산을 수행하는 데 필요한 해밀턴을 구할 수 있는 다양한 도구를 갖추게 되었습니다.