12. 任意酉矩阵门分解 (1)#
迄今为止,我们已经了解到,任意的量子计算可以看成作用在向量上的酉矩阵,我们还学习了许多单量子比特门和多量子比特门,我们也学习了一些非常基础的使用单量子门和双量子门的量子算法。更进一步,我们知道多量子比特门可以分解为单量子门和双量子门。
那么对于作用在任意数目的量子比特上的任意量子门,是否可以将其分解为单量子门和双量子门呢?如果可以,那我们将所使用的这些门的集合(一些单量子门和双量子门)称之为通用量子门。
首先我们需要定义任意量子门,简单起见,不妨设 \(N\) 维向量空间的标准正交基为 \(\lbrace \left|0\right>, \left|1\right>, \ldots, \left|N-1\right>\rbrace\) ,那么作用在该空间上的任意量子门可以写作: $\( U = \left|\psi_0\right>\left<0\right| + \left|\psi_1\right>\left<1\right| + \cdots + \left|\psi_{N-1}\right>\left<N-1\right| \)\( 其中 \)\left|\psi_k\right>\( 形成一组单位正交基,\)\left<\psi_i|\psi_j\right> = \delta_{ij}\(,换言之,\)\left|\psi_k\right>$ 就是问题的输入。
将\(U\)分解为二级酉矩阵#
首先我们需要知道二级酉矩阵是什么东西,它是这么定义的:对于一个 \(N\) 维单位阵 \(I_N\),选择两个下标 \(1 \leq i < j \leq N\) 和一个 \(2\times 2\) 的酉矩阵 \(\tilde{U}\),将 \(I_N\) 中对应下标的位置替换成 \(\tilde{U}\)。
如何将 \(U\) 分解为一系列二级酉矩阵的乘积?具体的策略是一步步地将 \(U\) 变换成单位阵。
例如,我们想要找到另一个酉矩阵 \(W_0\) (我们希望它有一个简单的结构)使得:
其中 \(|\tilde{\psi}_k\rangle \equiv W_0 |\psi_k\rangle\) 。
注意到,由于 \(W_0\) 和 \(U\) 都是酉矩阵,所以 \(W_0^{-1}U\) 还是酉矩阵,根据酉矩阵的单位正交性(酉矩阵的每一行组成的向量单位正交,每一列组成的向量单位正交),对于 \(k>0\) 有 \(\langle 0|\tilde{\psi}_k\rangle = 0\) 。
不断持续这一过程,我们得到: $\( W_{N-2}^{-1} \cdots W_{1}^{-1} W_0^{-1} U = |0\rangle\langle 0| + |1\rangle\langle 1| + \cdots |N-1\rangle \langle N-1| = I \)\( 因此,我们得到了 \)U\( 的分解: \)\( U = W_0 W_1 \cdots W_{N-2} \)$
下面我们将说明怎么用二级酉矩阵构造 \(W_k\) 。
对于矩阵的第一列 \(|\psi_0\rangle\) $\( U |0\rangle = |\psi_0\rangle = a_0 |0\rangle + a_1 |1\rangle + \cdots a_{N-1} |N-1\rangle \)$
写成矩阵形式 $\( U = \begin{bmatrix} a_0 & \star & \star & \cdots & \star \\ a_1 & \star & \star & \cdots & \star \\ a_2 & \star & \star & \cdots & \star \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{N-1} & \star & \star & \cdots & \star \end{bmatrix} \)$
我们选取 \(W_0\) 使得它和 \(U\) 对 \(|0\rangle\) 的作用效果相同,即 \(W_0 |0\rangle = U |0\rangle = |\psi_0\rangle\) ,这样一来 \(W_0^{-1} U |0\rangle = |0\rangle\) , \(W_0\) 的矩阵第一列和 \(U\) 相同: $\( W_0 = \begin{bmatrix} a_0 & \star & \star & \cdots & \star \\ a_1 & \star & \star & \cdots & \star \\ a_2 & \star & \star & \cdots & \star \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{N-1} & \star & \star & \cdots & \star \end{bmatrix} \)$
我们可以把 \(U\) 写作 $\( U = W_0 |0\rangle \langle 0| + |\psi_1\rangle\langle 1| + \cdots + |\psi_{N-1}\rangle \langle N-1| \)$
因此 $\( W_0^{-1}U = |0\rangle\langle 0| + | \tilde{\psi} _1 \rangle \langle 1| + \cdots | \tilde{\psi} _{N-1} \rangle \langle N-1| \)$
将 \(W_0^{-1}U\) 记作新的 \(U_1\) : $\( U_1 \equiv W_0^{-1}U = \begin{bmatrix} 1 & 0 & 0 & \cdots & 0 \\ 0 & * & * & \cdots & * \\ 0 & * & * & \cdots & * \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & * & * & \cdots & * \end{bmatrix} \)$
因为我们只能使用二级酉矩阵来构造 \(W_0\),下面直接给出构造: $\( W_0 = \omega_{N-2} \omega_{N-3} \cdots \omega_1 \omega_0 \)$
其中
其中 \(|b_0|^2 = |a_1|^2 + |a_2|^2 + \cdots |a_{N-1}|^2\) 。
容易验证 $\( \omega_0 |0\rangle = a_0 |0\rangle + b_0 |1\rangle \)$
对于 \(0 < k < N\), $$
$$
其中 \(|b_k|^2 = |a_{k+1}|^2 + \cdots |a_{N-1}|^2\) 。
容易验证对于 \(0 \leq k < N\) 有 $\( \omega_k \omega_{k-1} \cdots \omega_1 \omega_0 |0\rangle = a_0 |0\rangle + a_1 |1\rangle + \cdots + a_{k} |k\rangle + b_{k} |k+1\rangle \)$
因此 $\( W_0 |0\rangle = \omega_{N-2} \cdots \omega_1 \omega_0 |0\rangle = |\psi_0\rangle \)$
另一种方法#
下面介绍另一种分解为二级酉矩阵的方法,该方法使用类似于「高斯消元」的思想。
下面以 \(3\times 3\) 的矩阵为例,对于任意 \(3\times 3\) 的酉矩阵 \(U\),可以写作 $\( U = \begin{bmatrix} a & d & g \\ b & e & h \\ c & f & j \end{bmatrix} \)$
我们要找到一系列二级酉矩阵 \(U_1, \ldots , U_3\) 使得 $\( U_3 U_2 U_1 U = I \)\( 那么我们就找到了分解 \)\( U = U_1^\dagger U_2^\dagger U_3^\dagger \)$
我们使用初等行变换,首先考虑削去 \(b\):
如果 \(b=0\),那么令 \(U_1 = I\);
如果 \(b \neq 0\),那么令
容易验证 \(U_1\) 将削去 \(b\),我们得到 $\( U_1 U = \begin{bmatrix} a' & d' & g' \\ 0 & e' & h' \\ c' & f' & j' \end{bmatrix} \)$
下面考虑削去 \(c'\):
如果 \(c' = 0\),令 \(U_2 = I\);
如果 \(c' \neq 0\),令
削去后,矩阵为 $\( U_2 U_1 U = \begin{bmatrix} a'' & d'' & g'' \\ 0 & e'' & h'' \\ 0 & f'' & j'' \end{bmatrix} \)\( 因为结果依然为酉矩阵,所以每一行每一列都是单位向量,所以 \)a'' = 1\(,\)d'' = g'' = 0$。
我们令 $\( U' = U_2 U_1 U = \begin{bmatrix} 1 & 0 & 0 \\ 0 & e'' & h'' \\ 0 & f'' & j'' \end{bmatrix} \)$ 继续上述过程,直至变成单位阵为止。
综上所述,对于任意 \(N\times N\) 的酉矩阵,存在一种将其分解为 \(O(N^2)\) 个二级酉矩阵的分解。
from copy import deepcopy
import numpy as np
def decompose(u):
n = u.shape[0]
arr = []
for j in range(n-1):
for i in range(j+1, n):
w = np.identity(n, dtype=np.complex128)
if np.allclose(u[i, j], 0):
arr.append(w)
else:
a = u[j, j]
b = u[i, j]
c = np.sqrt(np.abs(a)**2 + np.abs(b)**2)
w[j, j] = a.conj() / c
w[j, i] = b.conj() / c
w[i, j] = b / c
w[i, i] = -a / c
arr.append(w)
u = w @ u
w = u.T.conj()
arr.append(w)
u = w @ u
print(np.allclose(u, np.identity(n)))
return arr
u = np.array([[1, 1, 1, 1],
[1, 1j, -1, -1j],
[1, -1, 1, -1],
[1, -1j, -1, 1j]]) / 2
u0 = deepcopy(u)
arr = decompose(u)
v = np.identity(u.shape[0])
for a in arr:
v = v @ a.T.conj()
print(np.allclose(v, u0))
True
True
from show_info import InfoTable
InfoTable('mindquantum', 'numpy')
| Software | Version |
|---|---|
| mindquantum | 0.11.0 |
| numpy | 1.26.4 |
| System | Info |
| Python | 3.11.10 |
| OS | Darwin arm64 |
| Memory | 17.18 GB |
| CPU Max Thread | 10 |
| Date | Tue Sep 16 18:01:05 2025 |
习题#
Exercise 1#
尝试将下面的 \(U\) 分解为二级酉矩阵的乘积。