diff --git a/lecture20.ipynb b/lecture20.ipynb index 5210a2783e715d8a31841a705466cbbde76acd57..714b514bf17d8d1442afcca48cbe15ed35c09ac1 100644 --- a/lecture20.ipynb +++ b/lecture20.ipynb @@ -62,22 +62,22 @@ "**步骤3:**\n", "\n", "最后,我们只需要区分$|+\\rangle$或$|-\\rangle$态,可以通过作用 Hadamard 门来实现:$H|+\\rangle=|0\\rangle$,$H|-\\rangle=|1\\rangle$\n", - "\n" + "\n", + "![Deutsch Jozsa algorithm](images/Deutsch_Jozsa_algorithm.png)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "X\n", - "q0: ──H─────────●────H───────────\n", + "q0: ───────H────●────H────M(q0)──\n", " │\n", - "q1: ──X────H────X────H────M(q1)──\n" + "q1: ──X────H────X────────────────\n" ] }, { @@ -94,7 +94,7 @@ "data": { "text/html": [ "
shots: 100\n",
-       "Keys: q1│0.00     0.2         0.4         0.6         0.8         1.0\n",
+       "Keys: q0│0.00     0.2         0.4         0.6         0.8         1.0\n",
        "────────┼───────────┴───────────┴───────────┴───────────┴───────────┴\n",
        "       1│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n",
        "\n",
@@ -103,44 +103,42 @@
       ],
       "text/plain": [
        "shots: 100\n",
-       "Keys: q1│0.00     0.2         0.4         0.6         0.8         1.0\n",
+       "Keys: q0│0.00     0.2         0.4         0.6         0.8         1.0\n",
        "────────┼───────────┴───────────┴───────────┴───────────┴───────────┴\n",
        "       1│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n",
        "        │\n",
        "{'1': 100}"
       ]
      },
-     "execution_count": 12,
+     "execution_count": 1,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "from mindquantum import H, Simulator, Circuit, UnivMathGate, IGate, Measure, X, I\n",
+    "from mindquantum.core.gates import H, X, I, Measure, BARRIER\n",
+    "from mindquantum.core.circuit import Circuit\n",
+    "from mindquantum.simulator import Simulator\n",
     "import numpy as np\n",
     "\n",
+    "constant = I.on(1, 0)\n",
+    "balanced = X.on(1, 0)\n",
     "\n",
-    "# const = UnivMathGate('const', np.array([[1, 0], [0, 0]]))\n",
-    "const = X\n",
-    "balanced = IGate()\n",
-    "\n",
+    "# 使 oracle 随机为 constant 或 balanced 的情况\n",
     "rnd = np.random.rand()\n",
     "if rnd < 0.5:\n",
-    "    f = const\n",
+    "    Uf = constant\n",
     "else:\n",
-    "    f = balanced\n",
-    "\n",
+    "    Uf = balanced\n",
     "\n",
-    "print(f)\n",
     "circ = Circuit()\n",
     "circ += X.on(1)\n",
+    "circ += BARRIER\n",
     "circ += H.on(0)\n",
     "circ += H.on(1)\n",
-    "\n",
-    "circ += f.on(1, 0)\n",
+    "circ += Uf\n",
     "circ += H.on(0)\n",
-    "circ += H.on(1)\n",
-    "circ += Measure().on(1)\n",
+    "circ += Measure().on(0)\n",
     "\n",
     "print(circ)\n",
     "sim = Simulator('projectq', circ.n_qubits)\n",
@@ -148,14 +146,19 @@
     "res"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "可以多次运行以上代码,观察不同情况下的测量结果。实践中我们需要引入辅助比特 $q_1$ 来实现$|x\\rangle|y\\rangle\\rightarrow |x\\rangle|y\\oplus f(x)\\rangle$,并且可以用控制 $I$ 门实现 constant 情况,用 $CNOT$ 门实现 balanced 情况。可以看到,当 oracle 是情况 1(constant)时,测量结果全为 0 ;而情况 2(balanced)时,测量结果全为 1 。"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
     "## Deutsch-Jozsa 算法\n",
     "\n",
-    "![Deutsch Jozsa algorithm](images/Deutsch_Jozsa_algorithm.png)\n",
-    "\n",
     "后来,Jozsa 与 Deutsch 合作,将原始算法扩展到多个量子比特案例。\n",
     "\n",
     "Deutsch-Jozsa 算法求解的问题如下:\n",
@@ -203,19 +206,8 @@
     "$$\n",
     "此处未显示的部分在基向量中至少包含一个“1”。例如:$H^{\\otimes 2}|01\\rangle=(|0\\rangle+|1\\rangle)(|0\\rangle-|1\\rangle) / 2=(1 / 2)|00\\rangle+\\ldots$\n",
     "\n",
-    "现在,我们可以很清楚地看到, constant 的幅度为 1,而 balanced 的幅度为 0。总之,我们可以通过应用一次oracle来解决问题,并检查最终输出是否在$|000\\ldots 0\\rangle$。\n",
-    "\n",
-    "## 作业\n",
-    "\n",
-    "请在 MindQuanutum 中实现三比特的 Deutsch-Jozsa 算法。"
+    "现在,我们可以很清楚地看到, constant 的幅度为 1,而 balanced 的幅度为 0。总之,我们可以通过应用一次oracle来解决问题,并检查最终输出是否在$|000\\ldots 0\\rangle$。"
    ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
   }
  ],
  "metadata": {