diff --git a/lecture13.ipynb b/lecture13.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..055a2298e3923e2a83fe12edb7f9a5cec73bd069 --- /dev/null +++ b/lecture13.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 任意酉矩阵的门分解\n", + "\n", + "迄今为止,我们已经了解到,任意的量子计算可以看成作用在向量上的酉矩阵,我们还学习了许多单量子比特门和多量子比特门,我们也学习了一些非常基础的使用单量子门和双量子门的量子算法。更进一步,我们知道多量子比特门可以分解为单量子门和双量子门。\n", + "\n", + "那么对于作用在任意数目的量子比特上的任意量子门,是否可以将其分解为单量子门和双量子门呢?如果可以,那我们将所使用的这些门的集合(一些单量子门和双量子门)称之为**通用量子门**。\n", + "\n", + "首先我们需要定义任意量子门,简单起见,不妨设 $N$ 维向量空间的标准正交基为 $\\lbrace \\left|0\\right>, \\left|1\\right>, \\ldots, \\left|N-1\\right>\\rbrace$ ,那么作用在该空间上的任意量子门可以写作:\n", + "$$\n", + "U = \\left|\\psi_0\\right>\\left<0\\right| + \\left|\\psi_1\\right>\\left<1\\right| + \\cdots + \\left|\\psi_{N-1}\\right>\\left$ 形成一组单位正交基,$\\left<\\psi_i|\\psi_j\\right> = \\delta_{ij}$,换言之,$\\left|\\psi_k\\right>$ 就是问题的输入。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 将$U$分解为二级酉矩阵\n", + "\n", + "首先我们需要知道**二级酉矩阵**是什么东西,它是这么定义的:对于一个 $N$ 维单位阵 $I_N$,选择两个下标 $1 \\leq i < j \\leq N$ 和一个 $2\\times 2$ 的酉矩阵 $\\tilde{U}$,将 $I_N$ 中对应下标的位置替换成 $\\tilde{U}$。\n", + "\n", + "$$\n", + "U = \\begin{bmatrix}\n", + "1 & & & & & & \\\\\n", + " & \\ddots & & & & & \\\\\n", + " & & a & & b & & \\\\\n", + " & & & \\ddots & & & \\\\\n", + " & & c & & d & & \\\\\n", + " & & & & & \\ddots & \\\\\n", + " & & & & & & 1 \\\\\n", + "\\end{bmatrix} \\quad \\text{where }\n", + "\\tilde{U} = \\begin{bmatrix}\n", + "a & b \\\\\n", + "c & d\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "如何将 $U$ 分解为一系列二级酉矩阵的乘积?具体的策略是一步步地将 $U$ 变换成单位阵。\n", + "\n", + "例如,我们想要找到另一个酉矩阵 $W_0$ (我们希望它有一个简单的结构)使得:\n", + "\n", + "$$ W_0^{-1} U = \\left| 0 \\right> \\left< 0 \\right| + | \\tilde{\\psi} _1 \\rangle \\langle 1 | + \\cdots + | \\tilde{\\psi} _{N-1} \\rangle \\langle N-1 | $$\n", + "\n", + "其中 $|\\tilde{\\psi}_k\\rangle \\equiv W_0 |\\psi_k\\rangle$ 。\n", + "\n", + "注意到,由于 $W_0$ 和 $U$ 都是酉矩阵,所以 $W_0^{-1}U$ 还是酉矩阵,根据酉矩阵的单位正交性(酉矩阵的每一行组成的向量单位正交,每一列组成的向量单位正交),对于 $k>0$ 有 $\\langle 0|\\tilde{\\psi}_k\\rangle = 0$ 。\n", + "\n", + "不断持续这一过程,我们得到:\n", + "$$\n", + "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\n", + "$$\n", + "因此,我们得到了 $U$ 的分解:\n", + "$$\n", + "U = W_0 W_1 \\cdots W_{N-2}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "下面我们将说明怎么用二级酉矩阵构造 $W_k$ 。\n", + "\n", + "对于矩阵的第一列 $|\\psi_0\\rangle$ \n", + "$$\n", + "U |0\\rangle = |\\psi_0\\rangle = a_0 |0\\rangle + a_1 |1\\rangle + \\cdots a_{N-1} |N-1\\rangle\n", + "$$\n", + "\n", + "写成矩阵形式\n", + "$$\n", + "U = \\begin{bmatrix}\n", + "a_0 & \\star & \\star & \\cdots & \\star \\\\\n", + "a_1 & \\star & \\star & \\cdots & \\star \\\\\n", + "a_2 & \\star & \\star & \\cdots & \\star \\\\\n", + "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + "a_{N-1} & \\star & \\star & \\cdots & \\star\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们选取 $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$ 相同:\n", + "$$\n", + "W_0 = \\begin{bmatrix}\n", + "a_0 & \\star & \\star & \\cdots & \\star \\\\\n", + "a_1 & \\star & \\star & \\cdots & \\star \\\\\n", + "a_2 & \\star & \\star & \\cdots & \\star \\\\\n", + "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + "a_{N-1} & \\star & \\star & \\cdots & \\star\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "我们可以把 $U$ 写作\n", + "$$\n", + "U = W_0 |0\\rangle \\langle 0| + |\\psi_1\\rangle\\langle 1| + \\cdots + |\\psi_{N-1}\\rangle \\langle N-1|\n", + "$$\n", + "\n", + "因此\n", + "$$\n", + "W_0^{-1}U = |0\\rangle\\langle 0| + | \\tilde{\\psi} _1 \\rangle \\langle 1| + \\cdots | \\tilde{\\psi} _{N-1} \\rangle \\langle N-1|\n", + "$$\n", + "\n", + "将 $W_0^{-1}U$ 记作新的 $U_1$ :\n", + "$$\n", + "U_1 \\equiv W_0^{-1}U = \\begin{bmatrix}\n", + "1 & 0 & 0 & \\cdots & 0 \\\\\n", + "0 & * & * & \\cdots & * \\\\\n", + "0 & * & * & \\cdots & * \\\\\n", + "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + "0 & * & * & \\cdots & *\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "因为我们只能使用二级酉矩阵来构造 $W_0$,下面直接给出构造:\n", + "$$\n", + "W_0 = \\omega_{N-2} \\omega_{N-3} \\cdots \\omega_1 \\omega_0\n", + "$$\n", + "\n", + "其中\n", + "\n", + "$$\\begin{align*} \n", + "\\omega_0 & = \\begin{bmatrix} \n", + "a_0 & b_0^\\star & & & & \\\\ \n", + "b_0 & -a_0^\\star & & & & \\\\ \n", + "& & 1 & & & \\\\ \n", + "& & & \\ddots & \\\\ \n", + "& & & & 1 \n", + "\\end{bmatrix} \\\\ \n", + "& = (I - |0\\rangle \\langle 0| - |1\\rangle \\langle 1|) + a_0 |0\\rangle \\langle 0| + b_0 |1\\rangle \\langle 0| + b_0^\\star |0\\rangle \\langle 1| - a_0^\\star|1\\rangle \\langle 1| \n", + "\\end{align*}$$\n", + "\n", + "其中 $|b_0|^2 = |a_1|^2 + |a_2|^2 + \\cdots |a_{N-1}|^2$ 。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "容易验证\n", + "$$\n", + "\\omega_0 |0\\rangle = a_0 |0\\rangle + b_0 |1\\rangle\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "对于 $0 < k < N$,\n", + "$$\n", + "\\begin{align*}\n", + "\\omega_k & = \\begin{bmatrix}\n", + "1 & & & & & \\\\\n", + "& \\ddots & & & & \\\\\n", + "& & \\frac{a_k}{b_{k-1}} & \\left(\\frac{b_k}{b_{k-1}}\\right)^* & & \\\\\n", + "& & \\frac{b_k}{b_{k-1}} & -\\left(\\frac{a_k}{b_{k-1}}\\right)^* & & \\\\\n", + "& & & & \\ddots & \\\\\n", + "& & & & & 1\n", + "\\end{bmatrix} \\\\\n", + "& = \\left(I - |k\\rangle\\langle k| - |k+1\\rangle\\langle k+1|\\right) \\\\\n", + "& + \\frac{a_k}{b_{k-1}}|k\\rangle\\langle k| + \\frac{b_k}{b_{k-1}}|k+1\\rangle\\langle k| \\\\\n", + "& + \\left(\\frac{b_k}{b_{k-1}}\\right)^* |k\\rangle\\langle k+1| - \\left(\\frac{a_k}{b_{k-1}}\\right)^* |k+1\\rangle\\langle k+1|\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "其中 $|b_k|^2 = |a_{k+1}|^2 + \\cdots |a_{N-1}|^2$ 。\n", + "\n", + "容易验证对于 $0 \\leq k < N$ 有\n", + "$$\n", + "\\omega_k \\omega_{k-1} \\cdots \\omega_1 \\omega_0 |0\\rangle = \n", + "a_0 |0\\rangle + a_1 |1\\rangle + \\cdots + a_{k} |k\\rangle + b_{k} |k+1\\rangle\n", + "$$\n", + "\n", + "因此\n", + "$$\n", + "W_0 |0\\rangle = \\omega_{N-2} \\cdots \\omega_1 \\omega_0 |0\\rangle = |\\psi_0\\rangle\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 另一种方法\n", + "\n", + "下面介绍另一种分解为二级酉矩阵的方法,该方法使用类似于「高斯消元」的思想。\n", + "\n", + "下面以 $3\\times 3$ 的矩阵为例,对于任意 $3\\times 3$ 的酉矩阵 $U$,可以写作\n", + "$$\n", + "U = \\begin{bmatrix}\n", + "a & d & g \\\\\n", + "b & e & h \\\\\n", + "c & f & j\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "我们要找到一系列二级酉矩阵 $U_1, \\ldots , U_3$ 使得\n", + "$$\n", + "U_3 U_2 U_1 U = I\n", + "$$\n", + "那么我们就找到了分解\n", + "$$\n", + "U = U_1^\\dagger U_2^\\dagger U_3^\\dagger\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们使用初等行变换,首先考虑削去 $b$:\n", + "- 如果 $b=0$,那么令 $U_1 = I$;\n", + "- 如果 $b \\neq 0$,那么令\n", + "\n", + "$$\n", + "U_1 = \\begin{bmatrix}\n", + "\\frac{a^\\star}{\\sqrt{|a|^2 + |b|^2}} & \\frac{b^\\star}{\\sqrt{|a|^2 + |b|^2}} & 0 \\\\\n", + "\\frac{b}{\\sqrt{|a|^2 + |b|^2}} & \\frac{-a}{\\sqrt{|a|^2+ |b|^2}} & 0 \\\\\n", + "0 & 0 & 1\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "容易验证 $U_1$ 将削去 $b$,我们得到\n", + "$$\n", + "U_1 U = \\begin{bmatrix}\n", + "a' & d' & g' \\\\\n", + " 0 & e' & h' \\\\\n", + "c' & f' & j'\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "下面考虑削去 $c'$:\n", + "- 如果 $c' = 0$,令 $U_2 = I$;\n", + "- 如果 $c' \\neq 0$,令\n", + "\n", + "$$\n", + "U_2 = \\begin{bmatrix}\n", + "\\frac{{a'}^\\star}{\\sqrt{|a'|^2 + |c'|^2}} & 0 & \\frac{{c'}^\\star}{\\sqrt{|a'|^2 + |c'|^2}} \\\\\n", + "0 & 1 & 0 \\\\\n", + "\\frac{c'}{\\sqrt{|a'|^2 + |c'|^2}} & 0 & \\frac{-a'}{\\sqrt{|a'|^2 + |c'|^2}}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "削去后,矩阵为\n", + "$$\n", + "U_2 U_1 U = \\begin{bmatrix}\n", + "a'' & d'' & g'' \\\\\n", + " 0 & e'' & h'' \\\\\n", + " 0 & f'' & j''\n", + "\\end{bmatrix}\n", + "$$\n", + "因为结果依然为酉矩阵,所以每一行每一列都是单位向量,所以 $a'' = 1$,$d'' = g'' = 0$。\n", + "\n", + "我们令\n", + "$$\n", + "U' = U_2 U_1 U = \\begin{bmatrix}\n", + " 1 & 0 & 0 \\\\\n", + " 0 & e'' & h'' \\\\\n", + " 0 & f'' & j''\n", + "\\end{bmatrix}\n", + "$$\n", + "继续上述过程,直至变成单位阵为止。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "综上所述,对于任意 $N\\times N$ 的酉矩阵,存在一种将其分解为 $O(N^2)$ 个二级酉矩阵的分解。" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n" + ] + } + ], + "source": [ + "from copy import deepcopy\n", + "import numpy as np\n", + "\n", + "def decompose(u):\n", + " n = u.shape[0]\n", + " arr = []\n", + " for j in range(n-1):\n", + " for i in range(j+1, n):\n", + " w = np.identity(n, dtype=np.complex128)\n", + " if np.allclose(u[i, j], 0):\n", + " arr.append(w)\n", + " else:\n", + " a = u[j, j]\n", + " b = u[i, j]\n", + " c = np.sqrt(np.abs(a)**2 + np.abs(b)**2)\n", + " w[j, j] = a.conj() / c\n", + " w[j, i] = b.conj() / c\n", + " w[i, j] = b / c\n", + " w[i, i] = -a / c\n", + " arr.append(w)\n", + " u = w @ u\n", + " w = u.T.conj()\n", + " arr.append(w)\n", + " u = w @ u\n", + " print(np.allclose(u, np.identity(n)))\n", + " return arr\n", + "\n", + "u = np.array([[1, 1, 1, 1],\n", + " [1, 1j, -1, -1j],\n", + " [1, -1, 1, -1],\n", + " [1, -1j, -1, 1j]]) / 2\n", + "u0 = deepcopy(u)\n", + "arr = decompose(u)\n", + "v = np.identity(u.shape[0])\n", + "for a in arr:\n", + " v = v @ a.T.conj()\n", + "print(np.allclose(v, u0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 习题\n", + "\n", + "## Exercise 1\n", + "\n", + "尝试将下面的 $U$ 分解为二级酉矩阵的乘积。\n", + "\n", + "$$\n", + "U = \\frac{1}{2}\\begin{bmatrix}\n", + "1 & 1 & 1 & 1 \\\\\n", + "1 & i & -1 & -i \\\\\n", + "1 & -1 & 1 & -1 \\\\\n", + "1 & -i & -1 & i\n", + "\\end{bmatrix}\n", + "$$" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.0 64-bit ('3.9.0')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "0ed0b97269d4f102e0624f582249018cd3d8c77b83fc4d003b4aaace9dedf79d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture14.ipynb b/lecture14.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..f373e2ab9266bf0b69250958855c97e030853ef9 --- /dev/null +++ b/lecture14.ipynb @@ -0,0 +1,542 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 分解二级酉矩阵\n", + "\n", + "在lecture 13中,我们已经学会将任意酉矩阵分解为若干二级酉矩阵的乘积,那么下一个目标就是将二级酉矩阵用我们所熟知的单比特门和双比特门来构造出来。\n", + "\n", + "## 只有一位不同\n", + "\n", + "二级矩阵具有这样的性质:除了两个下标 $s$ 和 $t$ 对应的子空间 $|s\\rangle$ 和 $|t\\rangle$,对于其他的空间不做变换(保持不变)。设有 $n$ 个量子比特,标准正交基为 $|0\\rangle, \\ldots, |2^n-1\\rangle$,如果 $s$ 和 $t$ 的二进制中只有一位数字不同,例如:\n", + "$$\n", + "|s\\rangle \\equiv |111\\ldots 10\\rangle = |c\\rangle|0\\rangle \\\\\n", + "|t\\rangle \\equiv |111\\ldots 11\\rangle = |c\\rangle|1\\rangle\n", + "$$\n", + "\n", + "不妨设二级矩阵 $U$ 为\n", + "$$\n", + "U = \\begin{bmatrix}\n", + "1 & & & \\\\\n", + "& \\ddots & & \\\\\n", + "& & a & c \\\\\n", + "& & b & d\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "我们可以将其写成外积形式:\n", + "\n", + "$$\\begin{align*}\n", + "U = & I - |s\\rangle\\langle s| - |t\\rangle\\langle t| + \\left( a |s\\rangle + b|t\\rangle \\right) \\langle s| + \\left( c|s\\rangle + d|t\\rangle \\right) \\langle t| \\\\\n", + "= & a |c\\rangle\\langle c|\\otimes |0\\rangle\\langle 0| + b|c\\rangle\\langle c| \\otimes |1\\rangle\\langle 0| \\\\\n", + " & + c |c\\rangle\\langle c|\\otimes |0\\rangle\\langle 1| + d|c\\rangle\\langle c|\\otimes |1\\rangle\\langle 1| \\\\\n", + " & + I\\otimes I - |c\\rangle\\langle c| \\otimes \\left(|0\\rangle\\langle 0| + |1\\rangle\\langle 1|\\right) \\\\\n", + "= & I\\otimes I - |c\\rangle\\langle c|\\otimes I \\\\\n", + " & + |c\\rangle\\langle c|\\otimes \\left( a|0\\rangle\\langle 0| + b|1\\rangle\\langle 0| + c|0\\rangle\\langle 1| + d|1\\rangle\\langle 1|\\right) \\\\\n", + "= & \\left(I - |c\\rangle\\langle c|\\right)\\otimes I + |c\\rangle\\langle c|\\otimes \\tilde{U} \\\\\n", + "= & C(\\tilde{U})\n", + "\\end{align*}$$\n", + "\n", + "其中 $\\tilde{U} = \\begin{bmatrix} a & c \\\\ b & d \\end{bmatrix}$ 是一个单比特门。\n", + "\n", + "这说明,如果 $s$ 和 $t$ 二进制仅有一位数字不同,那么这个二级矩阵 $U$ 可以使用 $C^{n-1}(\\tilde{U})$ 来实现。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\nU\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\n\n\nX\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "from mindquantum import C\n", + "from mindquantum.core.circuit import Circuit\n", + "from mindquantum.core.gates import X, UnivMathGate\n", + "import numpy as np\n", + "from IPython.display import display_svg\n", + "\n", + "u = np.array([\n", + " [1, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 1, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 1, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 1, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 1],\n", + " [0, 0, 0, 0, 0, 0, 1, 0]\n", + "])\n", + "circ1 = Circuit()\n", + "circ1 += UnivMathGate(\"U\", u).on([0, 1, 2])\n", + "display_svg(circ1.svg())\n", + "\n", + "circ2 = Circuit()\n", + "circ2 += X.on(0, [1, 2])\n", + "display_svg(circ2.svg())\n", + "\n", + "print(np.allclose(circ1.matrix(), circ2.matrix()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 任意的二级矩阵\n", + "\n", + "如果有多位不同,怎么办?下面介绍格雷码(Gray code):格雷码是一种二进制编码,每个相邻码位之间**有且仅有**一位二进制数字不同。\n", + "\n", + "利用格雷码,我们可以将任意 $s$ 和 $t$ 关联起来,事实上,因为 $d(s,t) \\leq n$,所以我们可以生成长度不超过 $n+1$ 的格雷码序列:\n", + "$$\n", + "s = g_0, g_1, g_2, \\ldots, g_{m-1}, g_m = t, \\quad \\text{where }m\\leq n\n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "接下来,我们通过「交换」将 $s$ 移动到 $g_{m-1}$ ,这样 $s$ 和 $t$ 就相邻了,执行 $U$ 操作,然后再「交换」回来就完成了。\n", + "\n", + "我们这样构造「交换」操作:\n", + "$$\n", + "\\begin{align*}\n", + "G_k & = (I - |g_{k-1}\\rangle\\langle g_{k-1}| - |g_k\\rangle\\langle g_k|) + \n", + "|g_k\\rangle\\langle g_{k-1}| + |g_{k-1}\\rangle\\langle g_k| \\\\\n", + "& = \\begin{pmatrix}\n", + "g_0 & \\cdots & g_{k-1} & g_{k} & \\cdots & g_m \\\\\n", + "g_0 & \\cdots & g_k & g_{k-1} & \\cdots & g_m\n", + "\\end{pmatrix} = \\begin{pmatrix}\n", + "g_{k} & g_{k-1}\n", + "\\end{pmatrix}\n", + "\\end{align*}\n", + "$$\n", + "\n", + "> 这里使用**循环群**的记号方便书写。\n", + "> \n", + "> $\\begin{pmatrix} a & b & c \\\\ b & c & a\\end{pmatrix}$ 表示 $a\\rightarrow b, b\\rightarrow c, c\\rightarrow a$ 的映射。可以简记为 $\\begin{pmatrix}a & b & c\\end{pmatrix}$ .\n", + "\n", + "结合 $U$ 的定义\n", + "\n", + "$$\\begin{align*}\n", + "U = & (I - |s\\rangle\\langle s| - |t\\rangle\\langle t|) \\\\\n", + " & + \\left( a |s\\rangle + b|t\\rangle \\right) \\langle s| + \\left( c|s\\rangle + d|t\\rangle \\right) \\langle t| \\\\\n", + " = & \\begin{pmatrix}\n", + " s & t \\\\\n", + " a s + b t & c s + d t \n", + "\\end{pmatrix}\n", + "\\end{align*}$$\n", + "\n", + "> 这里 $\\begin{pmatrix} s & t \\\\ a s + b t & c s + d t \\end{pmatrix}$ 表示 $|s\\rangle \\rightarrow a|s\\rangle + b|t\\rangle, |t\\rangle \\rightarrow c|s\\rangle + d|t\\rangle$ 的映射。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{align*}\n", + "& G_1 \\cdots G_{m-1} \\tilde{U} G_{m-1}\\cdots G_1 \\\\\n", + "= & G_1\\cdots G_{m-1} \\tilde{U} G_{m-1}\\cdots G_3 \\begin{pmatrix}\n", + "g_2 & g_1\n", + "\\end{pmatrix} \\begin{pmatrix}\n", + "g_1 & g_0\n", + "\\end{pmatrix} \\\\\n", + "= & G_1\\cdots G_{m-1} \\tilde{U} G_{m-1}\\cdots G_3 \\begin{pmatrix}\n", + "g_2 & g_1 & g_0\n", + "\\end{pmatrix} \\\\\n", + "= & G_1\\cdots G_{m-1} \\tilde{U} \\begin{pmatrix}\n", + "g_{m-1} & \\cdots & g_1 & g_0\n", + "\\end{pmatrix} \\\\\n", + "= & \\begin{pmatrix}\n", + "g_0 & \\cdots & g_{m-1}\n", + "\\end{pmatrix} \\tilde{U} \\begin{pmatrix}\n", + "g_{m-1} & \\cdots & g_0\n", + "\\end{pmatrix} \\\\\n", + "= & \\begin{pmatrix}\n", + "g_0 & \\cdots & g_{m-1}\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "g_{m-1} & g_m \\\\\n", + "a g_{m-1} + b g_m & c g_{m-1} + d g_m\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "g_{m-1} & \\cdots & g_0\n", + "\\end{pmatrix} \\\\\n", + "= & \\begin{pmatrix}\n", + "g_{0} & g_m \\\\\n", + "a g_{0} + b g_m & c g_{0} + d g_m\n", + "\\end{pmatrix} = U\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "每个交换操作 $G_k$ 和 $\\tilde{U}$ 都是二级酉矩阵,而且其作用的两个态之间有且仅有一位不同,所以可以使用我们上一节中的结论,使用单目标比特、多控制比特的门来实现。\n", + "\n", + "对于单目标比特、多控制比特的门,我们可以使用辅助比特和Toffoli门来实现。如下所示,q0,q1,q2,q3,q4 为控制比特,q5,q6,q7,q8为辅助比特,初始值为 $|0\\rangle$,q9是目标比特,作用 H 门,通过枚举所有可能的输入,对比输出发现两个线路是等价的。" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\nq3:\n \n\nq4:\n \n\nq5:\n \n\nq6:\n \n\nq7:\n \n\nq8:\n \n\nq9:\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\nH\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\nq3:\n \n\nq4:\n \n\nq5:\n \n\nq6:\n \n\nq7:\n \n\nq8:\n \n\nq9:\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nH\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n\n\n\nI\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from mindquantum.core.circuit import Circuit\n", + "from mindquantum.core.gates import X, H, I\n", + "from IPython.display import display_svg\n", + "import numpy as np\n", + "from mindquantum.simulator import Simulator\n", + "\n", + "circ1 = Circuit()\n", + "circ1 += X.on(5, [0, 1])\n", + "circ1 += X.on(6, [5, 2])\n", + "circ1 += X.on(7, [6, 3])\n", + "circ1 += X.on(8, [7, 4])\n", + "circ1 += H.on(9, 8)\n", + "circ1 += X.on(8, [7, 4])\n", + "circ1 += X.on(7, [6, 3])\n", + "circ1 += X.on(6, [5, 2])\n", + "circ1 += X.on(5, [0, 1])\n", + "display_svg(circ1.svg())\n", + "\n", + "circ2 = Circuit()\n", + "circ2 += H.on(9, [0, 1, 2, 3, 4])\n", + "for q in range(10):\n", + " circ2 += I.on(q)\n", + "display_svg(circ2.svg())\n", + "\n", + "def check(c1, c2):\n", + " sim = Simulator(\"projectq\", 10)\n", + "\n", + " def calc(s):\n", + " sim.set_qs(s)\n", + " sim.apply_circuit(c1)\n", + " t1 = sim.get_qs()\n", + " sim.set_qs(s)\n", + " sim.apply_circuit(c2)\n", + " t2 = sim.get_qs()\n", + " return np.allclose(t1, t2)\n", + "\n", + " for mask in range(2 ** 5):\n", + " s = np.array([1])\n", + " for b in range(5):\n", + " if mask & (1< 0:\n", + " s = np.kron(np.array([1, 0]), s)\n", + " else:\n", + " s = np.kron(np.array([0, 1]), s)\n", + " for b in range(5, 9):\n", + " s = np.kron(np.array([1, 0]), s)\n", + " s1 = np.kron(np.array([1, 0]), s)\n", + " s2 = np.kron(np.array([0, 1]), s)\n", + " if not calc(s1) or not calc(s2):\n", + " return False\n", + " return True\n", + "\n", + "check(circ1, circ2)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "而Toffoli门可以通过下面的线路实现:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\n\n\nX\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\nH\n \n\n\n\n\n\n\n\n\n\nT\n \n\n†\n \n\n\n\n\n\n\n\n\n\nT\n \n\n\n\n\n\n\n\n\n\nT\n \n\n†\n \n\n\n\n\n\n\n\n\n\nT\n \n\n\n\n\nT\n \n\n†\n \n\n\n\n\nH\n \n\n\n\n\n\n\n\n\n\nT\n \n\n†\n \n\n\n\n\n\n\n\n\n\nT\n \n\n\n\n\nS\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "from mindquantum.core.circuit import Circuit\n", + "from mindquantum.core.gates import H, X, T, S\n", + "from IPython.display import display_svg\n", + "import numpy as np\n", + "\n", + "c1 = Circuit()\n", + "c1 += X.on(2, [0, 1])\n", + "display_svg(c1.svg())\n", + "\n", + "c2 = Circuit()\n", + "c2 += H.on(2)\n", + "c2 += X.on(2, 1)\n", + "c2 += T.hermitian().on(2)\n", + "c2 += X.on(2, 0)\n", + "c2 += T.on(2)\n", + "c2 += X.on(2, 1)\n", + "c2 += T.hermitian().on(2)\n", + "c2 += X.on(2, 0)\n", + "c2 += T.on(2)\n", + "c2 += T.hermitian().on(1)\n", + "c2 += H.on(2)\n", + "c2 += X.on(1, 0)\n", + "c2 += T.hermitian().on(1)\n", + "c2 += X.on(1, 0)\n", + "c2 += T.on(0)\n", + "c2 += S.on(1)\n", + "display_svg(c2.svg())\n", + "\n", + "print(np.allclose(c1.matrix(), c2.matrix()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "综上所述,结合lecture 13的内容,我们已经实现了对于任意酉矩阵,将其用单量子门和双量子门来实现。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "下面举一个例子:$U$ 是一个二级酉矩阵,如下所示:\n", + "$$\n", + "U = \\begin{bmatrix}\n", + "1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n", + "0 & \\frac{1}{\\sqrt{2}} & 0 & 0 & 0 & 0 & \\frac{1}{\\sqrt{2}} & 0 \\\\\n", + "0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\\\\n", + "0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\\\\n", + "0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\\\\n", + "0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\\\\n", + "0 & \\frac{1}{\\sqrt{2}} & 0 & 0 & 0 & 0 & -\\frac{1}{\\sqrt{2}} & 0 \\\\\n", + "0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\\\\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "从中我们可以看出 $s = 001$,$t = 110$,$\\tilde{U} = {1\\over\\sqrt{2}}\\begin{bmatrix}1 & 1 \\\\ 1 & -1 \\end{bmatrix} = H$。\n", + "\n", + "我们构造格雷码:\n", + "$$\n", + "\\begin{align*}\n", + "g_0 & = 001 = s \\\\\n", + "g_1 & = 000 \\\\\n", + "g_2 & = 010 \\\\\n", + "g_3 & = 110 = t\n", + "\\end{align*}\n", + "$$\n", + "\n", + "线路如下:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\nU\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "
\n\n\nq0:\n \n\nq1:\n \n\nq2:\n \n\n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\nX\n \n\n\n\n\n\n\nH\n \n\n\n\n\nX\n \n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\n\n\nX\n \n\n\n\n\nX\n \n\n\n\n\nX\n \n\n
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "from mindquantum.core.circuit import Circuit\n", + "from mindquantum.core.gates import X, H, UnivMathGate, BarrierGate\n", + "from IPython.display import display_svg\n", + "import numpy as np\n", + "\n", + "v = 1 / np.sqrt(2)\n", + "u = np.array([\n", + " [1, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, v, 0, 0, 0, 0, v, 0],\n", + " [0, 0, 1, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 1, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 0, 0],\n", + " [0, v, 0, 0, 0, 0, -v, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 1],\n", + "])\n", + "c1 = Circuit()\n", + "c1 += UnivMathGate(\"U\", u).on([0, 1, 2])\n", + "display_svg(c1.svg())\n", + "\n", + "c2 = Circuit()\n", + "# G1\n", + "c2 += X.on(1)\n", + "c2 += X.on(2)\n", + "c2 += X.on(0, [1,2])\n", + "c2 += X.on(1)\n", + "c2 += X.on(2)\n", + "c2 += BarrierGate()\n", + "# G2\n", + "c2 += X.on(0)\n", + "c2 += X.on(2)\n", + "c2 += X.on(1, [0, 2])\n", + "c2 += X.on(0)\n", + "c2 += X.on(2)\n", + "c2 += BarrierGate()\n", + "# U\n", + "c2 += X.on(0)\n", + "c2 += H.on(2, [0, 1])\n", + "c2 += X.on(0)\n", + "c2 += BarrierGate()\n", + "# G2\n", + "c2 += X.on(0)\n", + "c2 += X.on(2)\n", + "c2 += X.on(1, [0, 2])\n", + "c2 += X.on(0)\n", + "c2 += X.on(2)\n", + "c2 += BarrierGate()\n", + "# G1\n", + "c2 += X.on(1)\n", + "c2 += X.on(2)\n", + "c2 += X.on(0, [1,2])\n", + "c2 += X.on(1)\n", + "c2 += X.on(2)\n", + "\n", + "display_svg(c2.svg())\n", + "\n", + "print(np.allclose(c1.matrix(), c2.matrix()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 习题\n", + "\n", + "## Exercise 1\n", + "\n", + "给出下面这个二级酉矩阵的分解。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "v = 1 / np.sqrt(2)\n", + "u = np.array([\n", + " [v, 0, 0, 0, 0, 0, 0, v],\n", + " [0, 1, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 1, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 1, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 1, 0],\n", + " [v, 0, 0, 0, 0, 0, 0, -v],\n", + "])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.0 64-bit ('3.9.0')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "0ed0b97269d4f102e0624f582249018cd3d8c77b83fc4d003b4aaace9dedf79d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}