Квантова діагоналізація на основі вибірок (SQD)
Квантова діагоналізація на основі вибірок (SQD) поєднує класичну лінійну алгебру з потужністю квантових обчислень для діагоналізації гамільтоніана (матриці) та обчислення його власних значень і власних векторів. Діагоналізація матриць є важливою математичною операцією, яка широко використовується в науці, обчисленнях та оптимізації.
Відео нижче дає загальне уявлення про SQD, чим визначається його корисність і що робить його швидшим за багато інших підходів. Подальший текст містить детальніший опис.
1. Вступ і мотивація
Розглянемо як приклад рівняння на власні значення енергії, що прославив Шрьодінгер.
— гамільтоніан системи, — хвильова функція (також відома як власний стан), а — власне значення. Власні значення матриці відповідають рівням енергії системи. Наприклад, якщо система є молекулою, найменше власне значення відповідає енергії основного стану молекули. У багатьох задачах нас цікавить оцінка енергії основного стану.
Застосовуючи методи точної діагоналізації з лінійної алгебри, можна діагоналізувати повну матрицю . Однак цей підхід стає обчислювально дорогим (і навіть нездійсненним) зі збільшенням розміру матриці. Наприклад, навіть для невеликих хімічних молекул може бути непомірно великим (наприклад, гамільтоніан молекули в базисі cc-PVDZ має розмірність
На щастя, нам не завжди потрібні всі власні значення та власні вектори гамільтоніана , тому в багатьох практичних випадках повна діагоналізація матриці не потрібна. Наприклад, при оцінці основного стану нас цікавить лише найменше власне значення та відповідний власний вектор. Це дозволяє застосувати концепцію проєкції на (корисний) підпростір.
Розглянемо матрицю , , де повний векторний простір (простір Гільберта) має розмірність ( велике). Далі виберемо підпростір () — підмножину повного простору Гільберта — розмірності , де достатньо мале. Після проєкції на цей підпростір отримана матриця (назвемо її ) буде меншою (). Меншу матрицю можна діагоналізувати відповідним класичним чисельним методом і отримати власні значення та власні вектори для цього підпростору.
Зауваж, що підпростір має бути в носії цільового (наприклад, основного) власного стану. Інакше кажучи, проєкований гамільтоніан має бути в підпросторі, що містить найменше власне значення.
2. Проєкція і діагоналізація
Припустимо, що ми хочемо знайти найменше власне значення та відповідний власний вектор для такої матриці розміру .
Ми діагоналізуємо повну матрицю разом з різними проєкованими версіями () для різних підпросторів, щоб продемонструвати масштабованість методу та важливість вибору підпростору.
Енергія основного стану (мінімальне власне значення) матриці дорівнює , а точна хвильова функція основного стану (власний вектор) має вигляд:
тобто основний стан матриці розкладається за двома обчислювальними базисними станами (векторами) та .
# Added by doQumentation — required packages for this notebook
!pip install -q numpy scipy
import numpy as np
from scipy.linalg import eigh
np.set_printoptions(precision=4, sign="-", suppress=True, linewidth=100)
H = np.array(
[
[0.2235, -0.039, -0.1035, -0.0818, 0.1746, 0.1091, 0.1165, -0.0104],
[-0.0390, 0.6621, 0.0706, -0.1964, -0.0782, 0.2619, 0.1095, 0.0029],
[-0.1035, 0.0706, 0.9961, 0.1724, 0.1067, -0.2299, -0.1817, 0.1571],
[-0.0818, -0.1964, 0.1724, -0.1773, 0.1019, -0.4778, -0.1272, -0.0414],
[0.1746, -0.0782, 0.1067, 0.1019, 0.1418, -0.1359, -0.1793, -0.0766],
[0.1091, 0.2619, -0.2299, -0.4778, -0.1359, 0.1014, 0.1696, 0.0552],
[0.1165, 0.1095, -0.1817, -0.1272, -0.1793, 0.1696, 0.4227, 0.2702],
[-0.0104, 0.0029, 0.1571, -0.0414, -0.0766, 0.0552, 0.2702, 0.4456],
]
)
eigvals, eigvecs = eigh(H)
print("Eigenvalues:")
print(eigvals)
print(f"Minimum eigenvalue: {eigvals.min()}")
print("\nEigenvectors (columns represent vectors):")
print(eigvecs)
print("\nEigenvector for the minimum eigenvalue (ground state)")
print(eigvecs[:, np.argmin(eigvals)])
Eigenvalues:
[-0.5357 -0.1321 0.1049 0.1258 0.3616 0.6405 0.947 1.3039]
Minimum eigenvalue: -0.5356560029438817
Eigenvectors (columns represent vectors):
[[-0. -0.5612 0.098 -0.0024 0.8051 -0.0806 0.0643 0.1288]
[-0. -0.1403 -0.1985 -0.4249 -0.0092 0.585 -0.5952 0.2526]
[ 0. 0.0416 0.3041 0.2122 0.1509 -0.0139 -0.5794 -0.7086]
[ 0.8 -0.1936 -0.0127 -0.4376 -0.1081 -0.0838 0.1557 -0.2966]
[ 0. 0.6716 -0.3535 -0.2552 0.5395 0.0954 0.1449 -0.1941]
[ 0.6 0.258 0.017 0.5834 0.1441 0.1118 -0.2076 0.3954]
[ 0. 0.3088 0.5504 -0.4197 0.0626 -0.468 -0.2625 0.3657]
[-0. -0.1146 -0.6559 0.0356 -0.0394 -0.6352 -0.3856 0.0418]]
Eigenvector for the minimum eigenvalue (ground state)
[-0. -0. 0. 0.8 0. 0.6 0. -0. ]
Далі ми проєктуємо матрицю на різні підпростори та перевіряємо, чи вдається отримати точний основний стан. Зокрема, ми проєктуємо матрицю на підпростір, що розкладається за:
- точними векторами основного стану ( та ).
- векторами, що виключають деякі або всі точні вектори основного стану (наприклад, , та ).
- векторами, що включають як точні вектори основного стану, так і вектори, не пов'язані з основним станом (але не всі можливі вектори простору Гільберта).
2.1 Випадок 1: підпростір містить основний стан
Припустимо, що ми хочемо проєктувати на підпростір (), що розкладається за двома векторами та . Проєкований гамільтоніан визначається так:
x1 = np.zeros(8)
x1[3] = 1 # binary 011 is 3 in decimal. |011> = |3> = [0,0,0,1,0,0,0,0]
x2 = np.zeros(8)
x2[5] = 1 # binary 101 is 5 in decimal
Hs = np.array([[x1 @ H @ x1.T, x1 @ H @ x2.T], [x2 @ H @ x1.T, x2 @ H @ x2.T]])
print(Hs)
[[-0.1773 -0.4778]
[-0.4778 0.1014]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.535656000064295
Eigenvector for minimum eigenvalue: [-0.8 -0.6]
Тут можна зробити кілька ключових спостережень.
- Оскільки підпростір розкладається за двома векторами, розмірність проєкованої матриці () становить , що менше за повну матрицю ().
- Мінімальне власне значення проєкованої матриці збігається з власним значенням точного основного стану.
- Значення у змінній
eigvecsпозначають амплітуди базисних векторів підпростору, і за їх допомогою можна відновити власний стан (основний стан). У цьому випадку отримуємо точний основний стан (з точністю до глобальної фази):
2.2 Випадок 2: підпростір виключає деякі або всі вектори основного стану
Тепер проєктуємо на підпростір, що розкладається за трьома векторами , та . Ми навмисно вибираємо вектори так, щоб виключити один з векторів основного стану (). Проєкований гамільтоніан визначається так:
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[3] = 1
x3 = np.zeros(8)
x3[6] = 1
Hs = np.array(
[
[x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
print(Hs)
[[ 0.2235 -0.0818 0.1165]
[-0.0818 -0.1773 -0.1272]
[ 0.1165 -0.1272 0.4227]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -0.21108858736702252
Власне значення у цьому випадку не збігається з мінімальним власним значенням повного гамільтоніана. Ключовий висновок: якщо проєктувати на підпростір, що не містить базисних станів цільового (основного) стану — частково або повністю — оцінений основний стан відрізнятиметься від точного.
2.3 Випадок 3: підпростір містить як вектори основного стану, так і сторонні вектори
Тепер розглянемо випадок, коли підпростір розкладається за векторами, що включають точні вектори основного стану разом із небажаними векторами. Припустимо, що підпростір розкладається за