Квантовые вычисления
Пример 5.1. Приведем матрицу оператора , действующего в пространстве
. Оператор
действует на второй q-бит, на остальных q-битах действие тождественное. Базисные векторы расположены в лексикографическом порядке: от
до
.
![H[2] \,=\,
\frac{1}{\sqrt2} \leftp
\begin{array}{*8 r}
1& 0& 1& 0& 0& 0& 0& 0\\
0& 1& 0& 1& 0& 0& 0& 0\\
1& 0&-1& 0& 0& 0& 0& 0\\
0& 1& 0&-1& 0& 0& 0& 0\\
0& 0& 0& 0& 1& 0& 1& 0\\
0& 0& 0& 0& 0& 1& 0& 1\\
0& 0& 0& 0& 1& 0&-1& 0\\
0& 0& 0& 0& 0& 1& 0&-1
\end{array}
\rightp\ .](/sites/default/files/tex_cache/88cb9bba15b5b07c9deb45228e5d2445.png)
С этого места начинается вычислительная сложность. Пусть , тогда
— некоторая матрица
,
— матрица размерности
, у которой по диагонали стоят блоки из матриц
. Эта матрица представляет один элементарный шаг. Когда применяется несколько таких операторов к разным парам q-битов, результат будет выглядеть гораздо сложнее. Не видно способа определить этот результат, кроме прямого перемножения матриц. Поскольку размеры матриц экспоненциально велики, потребуется экспоненциальное время для их перемножения.
Заметим однако, что вычисление матричных элементов возможно на полиномиально ограниченной памяти. Пусть нужно найти матричный элемент оператора
![U = U^{(l)}[j_l,k_l]\, U^{(l-1)}[j_{l-1},k_{l-1}]\cdot\ldots\cdot U^{(2)}[j_2,k_2]\, U^{(1)}[j_1,k_1].](/sites/default/files/tex_cache/78c3043474d1bb99473583584efa8b9e.png)
Очевидно, что
![]() |
( 5.1) |
![x_0,\dots,x_l](/sites/default/files/tex_cache/11bec76ea72456242876d40e88f56547.png)
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
![(l-1)](/sites/default/files/tex_cache/bc12f5d9385194e02ba6c543c6a753e2.png)
![x_{l-1}, \dots, x_1](/sites/default/files/tex_cache/15e17cdf45509ebb54a7f5405da17a19.png)
Определение 5.1. Квантовая схема. Пусть — некоторое множество унитарных операторов (базис). Тогда квантовая схема в базисе
— это последовательность
, где
— множества q-битов,
.
Оператор, реализуемый квантовой схемой. Это оператор , равный
.
Это определение не очень хорошо, так как не учитывает возможность использования дополнительной памяти в процессе вычисления. Поэтому дадим еще одно определение.
Оператор , реализуемый схемой в расширенном смысле. Это такой оператор, что произведение
![W=U_l[A_l]\cdot\ldots\cdot U_1[A_1],](/sites/default/files/tex_cache/c2b15abc2439a19feb9baa8f0267b703.png)
![N](/sites/default/files/tex_cache/8d9c307cb7f3c4a32822a51922d1ceaa.png)
![N\geq n](/sites/default/files/tex_cache/b7cf8915046b9ef5de37fbcccd5c47b4.png)
![\ket{\xi}\in\BB^{\otimes n}](/sites/default/files/tex_cache/48288472fcc6544acfa34b885b85409f.png)
![W(\ket\xi\double\otimes\ket{0^{N-n}})=\left(U\ket\xi\right)\otimes\ket{0^{N-n}}](/sites/default/files/tex_cache/d326bdce71440f007b8f8a82f005deff.png)
Таким образом, мы "берем напрокат" дополнительную память, заполненную нулями, и должны возвратить ее в прежнем состоянии. Какой смысл имеет такое определение? Зачем нужно требовать, чтобы дополнительные q-биты вернулись в состояние ? На самом деле это условие чисто техническое, однако важно, чтобы вектор состояния в конце вычисления был разложим, т.е. имел вид
(с произвольным
). Если это так, то первая подсистема находится в определенном состоянии
, поэтому про вторую подсистему (дополнительную память) можно забыть. В противном случае, совместное состояние двух подсистем оказывается "запутанным" (entangled), поэтому первую подсистему нельзя отделить от второй.