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", + "" ] }, { "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", - "\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": {