화학 해밀토니안의 샘플 기반 양자 대각화
사용량 추정: Heron r2 프로세서에서 1분 미만 (참고: 이는 추정치이며 실제 실행 시간은 다를 수 있습니다.)
배경
이 튜토리얼에서는 잡음 있는 양자 샘플을 후처리하여 질소 분자 의 평형 결합 길이에서의 기저 상태 근사값을 구하는 방법을 소개합니다. 59-Qubit 양자 Circuit(52개 시스템 Qubit + 7개 보조 Qubit)에서 얻은 샘플을 사용하여 샘플 기반 양자 대각화(SQD) 알고리즘을 적용합니다. Qiskit 기반 구현은 SQD Qiskit 애드온에서 제공되며, 관련 문서와 시작을 위한 간단한 예제에서 자세한 내용을 확인할 수 있습니다. SQD는 양자 및 분산 클래식 컴퓨팅을 함께 사용하여 양자 해밀토니안과 같은 양자 연산자의 고유값과 고유벡터를 찾는 기법입니다. 클래식 분산 컴퓨팅은 양자 프로세서에서 얻은 샘플을 처리하고, 샘플이 형성하는 부분 공간에서 목표 해밀토니안을 투영하여 대각화하 는 데 사용됩니다. 이를 통해 SQD는 양자 잡음으로 손상된 샘플에도 견고하게 동작하며, 수백만 개의 상호작용 항을 가진 화학 해밀토니안처럼 정확한 대각화 방법으로는 다룰 수 없는 대형 해밀토니안도 처리할 수 있습니다. SQD 기반 워크플로우는 다음 단계로 구성됩니다.
- Circuit 앤사츠를 선택하고 양자 컴퓨터에서 기준 상태(이 경우 하트리-폭(Hartree-Fock) 상태)에 적용합니다.
- 결과 양자 상태에서 비트스트링을 샘플링합니다.
- 비트스트링에 대해 자기 일관적 구성 복구 절차를 실행하여 기저 상태의 근사값을 구합니다.
SQD는 목표 고유상태가 희소할 때 잘 동작하는 것으로 알려져 있습니다. 즉, 파동 함수가 문제 크기에 따라 지수적으로 증가하지 않는 기저 상태 집합 에 의해 지지될 때 효과적입니다.
양자 화학
분자의 특성은 주로 전자의 구조에 의해 결정됩니다. 페르미온 입자인 전자는 2차 양자화라는 수학적 형식으로 기술할 수 있습니다. 이 형식에서는 여러 개의 오비탈이 존재하며, 각 오비탈은 비어 있거나 페르미온으로 점유될 수 있습니다. 개의 오비탈로 구성된 시스템은 페르미온 반교환 관계를 만족하는 소멸 연산자 집합 으로 기술됩니다.
수반 연산자 는 생성 연산자라고 합니다.
지금까지의 설명에서는 페르미온의 기본 특성인 스핀을 고려하지 않았습니다. 스핀을 고려하면 오비탈은 공간 오비탈이라고 불리는 쌍으로 구성됩니다. 각 공간 오비탈은 "스핀-"와 "스핀-"로 레이블된 두 개의 스핀 오비탈로 이루어집니다. 공간 오비탈 에서 스핀 ()를 가진 스핀 오비탈과 연관된 소멸 연산자를 로 씁니다. 을 공간 오비탈의 수라 하면 총 개의 스핀 오비탈이 존재합니다. 이 시스템의 힐베르트 공간은 두 부분으로 구성된 비트스트링으로 레이블된 개의 정규 직교 기저 벡터 로 생성됩니다.
분자 시스템의 해밀토니안은 다음과 같이 쓸 수 있습니다.
여기서 과 는 분자 적분이라고 불리는 복소수로, 컴퓨터 프로그램을 사용하여 분자의 사양으로부터 계산됩니다. 이 튜토리얼에서는 PySCF 소프트웨어 패키지를 사용하여 적분을 계산합니다.
분자 해밀토니안의 유도 과정에 대한 자세한 내용은 양자 화학 교재(예: Szabo와 Ostlund의 Modern Quantum Chemistry)를 참고하세요. 양자 화학 문제가 양자 컴퓨터에 어떻게 매핑되는지에 대한 고수준 설명은 Qiskit Global Summer School 2024의 강의 Mapping Problems to Qubits를 확인하세요.
국소 유니터리 클러스터 야스트로프(LUCJ) 앤사츠
SQD는 샘플을 추출하기 위한 양자 Circuit 앤사츠가 필요합니다. 이 튜토리얼에서는 물리적 동기와 하드웨어 친화성의 조합 덕분에 국소 유니터리 클러스터 야스트로프(LUCJ) 앤사츠를 사용합니다.
LUCJ 앤사츠는 일반 유니터리 클러스터 야스트로프(UCJ) 앤사츠의 특수화된 형태로, 다음과 같은 형식을 가집니다.
여기서 은 기준 상태(보통 하트리-폭 상태로 선택)이며, 와 는 다음과 같은 형식입니다.
여기서 수 연산자를 다음과 같이 정의합니다.
연산자 는 오비탈 회전으로, 선형 깊이와 선형 연결성을 사용하는 알려진 알고리즘으로 구현할 수 있습니다. UCJ 앤사츠의 항을 구현하려면 전역 연결성이나 페르미온 스왑 네트워크가 필요하여, 제한된 연결성을 가진 잡음 있는 내결함성 이전 양자 프로세서에서는 구현이 어렵습니다. 국소 UCJ 앤사츠의 아이디어는 및 행렬에 희소성 제약 조건을 부과하여 제한된 연결성을 가진 Qubit 토폴로지에서 상수 깊이로 구현할 수 있도록 하는 것입니다. 제약 조건은 상삼각 행렬에서 0이 아닌 값을 가질 수 있는 행렬 항목의 인덱스 목록으로 지정됩니다(행렬이 대칭이므로 상삼각만 지정하면 됩니다). 이 인덱스는 상호작용이 허용되는 오비탈 쌍으로 해석할 수 있습니다.
예를 들어, 정사각형 격자 Qubit 토폴로지를 생각해봅시다. 및 오비탈을 격자의 평행한 두 줄에 배치하고, 두 줄 사이의 연결이 사다리 모양의 "가로대"를 형성하도록 다음과 같이 배치할 수 있습니다.

이 설정에서 같은 스핀을 가진 오비탈은 선형 토폴로지로 연결되고, 다른 스핀을 가진 오비탈은 같은 공간 오비탈을 공유할 때 연결됩니다. 이를 통해 행렬에 대한 다음과 같은 인덱스 제약 조건이 생깁니다.
즉, 행렬이 상삼각의 지정된 인덱스에서만 0이 아닌 값을 가지면, 항을 스왑 Gate 없이 상수 깊이로 정사각형 토폴로지에서 구현할 수 있습니다. 물론, 앤사츠에 이러한 제약을 부과하면 표현력이 줄어들어 더 많은 앤사츠 반복이 필요할 수 있습니다.
IBM® 하드웨어는 헤비-헥스 격자 Qubit 토폴로지를 사용하며, 이 경우 아래에 나타낸 "지그재그" 패턴을 채택할 수 있습니다. 이 패턴에서 같은 스핀을 가진 오비탈은 선형 토폴로지의 Qubit에 매핑되고(빨간색과 파란색 원), 다른 스핀의 오비탈 간 연결은 4번째 공간 오비탈마다 존재하며, 보조 Qubit(보라색 원)에 의해 연결이 이루어집니다. 이 경우 인덱스 제약 조건은 다음과 같습니다.

자기 일관적 구성 복구
자기 일관적 구성 복구 절차는 잡음 있는 양자 샘플에서 가능한 한 많은 신호를 추출하도록 설계되었습니다. 분자 해밀토니안은 입자 수와 스핀 Z를 보존하므로, 이러한 대칭성을 보존하는 Circuit 앤사츠를 선택하는 것이 합리적입니다. 하트리-폭 상태에 적용하면, 잡음이 없는 경우 결과 상태는 고정된 입자 수와 스핀 Z를 가집니다. 따라서 이 상태에서 샘플링된 비트스트링의 스핀- 및 스핀- 절반은 하트리-폭 상태와 동일한 해밍 무게를 가져야 합니다. 현재 양자 프로세서의 잡음으로 인해 일부 측정된 비트스트링은 이 특성을 위반합니다. 단순한 사후 선택 방법은 이러한 비트스트링을 버리겠지만, 이는 낭비적입니다. 왜냐하면 해당 비트스트링에도 일부 신호가 포함될 수 있기 때문입니다. 자기 일관적 복구 절차는 후처리에서 그 신호 일부를 복구하려고 시도합니다. 이 절차는 반복적이며, 기저 상태의 각 오비탈 평균 점유율 추정값을 입력으로 필요로 하고, 이 추정값은 먼저 원시 샘플에서 계산됩니다. 절차는 루프로 실행되며, 각 반복은 다음 단계로 구성됩니다.
- 지정된 대칭성을 위반하는 각 비트스트링에 대해, 비트스트링을 현재 평균 오비탈 점유율 추정값에 더 가깝게 만들도록 설계된 확률적 절차로 비트를 뒤집어 새로운 비트스트링을 얻습니다.
- 대칭성을 만족하는 이전 및 새 비트스트 링을 모두 수집하고, 사전에 선택된 고정 크기의 부분 집합을 서브샘플링합니다.
- 각 비트스트링 부분 집합에 대해, 해당 기저 벡터가 생성하는 부분 공간으로 해밀토니안을 투영하고(이전 섹션에서 이 기저 벡터에 대한 설명 참조), 클래식 컴퓨터에서 투영된 해밀토니안의 기저 상태 추정값을 계산합니다.
- 가장 낮은 에너지를 가진 기저 상태 추정값으로 평균 오비탈 점유율 추정값을 업데이트합니다.
SQD 워크플로우 다이어그램
SQD 워크플로우는 다음 다이어그램에 나타나 있습니다.

요구 사항
이 튜토리얼을 시작하기 전에 다음이 설치되어 있는지 확인하세요.
- Qiskit SDK v1.0 이상, 시각화 지원 포함
- Qiskit Runtime v0.22 이상 (
pip install qiskit-ibm-runtime) - SQD Qiskit 애드온 v0.11 이상 (
pip install qiskit-addon-sqd) - ffsim v0.0.58 이상 (
pip install ffsim)
설정
# Added by doQumentation — required packages for this notebook
!pip install -q ffsim matplotlib numpy pyscf qiskit qiskit-addon-sqd qiskit-ibm-runtime rustworkx
import pyscf
import pyscf.cc
import pyscf.mcscf
import ffsim
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
1단계: 클래식 입력을 양자 문제로 매핑
이 튜토리얼에서는 cc-pVDZ 기저 집합에서 평형 상태의 분자 기저 상태 근사값을 구합니다. 먼저 분자와 그 특성을 지정합니다.
# Specify molecule properties
open_shell = False
spin_sq = 0
# Build N2 molecule
mol = pyscf.gto.Mole()
mol.build(
atom=[["N", (0, 0, 0)], ["N", (1.0, 0, 0)]],
basis="cc-pvdz",
symmetry="Dooh",
)
# Define active space
n_frozen = 2
active_space = range(n_frozen, mol.nao_nr())
# Get molecular integrals
scf = pyscf.scf.RHF(mol).run()
num_orbitals = len(active_space)
n_electrons = int(sum(scf.mo_occ[active_space]))
num_elec_a = (n_electrons + mol.spin) // 2
num_elec_b = (n_electrons - mol.spin) // 2
cas = pyscf.mcscf.CASCI(scf, num_orbitals, (num_elec_a, num_elec_b))
mo = cas.sort_mo(active_space, base=0)
hcore, nuclear_repulsion_energy = cas.get_h1cas(mo)
eri = pyscf.ao2mo.restore(1, cas.get_h2cas(mo), num_orbitals)
# Store reference energy from SCI calculation performed separately
exact_energy = -109.22690201485733
converged SCF energy = -108.929838385609
LUCJ 앤사츠 Circuit을 구성하기 전에, 다음 코드 셀에서 먼저 CCSD 계산을 수행합니다. 이 계산에서 얻은 및 진폭은 앤사츠의 매개변수를 초기화하는 데 사용됩니다.
# Get CCSD t2 amplitudes for initializing the ansatz
ccsd = pyscf.cc.CCSD(
scf, frozen=[i for i in range(mol.nao_nr()) if i not in active_space]
).run()
t1 = ccsd.t1
t2 = ccsd.t2
E(CCSD) = -109.2177884185543 E_corr = -0.2879500329450045