Скобки
Contents
Скобки#
Автор(ы):
Дисклеймер: нам нужен инструментарий для работы с более абстрактными пространствами!
Символ Кронекера и остальные специальные тензора – это удобные примитивы для низкоуровневой работы с матрицами и векторами. Физики смогли придумать поверх примитивов линейной алгебры отличный синтаксический сахар, т.н. нотацию Дирака. Но давайте начнем с определения гильбертова пространства.
Гильбертово пространство#
Гильбертово пространство – это полное линейное векторное пространство, определяемое:
скалярным произведением \((u, v)\), в простейшем частном случае - \((u, v) = u^{\dagger} v\);
зафиксированной нормой вида \(||v|| = \sqrt{(v,v)}\);
метрикой \(d(u,v) = ||u-v|| = \sqrt{(u-v,u-v)}\).
Полное пространство#
При нахождении предела некоторой последовательности полное метрическое пространство дает возможность не думать о принадлежности этого предела данному пространству, то есть по своей сути разрешает предельный переход и позволяет доказать множество красивых теорем. Подробнее строгое определение можно посмотреть тут.
Нотация Дирака, или Bra-Ket нотация#
Напомним, что в гильбертовом пространстве для пространства \(H\) определено сопряженное пространство \(H^{\dagger}\). Тогда можно рассмотреть обозначение Ket для элемента \(v\) из \(H\) как вектор-столбец:
и обозначение Bra для элемента \(u\) из сопряженного пространства \(H^*\) как сопряженную вектор-строку
Bra-ket \(u\) и \(v\) просто задает скалярное произведение между этими элементами:
Часто, например, требуется показать два граничных состояния кубита \(\ket{0}\), \(\ket{1}\), тогда мы можем записать их просто как вектор-столбцы: \(\ket{0} = \begin{bmatrix} 1 \\ 0 \end{bmatrix}\) и \(\ket{1} = \begin{bmatrix} 0 \\ 1 \end{bmatrix}\). В следующей лекции этот вопрос будет рассмотрен детальнее.
Внешнее произведение (outer-product)#
Также имеет смысл и переставленная запись Ket-Bra, которая называется внешним произведением:
По сути это матрица \(N \times N\), то есть новый оператор в гильбертовом пространстве. Не все перестановки имеют смысл, например, нельзя записать \(\bra{v} \bra{v}\) или \(\ket{u} \ket{v}\).
Мы вернемся к Ket-Bra чуть ниже, когда будем говорить про операторы проекции.
Эрмитов оператор#
Оператор \(U\) называется эрмитовым, если он удовлетворяет равенству \((Uv,u) = (v,Uu)\) для всех \(u\), \(v\) из \(H\) или в матричном виде:
Унитарный оператор#
Унитарный оператор \(\hat{U}:H \rightarrow H\) на гильбертовом пространстве \(H\) – это линейный оператор, который удовлетворяет следующему равенству \((Uv, Uu) = (u,v)\) для любых \(v \in H\), \(u \in H\). Или в матричной форме:
Напомним, что операция \(\hat{U}^\dagger\) (другое частое обозначение в работах – звездочка или \(H\hat{U}^{*}=\hat{U}^{H}\)) в матричных терминах является последовательным применением операции транспонирования и последующего комплексного сопряжения элементов этой матрицы \(\hat{U}^\dagger = \overline{\hat{U}}^T\) (порядок этих операций, естественно, не влияет на результат).
import numpy as np
import scipy as sp
from scipy import linalg
U_hat = np.array([
[1 + 0j, 0 + 0j],
[0 + 0j, 1 + 0j]
])
U_hat_star_byhands = U_hat.conj().T
U_hat_star_long = np.conjugate(np.transpose(U_hat))
print(np.allclose(U_hat_star_long, U_hat_star_byhands))
True
Также в Python
для многих операций есть соответствующие методы вместо функций и их сокращения, например U.transpose()
– то же самое, что U.T
, а U.conjugate()
– U.conj()
.
Важное свойство, что любой эрмитов оператор \(U\) можно привести к унитарному оператору с помощью взятия матричной экспоненты от матрицы оператора, умноженного на мнимую единицу:
Давайте докажем быстро этот факт: для эрмитовых квадратных матриц можно определить матричные функции через спектральное разложение матрицы, которое в силу свойств эрмитовых матриц имеет вид: \(U=S \Lambda S^{\dagger}\), где \(S\) – унитарная матрица перехода к тому базису, где изначальный оператор выражается диагональной матрицей. Тогда матричная функция \(f(U) = S f(\Lambda) S^{\dagger}\), т.е. мы диагонализируем матрицу и применяем функцию ко всем диагональным элементам, а потом возвращаемся в исходный базис унитарным преобразованием. Соответственно, для экспоненты:
Note
В качестве упражнения для самопроверки можете показать, что такое определение эквивалентно определению через степенной ряд: \(e^U = \sum_{k=0}^\infty{1 \over k!}U^k\)
Доказательство: Проверим определение унитарной матрицы: \(\hat{U}^{\dagger}\hat{U} = (S \exp (i*\Lambda) S^\dagger)^\dagger S \exp (i*\Lambda) S^\dagger\). Пользуясь тем, что эрмитово сопряжение произведения это произведение эрмитовых сопряжений в обратном порядке (\((AB)^\dagger=B^\dagger A^\dagger\)) и что эрмитово сопряжение является обратной операцией к себе (\((A^\dagger)^\dagger = A\)), а также тем, что \(S\) – унитарная матрица (то есть \(S \cdot S^{\dagger}=I\)), получаем:
Заметим, что теперь у нас уже скалярная экспонента, которая применяется к элементам диагональной матрицы, и мы можем воспользоваться тем, что произведение экспонент превращается в экспоненту от суммы степеней:
В конце мы еще раз воспользовались тем, что \(S\) – унитарная. Абсолютно так же доказывается, что \(\hat{U}\hat{U}^{\dagger} = I.\)
Note
Кстати, любая матрица вида \(HH^{\dagger}\) является эрмитовой.
Давайте продемонстрируем доказанный факт на примере матрицы дискретного преобразования Фурье без нормировочного коэффициента \(\frac{1}{N}\), \(N=3\), преобразованной к \(DD^{\dagger}\):
N = 3
w = np.sqrt(np.exp(-1j * 2 * np.pi / N))
D = np.array([
[1, 1, 1],
[1, w, w ** 2],
[1, w ** 2, w ** 4]
])
U = D @ D.conj().T
print(f"{U = }")
print(f"{D = }")
print(f"{np.allclose(U @ U.T.conj(), np.eye(N)) = }") # no
U_hat = linalg.expm(1j * U)
print(f"\n{np.allclose(U_hat @ U_hat.conj().T, np.eye(N)) = }")
print(f"\n{np.allclose(U_hat.conj().T @ U_hat, np.eye(N)) = }")
U = array([[ 3.00000000e+00+0.00000000e+00j, 1.00000000e+00+1.73205081e+00j,
-1.11022302e-16+7.77156117e-16j],
[ 1.00000000e+00-1.73205081e+00j, 3.00000000e+00+0.00000000e+00j,
1.00000000e+00+1.73205081e+00j],
[-1.11022302e-16-7.77156117e-16j, 1.00000000e+00-1.73205081e+00j,
3.00000000e+00+0.00000000e+00j]])
D = array([[ 1. +0.j , 1. +0.j , 1. +0.j ],
[ 1. +0.j , 0.5-0.8660254j, -0.5-0.8660254j],
[ 1. +0.j , -0.5-0.8660254j, -0.5+0.8660254j]])
np.allclose(U @ U.T.conj(), np.eye(N)) = False
np.allclose(U_hat @ U_hat.conj().T, np.eye(N)) = True
np.allclose(U_hat.conj().T @ U_hat, np.eye(N)) = True
Пример: оператор-проектор#
Оператором проекции является оператор \(P\) со свойством \(P^2=P\).
Покажем, что Ket-Bra вида \(\ket{\Psi} \bra{\Psi}\) обладает этим свойством.
поскольку вектор состояния – нормированный: \(\bra{\Psi} \ket{\Psi} = 1\).
Оператор Ket-Bra с вектором состояния \(\ket{\Psi}\), то есть \(\ket{\Psi} \bra{\Psi}\)рассматривается во вводной лекции про кубиты, а также пригодится позже, когда речь зайдет о смешанных состояниях.
Пример: оператор поворота#
Оператором поворота по оси вращения \(v=(x,y,z)\) на угол \(\theta\) является
Например, матрица поворота относительно оси \(x\) на \(90^\degree\): \(x=1\), \(y=0\), \(z=0\), \(\theta = \frac{\pi}{2}\), будет иметь вид:
Если у нас больше измерений, то по тем измерениям, которые не затрагиваются этим поворотом, у нас в строке и столбце стоят нули, кроме пересечения строки и столбца, отвечающих за это измерение - там стоит единица.
Операторы поворота очень важны в квантовых вычислениях. Они рассматриваются отдельно в лекции про квантовые гейты и далее используются в вариационных квантовых схемах для кодирования классических данных в квантовые операторы.
Пример: оператор дифференцирования#
В пространстве многочленов \(P\) с базисом \(\{1,t,t^2,...,t^n\}\) можно задать оператор дифференцирования \(\mathcal{D} \colon P_n \to P_{n-1}\) в виде матрицы:
Тогда производная многочлена \(p = a_0 + a_1 t + \cdots + a_n t^{n} = \begin{bmatrix} a_0 & a_1 & \cdots & a_n \end{bmatrix} \cdot \begin{bmatrix} 1 \\ t \\ \vdots \\ t^{n} \end{bmatrix}\)
Про разницу между оператором и матрицей преобразования
Мы с вами рассматривали операторы через конечные матрицы, но на самом деле гильбертово пространство было придумано как раз, чтобы можно было работать с бесконечномерными векторами и применять непрерывные операторы. Можно считать, что есть некоторый дуализм между непрерывным оператором и пределом бесконечной матрицы. Иногда удобнее работать с матрицей, а иногда – с абстрактным оператором.
Произведение Кронекера#
Давайте рассмотрим еще одну интересную операцию, которая называется матричным тензорным произведением (является тензорным произведением для линейных операторов) или произведением Кронекера.
Проще всего его необходимость можно продемонстрировать на примере двух игр: Орел/Решка и бросок кубика. Мы можем записать состояния этих игр через вероятности событий и давайте возьмем монетку со смешенным центром тяжести и такой же кубик:
\(\text{coin} = \begin{bmatrix} \frac{1}{3} && \frac{2}{3} \end{bmatrix}\) для нашей монетки и \(\text{dice}=\begin{bmatrix} \frac{1}{4} && \frac{1}{5} && \frac{1}{7} && \frac{1}{11} && \frac{1}{13} && \frac{4791}{20020} \end{bmatrix}\) для нашей игральной кости. Тогда если мы захотим сыграть в игру, когда сначала подкидывается монетка, а потом - игральный кубик, нам будет удобно записать это в виде либо очень длинного вектора:
Либо в виде матрицы, где по строкам будут события монетки, а по столбцам – кубика:
С помощью произведения Кронекера (или, повторимся, – матричного тензорного произведения) похожие огромные вектора и матрицы можно очень компактно записать:
В общем случае,
Основные его свойства вы можете прочитать в статье: Произведение Кронекера
Есть и другие нужные тензорные операции, например, чуть больший список вы можете найти в этой статье или в рекомендованной литературе по квантовой механике.
Рекомендованная литература#
Quantum Mechanics: The Theoretical Minimum Illustrated Edition by Leonard Susskind, Art Friedman [SF14] или его русский перевод [15b]. Книга сочетает в себе довольно строгий формализм вместе с интуицией квантовой механики. Главы построены в виде конкретных примеров или задач, которые понимают, зачем та или иная теория необходима.
Mathematics for machine learning by Marc Peter Deisenroth, A. Aldo Faisal, and Cheng Soon Ong [DFO20] - отличная книжка чтобы освежить воспоминания о базовых алгоритмах в машинном обучении и о математике, которая применяется в них. Доступна бесплатная электронная версия.
Deep Learning by Ian Goodfellow, Yoshua Bengio, Aaron Courville [GBC16] - отличная книжка, чтобы разобраться в основах глубокого обучения, чем-то может заменить предыдущую книгу, отличный старт, если вы хотите разобраться в автоэнкодерах или в других нейросетевых моделях. Доступна бесплатная электронная версия.
Что мы узнали#
произвол со скобками
Гильбертовы пространства
Эрмитовый оператор
Унитарный оператор
Примеры различных операторов