StateDiscrimination_CN.ipynb 15.3 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4
{
 "cells": [
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
5
   "id": "dda97799",
Q
Quleaf 已提交
6 7 8 9 10 11 12 13 14 15
   "metadata": {},
   "source": [
    "# 利用 LOCC 来进行两方量子态分辨\n",
    "\n",
    "\n",
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
16
   "id": "4942c442",
Q
Quleaf 已提交
17 18 19 20
   "metadata": {},
   "source": [
    "## 概述\n",
    "\n",
Q
Quleaf 已提交
21
    "量子态分辨(quantum state discrimination, QSD)[1-2] 是量子通信,量子计算和量子密码学中的一个基本问题。本教程展示了如何通过本地量子操作和经典通信(LOCC)来区分满足 $\\langle\\psi\\lvert\\phi\\rangle=0$ 的两个正交的两方纯态 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$。本教程中使用的方法和理论参考了 [3] 。\n"
Q
Quleaf 已提交
22 23 24 25
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
26
   "id": "e7347c1f",
Q
Quleaf 已提交
27 28 29 30 31 32 33 34 35
   "metadata": {},
   "source": [
    "## 寻找一个态分辨协议\n",
    "\n",
    "首先,我们将需要处理的问题定义清楚。考虑两个在空间上相隔一定距离的参与方 $ A $(Alice)和 $ B $(Bob)共享一对两个量子比特系统,该系统的状态 $|\\varphi\\rangle$ 由第三方 $C$(Charlie)提前制备好分发给参与方。Alice 和 Bob 只是被提前通知了 $|\\varphi\\rangle$ 可能是 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$ 两者其中之一,并且满足条件 $\\langle\\psi\\lvert\\phi\\rangle=0$。然后,Charlie 给参与方提供了很多 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$ 的拷贝并希望 Alice 和 Bob 可以通过这些来正确的分辨出他们现在持有的量子态究竟是 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$ 中的哪一个。\n",
    "\n",
    "在我们提供的 LOCCNet 框架下解决这样一个任务是很轻松的。方便起见,我们还是先采用单轮通讯协议 $r=1$ 的设计。 也就是说 Alice 和 Bob 之间只会进行一次经典通讯。具体的量子神经网络(QNN)见图 1。该任务中的关键步骤是确定损失函数 $ L $。这里我们设置 Alice 和 Bob 都需要对手中量子比特做一次测量,因此有 4 种可能的测量结果 $m_Am_B\\in\\{00, 01, 10, 11\\}$。为了能清晰地区分 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$, 我们不妨定义当测量结果为 $m_Am_B\\in\\{00, 10\\}$ 时将其分类为 $\\lvert\\psi\\rangle$。 类似地,如果参与方的测量结果为 $m_Am_B\\in\\{01, 11\\}$ 时将其分类为 $\\lvert\\phi\\rangle$。此步骤可以理解为在监督学习中为数据添加标签。通过以上标签,我们可以通过分辨协议出错的概率来定义损失函数,\n",
    "\n",
    "$$\n",
Q
Quleaf 已提交
36
    "L = p_{\\lvert\\psi\\rangle\\_01}+p_{\\lvert\\psi\\rangle\\_11}+p_{\\lvert\\phi\\rangle\\_10}+p_{\\lvert\\phi\\rangle\\_00},\n",
Q
Quleaf 已提交
37 38 39 40 41
    "\\tag{1}\n",
    "$$\n",
    "\n",
    "其中 $p_{\\lvert\\psi\\rangle\\_01}$ 代表输入态为 $\\lvert\\psi\\rangle$ 时测量 01 的概率(**注释:** 这是一种分类错误的情况)。接着我们可以通过优化算法来最小化损失函数。\n",
    "\n",
Q
Quleaf 已提交
42
    "![](figures/discrimination-fig-circuit.png \"图 1. 用 LOCCNet 进行两方态分辨的协议示意图\")\n",
Q
Quleaf 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    "<div style=\"text-align:center\">图 1. 用 LOCCNet 进行两方态分辨的协议示意图 </div>\n",
    "\n",
    "我们将整个流程进行如下总结:\n",
    "\n",
    "1. Alice 和 Bob 各自拥有一个二量子比特系统的一部分,整个系统的量子态可能为 $\\lvert\\psi\\rangle$ 或者 $\\lvert\\phi\\rangle$。这两个态正交且均是纯态。\n",
    "2. Alice 对自己的量子比特进行酉变换 $U_A$(单比特通用门)。\n",
    "3. Alice 在计算基(computational basis)上测量其量子比特,测量结果 $m_A\\in \\{0, 1\\}$。然后,她通过经典信道告知 Bob 自己的测量结果。\n",
    "4. Bob 根据 Alice 的测量结果在自己量子比特上施加不同的门。如果 $ m_A = 0 $, Bob 对其持有的量子比特作用 $ U_{B0} $;如果 $ m_A = 1 $,则 Bob 施加 $ U_{B1} $。然后 Bob 测量自己的量子比特得到结果 $m_B \\in \\{0,1\\}$。**注意**:这里 $ U_{B0} $ 和 $ U_{B1} $ 都是单比特上的广义旋转门。\n",
    "5. 计算损失函数 $L = p_{\\lvert\\psi\\rangle\\_01}+p_{\\lvert\\psi\\rangle\\_11}+ p_{\\lvert\\phi\\rangle\\_10}+ p_{\\lvert\\phi\\rangle\\_00}$,并使用基于梯度的优化方法。\n",
    "6. 重复 1-5,直到损失函数收敛。\n",
    "7. Charlie 在 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$ 两个之间随机选一个,并检验 Alice 和 Bob 的分辨方案是否可以正确地进行分辨。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
60
   "id": "d09e6486",
Q
Quleaf 已提交
61 62 63 64 65 66 67 68 69
   "metadata": {},
   "source": [
    "## Paddle Quantum 代码实现\n",
    "\n",
    "首先,我们导入相关的依赖包。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
70
   "execution_count": 2,
Q
Quleaf 已提交
71
   "id": "5fc7fce4",
Q
Quleaf 已提交
72 73
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
74 75
     "end_time": "2021-03-09T04:10:28.022626Z",
     "start_time": "2021-03-09T04:10:23.716087Z"
Q
Quleaf 已提交
76 77 78 79 80 81
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.stats import unitary_group\n",
Q
Quleaf 已提交
82
    "import paddle\n",
Q
Quleaf 已提交
83 84 85 86
    "import paddle_quantum\n",
    "from paddle_quantum.locc import LoccNet\n",
    "# 切换至密度矩阵模式\n",
    "paddle_quantum.set_backend('density_matrix')"
Q
Quleaf 已提交
87 88 89 90
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
91
   "id": "5c5a100c",
Q
Quleaf 已提交
92 93 94 95 96 97 98
   "metadata": {},
   "source": [
    "Charlie 需要随机生成两个正交态 $\\lvert\\psi\\rangle$ 以及 $\\lvert\\phi\\rangle$。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
99
   "execution_count": 3,
Q
Quleaf 已提交
100
   "id": "9abe8856",
Q
Quleaf 已提交
101 102
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
103 104
     "end_time": "2021-03-09T04:10:38.723834Z",
     "start_time": "2021-03-09T04:10:38.718397Z"
Q
Quleaf 已提交
105 106 107 108 109 110 111 112
    }
   },
   "outputs": [],
   "source": [
    "def states_orthogonal_random(n, num=2):\n",
    "    # 随机生成两个正交态\n",
    "    assert num <= 2 ** n, \"return too many orthognal states\"\n",
    "    U = unitary_group.rvs(2 ** n)\n",
Q
Quleaf 已提交
113 114
    "    return_list = [np.array(U[i], dtype=np.complex64) for i in range(num)]\n",
    "\n",
Q
Quleaf 已提交
115 116 117 118 119
    "    return return_list"
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
120
   "id": "724e5c48",
Q
Quleaf 已提交
121 122 123 124 125 126 127
   "metadata": {},
   "source": [
    "下面是我们代码的主要部分,它定义了 Alice 和 Bob 的本地量子操作和损失函数。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
128
   "execution_count": 4,
Q
Quleaf 已提交
129
   "id": "9cca865a",
Q
Quleaf 已提交
130 131
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
132 133
     "end_time": "2021-03-09T04:10:39.769534Z",
     "start_time": "2021-03-09T04:10:39.714589Z"
Q
Quleaf 已提交
134 135 136 137
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
138
    "class Net(LoccNet):\n",
Q
Quleaf 已提交
139 140 141 142 143 144 145 146 147 148
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        # 添加第一个参与方 Alice\n",
    "        # 第一个参数 1 代表着 Alice 手里有几个量子比特\n",
    "        # 第二个参数代表着参与方的名字\n",
    "        self.add_new_party(1, party_name='Alice')\n",
    "        # 添加第二个参与方 Bob\n",
    "        # 第一个参数 1 代表着 Bob 手里有几个量子比特\n",
    "        # 第二个参数代表着参与方的名字\n",
    "        self.add_new_party(1, party_name='Bob')\n",
Q
Quleaf 已提交
149
    "\n",
Q
Quleaf 已提交
150 151
    "        # 将输入态写成密度矩阵形式\n",
    "        _states = states_orthogonal_random(2)\n",
Q
Quleaf 已提交
152
    "        _states = [paddle_quantum.State(np.outer(init_state, init_state.conjugate())) for init_state in _states]\n",
Q
Quleaf 已提交
153
    "        # 初始化整个量子系统并分配量子态\n",
Q
Quleaf 已提交
154
    "        self.set_init_state(_states[0], [('Alice', 0), ('Bob', 0)])\n",
Q
Quleaf 已提交
155 156 157 158
    "        self.psi = self.init_status\n",
    "        self.phi = self.reset_state(self.init_status, _states[1], [('Alice', 0), ('Bob', 0)])\n",
    "\n",
    "        # Alice 的电路\n",
Q
Quleaf 已提交
159
    "        self.cirA = self.create_ansatz('Alice')\n",
Q
Quleaf 已提交
160
    "        # 添加单量子比特通用门\n",
Q
Quleaf 已提交
161 162 163
    "        self.cirA.u3(0)\n",
    "        # Bob 要准备两个电路来应对两个不同的测量结果\n",
    "        self.cirB = [self.create_ansatz('Bob'), self.create_ansatz('Bob')]\n",
Q
Quleaf 已提交
164
    "        # 添加单量子比特通用门\n",
Q
Quleaf 已提交
165 166 167 168
    "        self.cirB[0].u3(0)\n",
    "        self.cirB[1].u3(0)\n",
    "\n",
    "    def run_circuit(self, party, cir, state, res):\n",
Q
Quleaf 已提交
169
    "        # 运行电路\n",
Q
Quleaf 已提交
170
    "        after_state = cir(state)\n",
Q
Quleaf 已提交
171
    "        # 测量电路,记录结果 \n",
Q
Quleaf 已提交
172 173
    "        after_state = self.measure(status=after_state, which_qubits=(party, 0), results_desired=res)\n",
    "\n",
Q
Quleaf 已提交
174
    "        return after_state\n",
Q
Quleaf 已提交
175
    "\n",
Q
Quleaf 已提交
176 177 178
    "    def forward(self):\n",
    "        # 训练过程\n",
    "        # Alice 操作过后的量子态\n",
Q
Quleaf 已提交
179 180
    "        psi = self.run_circuit('Alice', self.cirA, self.psi, ['0', '1'])\n",
    "        phi = self.run_circuit('Alice', self.cirA, self.phi, ['0', '1'])\n",
Q
Quleaf 已提交
181 182 183 184 185
    "\n",
    "        # 定义损失函数\n",
    "        loss = 0\n",
    "        for each_psi in psi:\n",
    "            if each_psi.measured_result == '0':\n",
Q
Quleaf 已提交
186 187
    "                psi_01 = self.run_circuit('Bob', self.cirB[0], each_psi, '1')\n",
    "                loss += psi_01.prob\n",
Q
Quleaf 已提交
188
    "            elif each_psi.measured_result == '1':\n",
Q
Quleaf 已提交
189 190 191 192 193 194 195 196 197
    "                psi_11 = self.run_circuit('Bob', self.cirB[1], each_psi, '1')\n",
    "                loss += psi_11.prob\n",
    "        for each_phi in phi:\n",
    "            if each_phi.measured_result == '0':\n",
    "                phi_00 = self.run_circuit('Bob', self.cirB[0], each_phi, '0')\n",
    "                loss += phi_00.prob\n",
    "            elif each_phi.measured_result == '1':\n",
    "                phi_10 = self.run_circuit('Bob', self.cirB[1], each_phi, '0')\n",
    "                loss += phi_10.prob\n",
Q
Quleaf 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210
    "\n",
    "        return loss\n",
    "\n",
    "    def evaluate(self):\n",
    "        # 测试过程\n",
    "        choice = np.random.choice(['phi', 'psi'])\n",
    "        if choice == 'phi':\n",
    "            self.status = self.phi\n",
    "        else:\n",
    "            self.status = self.psi\n",
    "        print('Charlie 选择的态是', choice)\n",
    "\n",
    "        # Alice 的操作\n",
Q
Quleaf 已提交
211
    "        status = self.run_circuit('Alice', self.cirA, self.status, ['0', '1'])\n",
Q
Quleaf 已提交
212 213 214 215 216
    "        # Bob 的操作 \n",
    "        result_0 = list()\n",
    "        result_1 = list()\n",
    "        for each_status in status:\n",
    "            if each_status.measured_result == '0':\n",
Q
Quleaf 已提交
217 218 219
    "                status = self.run_circuit('Bob', self.cirB[0], each_status, ['0', '1'])\n",
    "                result_0.append(status[0].prob.numpy()[0])\n",
    "                result_0.append(status[1].prob.numpy()[0])\n",
Q
Quleaf 已提交
220
    "            elif each_status.measured_result == '1':\n",
Q
Quleaf 已提交
221 222 223 224 225 226
    "                status = self.run_circuit('Bob', self.cirB[1], each_status, ['0', '1'])\n",
    "                result_1.append(status[0].prob.numpy()[0])\n",
    "                result_1.append(status[1].prob.numpy()[0])\n",
    "\n",
    "        print(\"Alice 和 Bob 将这个态分辨为 psi 的概率为:\", result_0[0] + result_1[0])\n",
    "        print(\"Alice 和 Bob 将这个态分辨为 phi 的概率为:\", result_0[1] + result_1[1])"
Q
Quleaf 已提交
227 228 229 230
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
231
   "id": "1e648ea7",
Q
Quleaf 已提交
232 233 234 235 236 237 238
   "metadata": {},
   "source": [
    "训练 Alice 和 Bob 的电路,然后随机选择两个正交态 $\\lvert\\psi\\rangle$ 和 $\\lvert\\phi\\rangle$ 之一以通过我们训练的电路,以检查它们是否可以区分。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
239
   "execution_count": 6,
Q
Quleaf 已提交
240
   "id": "3c722a55",
Q
Quleaf 已提交
241 242
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
243 244
     "end_time": "2021-03-09T04:10:45.887729Z",
     "start_time": "2021-03-09T04:10:40.821447Z"
Q
Quleaf 已提交
245 246 247 248 249 250 251
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
252 253 254 255 256 257 258 259 260 261 262
      "itr 0: 1.1238832\n",
      "itr 10: 0.32665575\n",
      "itr 20: 0.085007355\n",
      "itr 30: 0.085270524\n",
      "itr 40: 0.026622297\n",
      "itr 50: 0.015240545\n",
      "itr 60: 0.007836903\n",
      "itr 70: 0.004827206\n",
      "itr 80: 0.0035075857\n",
      "itr 90: 0.002215183\n",
      "最小损失: 0.0016813411\n",
Q
Quleaf 已提交
263 264
      "======================== 测试阶段 ===============================\n",
      "Charlie 选择的态是 psi\n",
Q
Quleaf 已提交
265 266
      "Alice 和 Bob 将这个态分辨为 psi 的概率为: 0.9990063\n",
      "Alice 和 Bob 将这个态分辨为 phi 的概率为: 0.0009937042\n",
Q
Quleaf 已提交
267
      "Charlie 选择的态是 phi\n",
Q
Quleaf 已提交
268 269
      "Alice 和 Bob 将这个态分辨为 psi 的概率为: 0.0006236615\n",
      "Alice 和 Bob 将这个态分辨为 phi 的概率为: 0.9993763\n"
Q
Quleaf 已提交
270 271 272 273 274 275 276
     ]
    }
   ],
   "source": [
    "ITR = 100  # 设置训练步数\n",
    "LR = 0.1   # 设置学习速率\n",
    "SEED = 999 # 固定 PQC 中参数的随机种子\n",
Q
Quleaf 已提交
277 278
    "np.random.seed(SEED)\n",
    "paddle.seed(SEED)\n",
Q
Quleaf 已提交
279
    "\n",
Q
Quleaf 已提交
280
    "net = Net()\n",
Q
Quleaf 已提交
281 282
    "params = net.cirA.parameters() + net.cirB[0].parameters() + net.cirB[1].parameters()\n",
    "opt = paddle.optimizer.Adam(learning_rate=LR, parameters=params)\n",
Q
Quleaf 已提交
283 284 285 286 287 288 289 290
    "# 通过梯度下降训练 LOCC 网络以进行 ITR 次迭代\n",
    "for itr in range(ITR):\n",
    "    loss = net()\n",
    "    loss.backward()\n",
    "    opt.minimize(loss)\n",
    "    opt.clear_grad()\n",
    "    if itr % 10 == 0:\n",
    "        print(\"itr \" + str(itr) + \":\", loss.numpy()[0])\n",
Q
Quleaf 已提交
291
    "print(\"最小损失:\", loss.numpy()[0])\n",
Q
Quleaf 已提交
292
    "\n",
Q
Quleaf 已提交
293 294 295 296 297
    "print(\"======================== 测试阶段 ===============================\")\n",
    "np.random.seed(10)\n",
    "net.evaluate()\n",
    "np.random.seed(6)\n",
    "net.evaluate()"
Q
Quleaf 已提交
298 299 300 301
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
302
   "id": "32c38151",
Q
Quleaf 已提交
303 304 305 306 307 308 309 310 311
   "metadata": {},
   "source": [
    "## 结论\n",
    "\n",
    "从模拟结果可以看出,经过训练的量子电路可以准确地分辨出两个正交的量子态,精确度 $>99.9\\%$。这里有一个值得思考的问题:我们是否可以通过添加更多态来推广这种分辨方案?"
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
312
   "id": "249db983",
Q
Quleaf 已提交
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
   "metadata": {},
   "source": [
    "---\n",
    "## 参考文献\n",
    "\n",
    "[1] Barnett, Stephen M., and Sarah Croke. \"Quantum state discrimination.\" [Advances in Optics and Photonics 1.2 (2009): 238-278.](https://www.osapublishing.org/abstract.cfm?id=176580)\n",
    "\n",
    "[2] Chefles, Anthony. \"Quantum state discrimination.\" [Contemporary Physics 41.6 (2000): 401-424.](https://arxiv.org/abs/quant-ph/0010114)\n",
    "\n",
    "[3] Walgate, Jonathan, et al. \"Local distinguishability of multipartite orthogonal quantum states.\" [Physical Review Letters 85.23 (2000): 4972.](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.85.4972)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
Q
Quleaf 已提交
328
   "display_name": "Python 3 (ipykernel)",
Q
Quleaf 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341
   "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",
Q
Quleaf 已提交
342
   "version": "3.8.13"
Q
Quleaf 已提交
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}