{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 量子测量\n",
"\n",
"[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r1.8/resource/_static/logo_notebook.png)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r1.8/mindquantum/zh_cn/mindspore_quantum_measurement.ipynb) \n",
"[![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r1.8/resource/_static/logo_download_code.png)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r1.8/mindquantum/zh_cn/mindspore_quantum_measurement.py) \n",
"[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r1.8/resource/_static/logo_source.png)](https://gitee.com/mindspore/docs/blob/r1.8/docs/mindquantum/docs/source_zh_cn/quantum_measurement.ipynb)\n",
"[![在线运行](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r1.8/resource/_static/logo_run_notebook.png)](https://authoring-modelarts-cnnorth4.huaweicloud.com/console/lab?share-url-b64=aHR0cHM6Ly9taW5kc3BvcmUtd2Vic2l0ZS5vYnMuY24tbm9ydGgtNC5teWh1YXdlaWNsb3VkLmNvbS9ub3RlYm9vay9yMS44L21pbmRxdWFudHVtL3poX2NuL21pbmRzcG9yZV9xdWFudHVtX21lYXN1cmVtZW50LmlweW5i&imageid=9549a798-7cce-42b2-a2ae-dcb864f122df)\n",
"\n",
"## 概述\n",
"\n",
"在量子线路设计时,我们最终需要通过测量(measure)操作获得结果,进行测量的时候需要选定特定的基态进行测量,而测量得到的结果是不确定的,测量后量子态也会随机坍塌到我们测量的某个基态上。\n",
"\n",
"量子测量由一组测量算子${M_m}$描述,这些算子作用在被测系统状态空间上,指标$m$表示实验中可能的测量结果,若在测量前,量子系统的状态为$|\\psi⟩$,则结果$m$发生的可能性为:\n",
"\n",
"$$\n",
"p(m)=⟨\\psi|M^\\dagger_mM_m|\\psi⟩\n",
"$$\n",
"\n",
"测量后系统的状态塌缩为:\n",
"\n",
"$$\n",
"\\frac{M_m|\\psi⟩}{\\sqrt{⟨\\psi|M^\\dagger_mM_m|\\psi⟩}}\n",
"$$\n",
"\n",
"测量算子满足完备性方程:\n",
"\n",
"$$\n",
"\\Sigma_mM^\\dagger_mM_m=I\n",
"$$\n",
"\n",
"完备性方程表达了概率之和为1的事实:\n",
"\n",
"$$\n",
"1=\\Sigma_m p(m)=\\Sigma_m ⟨\\psi|M^\\dagger_mM_m|\\psi⟩\n",
"$$\n",
"\n",
"该方程对所有的$|\\psi⟩$都成立,与完备性方程等价,但直接验证完备性方程更简单,所以将完备性方程作为约束条件。\n",
"\n",
"根据选取测量算子的不同,我们常见的测量分成计算基测量、投影测量、Pauli测量等,MindQuantum提供了丰富的测量功能与可视化展示工具,我们利用这些功能进一步学习量子测量。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 计算基测量\n",
"\n",
"我们先对计算基测量有一个简单认识:假设有一个n个量子比特的态,我们对它执行n比特计算基测量,测量后,如果结果为$00 \\cdots0$,表明该n量子比特系统的量子状态已塌缩到$|00 \\cdots0⟩$态;类似地,如果测量其中一个量子比特,那么它表示的$2^n$种情况就会被排除掉一半,即在两个各占一半的空间中,测量操作将量子态投影到其中一个空间,表明该n量子比特系统的量子状态中一个子系统塌缩了。\n",
"\n",
"### 单量子比特在计算基下的测量\n",
"\n",
"计算基测量算子:$M_0=|0⟩⟨0|$和$M_1=|1⟩⟨1|$,注意到每个测量算子都是Hermite的,即满足$M_0^\\dagger=M_0,M_1^\\dagger=M_1$,并且$M^2_0=M_0,M^2_1=M_1$,于是满足完备性关系:\n",
"\n",
"$$\n",
"I=M^\\dagger_0M_0+M^\\dagger_1M_1=M_0+M_1\n",
"$$\n",
"\n",
"假设被测量状态$|\\psi⟩=a|0⟩+b|1⟩$,则获得测量结果0的概率是:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"p(0)&=⟨\\psi|M^\\dagger_0M_0|\\psi⟩\\\\\n",
"&=⟨\\psi|M_0|\\psi⟩\\\\\n",
"&=⟨\\psi|(|0⟩⟨0|)|\\psi⟩\\\\\n",
"&=(⟨\\psi|0⟩)(⟨0|\\psi⟩)\\\\\n",
"&=[(⟨0|a^{\\star}+⟨1|b^{\\star})|0⟩][⟨0|(a|0⟩+b|1⟩)]\\\\\n",
"&=(a^{\\star}⟨0|0⟩+b^{\\star}⟨1|0⟩)(a⟨0|0⟩+b⟨1|0⟩)\\\\\n",
"&=a^{\\star}a\\\\\n",
"&=|a|^2\n",
"\\end{align*}\n",
"$$\n",
"\n",
"类似地,获得测量结果1的概率是$p(1)=|b|^2$。两种情况下,测量后的状态分别为:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\frac{M_0|\\psi⟩}{|a|}=\\frac{a}{|a|}|0⟩\\\\\n",
"\\frac{M_1|\\psi⟩}{|b|}=\\frac{b}{|b|}|1⟩\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"### 多量子比特在计算基下的测量——以双量子比特为例\n",
"\n",
"#### 测量系统中所有比特\n",
"\n",
"双量子比特系统下计算基测量算子:$M_{00}=|00⟩⟨00|,M_{01}=|01⟩⟨01|,M_{10}=|10⟩⟨10|$和$M_{11}=|11⟩⟨11|$,注意到每个测量算子都是Hermite的,即满足$M_{ij}^\\dagger=M_{ij},i,j\\in\\{0,1\\}$,并且$M_{ij}^2=M_{ij}$,于是满足完备性关系:\n",
"\n",
"$$\n",
"I=M^\\dagger_{00}M_{00}+M^\\dagger_{01}M_{01}+M^\\dagger_{10}M_{10}+M^\\dagger_{11}M_{11}=M_{00}+M_{01}+M_{10}+M_{11}\n",
"$$\n",
"\n",
"假设被测量状态$|\\psi⟩=a|00⟩+b|01⟩+c|10⟩+d|11⟩$,则获得测量结果00的概率是:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"p(00)&=⟨\\psi|M^\\dagger_{00}M_{00}|\\psi⟩\\\\\n",
"&=⟨\\psi|M_{00}|\\psi⟩\\\\\n",
"&=⟨\\psi|(|00⟩⟨00|)|\\psi⟩\\\\\n",
"&=(⟨\\psi|00⟩)(⟨00|\\psi⟩)\\\\\n",
"&=[(⟨00|a^{\\star}+⟨01|b^{\\star}+⟨10|c^{\\star}+⟨11|d^{\\star})|00⟩][⟨00|(a|00⟩+b|01⟩+c|10⟩+d|11⟩)]\\\\\n",
"&=(a^{\\star}⟨00|00⟩+b^{\\star}⟨01|00⟩+c^{\\star}⟨10|00⟩+d^{\\star}⟨11|00⟩)(a⟨00|00⟩+b⟨00|01⟩+c⟨00|10⟩+b⟨00|11⟩)\\\\\n",
"&=a^{\\star}a\\\\\n",
"&=|a|^2\n",
"\\end{align*}\n",
"$$\n",
"\n",
"类似地,获得测量结果01的概率是$p(01)=|b|^2$,10的概率是$p(10)=|c|^2$,11的概率是$p(11)=|d|^2$。四种情况下,测量后的状态分别为:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\frac{M_{00}|\\psi⟩}{|a|}=\\frac{a}{|a|}|00⟩\\\\\n",
"\\frac{M_{01}|\\psi⟩}{|b|}=\\frac{b}{|b|}|01⟩\\\\\n",
"\\frac{M_{10}|\\psi⟩}{|c|}=\\frac{c}{|c|}|10⟩\\\\\n",
"\\frac{M_{11}|\\psi⟩}{|d|}=\\frac{d}{|d|}|11⟩\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"#### 测量系统中单个比特\n",
"\n",
"如果测量双量子比特量子状态的第一个量子比特,双计算基测量算子:$M_0=|0⟩⟨0|\\otimes I$和$M_1=|1⟩⟨1|\\otimes I$,注意到每个测量算子都是Hermite的,即满足$M_0^\\dagger=M_0,M_1^\\dagger=M_1$,并且$M^2_0=M_0,M^2_1=M_1$,于是满足完备性关系:\n",
"\n",
"$$\n",
"I=M^\\dagger_0M_0+M^\\dagger_1M_1=M_0+M_1\n",
"$$\n",
"\n",
"假设被测量状态$|\\psi⟩=a|00⟩+b|01⟩+c|10⟩+d|11⟩$,则测量双量子比特量子状态的第一个量子比特,获得测量结果0的概率是:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"p(0)&=⟨\\psi|M^\\dagger_0M_0|\\psi⟩\\\\\n",
"&=⟨\\psi|M_0|\\psi⟩\\\\\n",
"&=⟨\\psi|(|0⟩⟨0|\\otimes I)|\\psi⟩\\\\\n",
"&=(⟨00|a^{\\star}+⟨01|b^{\\star}+⟨10|c^{\\star}+⟨11|d^{\\star})|(|0⟩⟨0|\\otimes I)|(a|00⟩+b|01⟩+c|10⟩+d|11⟩)\\\\\n",
"&=(⟨00|a^{\\star}+⟨01|b^{\\star}+⟨10|c^{\\star}+⟨11|d^{\\star})|(a|00⟩+b|01⟩)\\\\\n",
"&=a^{\\star}a+b^{\\star}b\\\\\n",
"&=|a|^2+|b|^2\n",
"\\end{align*}\n",
"$$\n",
"\n",
"类似地,获得测量结果1的概率是$p(1)=|c|^2+|d|^2$。两种情况下,测量后的状态分别为:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\frac{M_0|\\psi⟩}{\\sqrt{|a|^2+|b|^2}}=\\frac{a}{\\sqrt{|a|^2+|b|^2}}|00⟩+\\frac{b}{\\sqrt{|a|^2+|b|^2}}|01⟩\\\\\n",
"\\frac{M_1|\\psi⟩}{\\sqrt{|c|^2+|d|^2}}=\\frac{c}{\\sqrt{|c|^2+|d|^2}}|10⟩+\\frac{d}{\\sqrt{|c|^2+|d|^2}}|11⟩\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"通过对计算基测量的学习,我们可以直观认识到,在多量子比特态的其中一个比特上做测量,本质是将量子态投影到两个子空间之一中。为了简洁的区分出这两个子空间,我们利用线性代数知识知道,可以通过恰好有两个唯一特征值的矩阵来描述两个正交子空间。\n",
"\n",
"### 计算基测量的MindQuantum实现\n",
"\n",
"接下来我们使用MindQuantum搭建一个含测量操作的量子线路并观察结果,首先导入本教程所依赖的模块。\n",
"*提示:由于HiQ量子云平台JupyterLab环境中svg图片暂时无法显示,请开发者自行打印量子线路。*"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np # 导入numpy库并简写为np\n",
"from mindquantum.core.gates import X, H # 导入量子门H, X\n",
"from mindquantum.simulator import Simulator # 从mindquantum.simulator中导入Simulator类\n",
"from mindquantum.core.circuit import Circuit # 导入Circuit模块,用于搭建量子线路\n",
"from mindquantum.core.gates import Measure # 引入测量门"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"说明:\n",
"\n",
"(1)numpy是一个功能强大的Python库,主要用于对多维数组执行计算,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库;\n",
"\n",
"(2)mindquantum是量子-经典混合计算框架,支持多种量子神经网络的训练和推理;\n",
"\n",
"(3)搭建的量子线路中所需执行的量子门需要从mindquantum.core模块中导入;\n",
"\n",
"(4)运行量子线路所需要的量子模拟器需要从mindquantum.simulator模块中导入;\n",
"\n",
"(5)搭建量子线路所需要的量子线路类Circuit需要从mindquantum.core模块中导入;\n",
"\n",
"(6)对量子线路进行测量需要从mindquantum中导入Measure操作。\n",
"\n",
"我们搭建出一个制备双量子比特均匀叠加态$|\\psi⟩=\\frac{\\sqrt{2}(|00⟩+|11⟩)}{2}$的量子线路,并分别展示在所有量子比特上使用计算基测量和只在0号量子比特上使用计算基测量的结果。\n",
"\n",
"#### MindQuantum实现测量系统中所有比特\n",
"\n",
"在使用代码演示之前,我们先简单计算出理论值。\n",
"\n",
"在所有量子比特上使用计算基测量$|\\psi⟩=\\frac{\\sqrt{2}(|00⟩+|11⟩)}{2}$:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"p(00)&=|a|^2=(\\frac{\\sqrt{2}}{{2}})^2=\\frac{1}{2}\\\\\n",
"p(01)&=|b|^2=0^2=0\\\\\n",
"p(10)&=|c|^2=0^2=0\\\\\n",
"p(11)&=|d|^2=(\\frac{\\sqrt{2}}{{2}})^2=\\frac{1}{2}\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"可以看到,测量结果只有两种可能:00和11,概率均是$\\frac{1}{2}$。测量后的状态分别为:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\frac{a}{|a|}|00⟩=|00⟩\\\\\n",
"\\frac{d}{|d|}|11⟩=|11⟩\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"我们开始搭建制备$|\\psi⟩=\\frac{\\sqrt{2}(|00⟩+|11⟩)}{2}$并在所有比特上做测量的量子线路:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"circ_all = Circuit() # 初始化量子线路\n",
"circ_all += H.on(0) # H门作用在第0位量子比特\n",
"circ_all += X.on(1, 0) # X门作用在第1位量子比特且受第0位量子比特控制\n",
"circ_all += Measure('q0').on(0) # 在0号量子比特作用一个测量,并将该测量命名为'q0'\n",
"circ_all += Measure('q1').on(1) # 在1号量子比特作用一个测量,并将该测量命名为'q1'\n",
"circ_all.svg() # 绘制SVG格式的量子线路图片"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim = Simulator('projectq', 2) # 声明一个2比特的projectq模拟器\n",
"sim.apply_circuit(circ_all).svg() # 在模拟器上运行量子线路"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"可以看到我们得到的测量结果是'00',测量后的量子态塌缩为:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1¦11⟩\n"
]
}
],
"source": [
"print(sim.get_qs(True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"量子态塌缩成了$1|00⟩$,与理论值相符。\n",
"\n",
"如果我们多测量几次,可以发现测量结果也会为'11':"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset() #复位模拟器\n",
"sim.apply_circuit(circ_all).svg() # 在模拟器上运行量子线路"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"打印出此时量子态,可以看到它坍缩成了相应的$|11⟩$:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1¦00⟩\n"
]
}
],
"source": [
"print(sim.get_qs(True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们观察到,测量结果时而为'00'时而为'11',符合理论预期,但是没有办法观察出现00和11的概率是否相同,我们希望可以多次测量,统计出不同结果出现的频率,以此观察结果是否满足预期的概率分布。为此我们使用量子线路采样(Sampling)功能:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset()\n",
"result = sim.sampling(circ_all, shots=1000) # 对上面定义的线路采样1000次\n",
"result.svg()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们可以看到,采样1000中,'00'出现了499次,'11'出现了501次,采样结果符合概率分布,细微的误差是由模拟器噪声导致。仔细阅读的同学可以发现,在[量子模拟器教程](https://www.mindspore.cn/mindquantum/docs/zh-CN/r0.7/quantum_simulator.html)中我们已经展示过该线路的采样结果,但并未解释结果如是分布的原因,在本教程中学习了计算基测量后,相信同学们对该结果分布的认识更加深刻。\n",
"\n",
"#### MindQuantum实现测量系统中单个比特\n",
"\n",
"同样地,在使用代码演示之前,我们先简单计算出理论值。\n",
"\n",
"在0号量子比特上使用计算基测量$|\\psi⟩=\\frac{\\sqrt{2}(|00⟩+|11⟩)}{2}$:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"p(0)=|a|^2+|b|^2=(\\frac{\\sqrt{2}}{{2}})^2=\\frac{1}{2}\\\\\n",
"p(1)=|c|^2+|d|^2=(\\frac{\\sqrt{2}}{{2}})^2=\\frac{1}{2}\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"可以看到,测量结果有两种可能:0和1,概率均是$\\frac{1}{2}$。测量后的状态分别为:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\frac{a}{\\sqrt{|a|^2+|b|^2}}|00⟩+\\frac{b}{\\sqrt{|a|^2+|b|^2}}|01⟩=|00⟩\\\\\n",
"\\frac{c}{\\sqrt{|c|^2+|d|^2}}|10⟩+\\frac{d}{\\sqrt{|c|^2+|d|^2}}|11⟩=|11⟩\\\\\n",
"\\end{align*}\n",
"$$\n",
"\n",
"我们开始搭建制备$|\\psi⟩=\\frac{\\sqrt{2}(|00⟩+|11⟩)}{2}$并在0号量子比特上做测量的量子线路:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"circ_partial = Circuit() # 初始化量子线路\n",
"circ_partial += H.on(0) # H门作用在第0位量子比特\n",
"circ_partial += X.on(1, 0) # X门作用在第1位量子比特且受第0位量子比特控制\n",
"circ_partial += Measure('q0').on(0) # 在0号量子比特作用一个测量,并将该测量命名为'q0'\n",
"circ_partial.svg() # 绘制SVG格式的量子线路图片"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset() # 复位模拟器\n",
"sim.apply_circuit(circ_partial).svg() # 在模拟器上运行量子线路"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"可以看到我们得到的测量结果是'0',测量后的量子态塌缩为:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1¦00⟩\n"
]
}
],
"source": [
"print(sim.get_qs(True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"量子态塌缩成了$1|00⟩$,与理论值相符。\n",
"\n",
"同样地,如果我们多测量几次,可以发现测量结果也会为'1',此处不再演示。我们直接对该量子线路采样1000次观察结果:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "",
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset()\n",
"result = sim.sampling(circ_partial, shots=1000) # 对上面定义的线路采样1000次\n",
"result.svg()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们可以看到,采样1000中,'0'出现了499次,'1'出现了501次。采样结果符合概率分布,细微的误差是由模拟器噪声导致。\n",
"\n",
"以上我们完成了量子计算基测量的学习,接下来我们进入到另一种测量操作的学习:投影测量。\n",
"\n",
"## 投影测量\n",
"\n",
"投影测量(projective measuremen)由被观察系统状态空间上一个可观测量(observable)Hermite算子$M$来描述($M=M^{\\dagger}$),该可观测量具有谱分解:\n",
"\n",
"$$\n",
"M=\\Sigma_{m}mP_m\n",
"$$\n",
"\n",
"这里的$P_m$是在$m$的特征值$m$对应特征空间上的投影,测量的可能结果对应于测量算子的特征值$m$。测量状态$|\\psi⟩$时,得到结果$m$的概率为\n",
"\n",
"$$\n",
"p(m)=⟨\\psi|P_m|\\psi⟩\n",
"$$\n",
"\n",
"测量后量子系统的状态立即为:\n",
"\n",
"$$\n",
"\\frac{P_m|\\psi⟩}{\\sqrt{p(m)}}\n",
"$$\n",
"\n",
"直观解释是,我们对状态$|\\psi⟩$使用$M$投影测量,是把$|\\psi⟩$往$M$的特征空间上投影,有$p_m$的概率投影到空间$V_{m}$中,此时测量结果为该空间对应的特征值$m$。\n",
"\n",
"投影测量一个重要的特征就是很容易计算投影测量的期望值$E(M)$。\n",
"\n",
"$$\n",
"\\begin{align*}\n",
" E(M) &=\\Sigma_i \\lambda_i p_i\\\\\n",
" &=\\Sigma_i \\lambda_i⟨\\psi|P_i|\\psi⟩\\\\\n",
" &=⟨\\psi|(\\Sigma_i\\lambda_i P_i)|\\psi⟩\\\\\n",
" &=⟨\\psi|M|\\psi⟩\n",
"\\end{align*}\n",
"$$\n",
"\n",
"投影测量可以视为一般测量的特殊情况,当测量算子除了满足完备性关系$\\Sigma_mM_m^\\dagger M_m=I$时,还满足$M_m$是正交投影算子的条件,即$M_m$是Hermite的,并且\n",
"\n",
"$$\n",
"M_mM_{m'}=\\delta_{mm'}M_m\n",
"$$\n",
"\n",
"有了这些附加限制,一般测量退化成投影测量。\n",
"\n",
"## Pauli测量\n",
"\n",
"最后我们学习Pauli测量,Pauli测量是投影测量中把可观测量$M$选取为泡利算子。以Pauli-Z测量为例,我们考虑Z算子:\n",
"\n",
"$$\n",
"Z=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&-1\n",
" \\end{array}\n",
"\\right)\n",
"$$\n",
"\n",
"可以看出,Z满足$Z=Z^\\dagger$,即Z是Hermite的。Z有两个特征值+1,-1,对应的特征向量分别为:|0⟩和|1⟩。因此Z的谱分解形式为:\n",
"\n",
"$$\n",
"Z=\\left(\n",
" \\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&-1\n",
" \\end{array}\n",
"\\right)=1\\times|0⟩⟨0|+(-1)\\times|1⟩⟨1|\n",
"$$\n",
"\n",
"使用Z做投影测量,如果测量结果为+1,我们可得出该量子比特的状态被投影到Z算子的+1特征子空间$V_{+1}$中,表明被测量态被投影成了|0⟩,相似地,如果测量结果为-1,可得出该量子比特被投影到-1特征子空间$V_{-1}$中,表明被测量态被投影成了|1⟩,这即为Pauli-Z测量。\n",
"\n",
"MindQuantum中为我们提供了基于给定可观测量H计算投影测量期望值的功能:\n",
"\n",
"`get_expectation(hamiltonian)`可以计算出模拟器当前量子态关于某个观察量的期望值:$E=⟨\\psi|H|\\psi⟩$。**该操作不会改变量子态**。\n",
"\n",
"例如,我们希望对处于$\\frac{\\sqrt{2}}{2}|00⟩+\\frac{\\sqrt{2}}{2}|11⟩$态的系统上的q1比特上作用一个Pauli-Z测量,首先我们将模拟器置位:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.70710678+0.j 0. +0.j 0. +0.j 0.70710678+0.j]\n"
]
}
],
"source": [
"sim = Simulator('projectq', 2) # 声明一个2比特的projectq模拟器\n",
"sim.set_qs(np.array([2**0.5 / 2, 0, 0, 2**0.5 / 2])) # 设置模拟器状态\n",
"print(sim.get_qs())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"然后我们构造出在q1上做Pauli-Z测量对应的哈密顿量hams:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"from mindquantum.core.operators import Hamiltonian # 引入哈密顿量定义模块\n",
"from mindquantum.core.operators import QubitOperator # 引入稀疏算子定义模块\n",
"\n",
"hams = Hamiltonian(QubitOperator('Z1')) # 构建在q1上作Pauli-Z测量的哈密顿量"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"为了深刻认识学习Pauli-Z测量操作,我们先手动计算出模拟器当前量子态在q1上做Pauli-Z测量的期望值,并推算出测量结果为+1,-1的概率:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"E&=⟨\\psi|H|\\psi⟩\\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"(Z \\otimes I) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&-1\\\\\n",
" \\end{array}\n",
"\\right) \\otimes\n",
"\\left(\n",
"\\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&1\\\\\n",
"\\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0&0&0\\\\\n",
" 0&1&0&0\\\\\n",
" 0&0&-1&0\\\\\n",
" 0&0&0&-1\n",
" \\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"0\\\\\n",
"&=1\\times p(1)+(-1)\\times p(-1)\\\\\n",
"&=1\\times p(1)+(-1)\\times (1-p(1))\\\\\n",
"&=p(1)-1+p(-1)\\\\\n",
"\\Longrightarrow&p(1)=p(-1)=0.5\n",
"\\end{align*}\n",
"$$\n",
"\n",
"这说明测量的理论期望值为0,测量出+1,-1的概率均为50%,我们使用MindQuantum提供的`get_expectation()`来验证结果:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0j"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.get_expectation(hams) # 计算出模拟器当前量子态关于hams的期望值"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"可以看到,手动计算和使用`get_expectation(hamiltonian)`计算出的结果相同,符合预期。\n",
"\n",
"我们还可以对处于$\\frac{\\sqrt{2}}{2}|00⟩+\\frac{\\sqrt{2}}{2}|11⟩$态的系统上的q0,q1比特上均作用Pauli-Z测量。类似地构造出在q0,q1上做Pauli-Z测量对应的哈密顿量hams2:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"hams2 = Hamiltonian(QubitOperator('Z0') +\n",
" QubitOperator('Z1')) # 构建在q0,q1上作Pauli-Z测量的哈密顿量"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们同样可以手动计算出模拟器当前量子态在q0,q1上做Pauli-Z测量的期望值:\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"E&=⟨\\psi|H|\\psi⟩\\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"(Z \\otimes I) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right)\n",
"+\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"(I \\otimes Z) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&-1\\\\\n",
" \\end{array}\n",
"\\right) \\otimes\n",
"\\left(\n",
"\\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&1\\\\\n",
"\\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right)\n",
"+\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&1\\\\\n",
" \\end{array}\n",
"\\right) \\otimes\n",
"\\left(\n",
"\\begin{array}{l}\n",
" 1&0\\\\\n",
" 0&-1\\\\\n",
"\\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0&0&0\\\\\n",
" 0&1&0&0\\\\\n",
" 0&0&-1&0\\\\\n",
" 0&0&0&-1\n",
" \\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right)\n",
"+\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}& 0& 0& \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" 1&0&0&0\\\\\n",
" 0&-1&0&0\\\\\n",
" 0&0&1&0\\\\\n",
" 0&0&0&-1\n",
" \\end{array}\n",
"\\right)\n",
"\\times\n",
"\\left(\n",
" \\begin{array}{l}\n",
" \\frac{\\sqrt{2}}{2}\\\\\n",
" 0\\\\\n",
" 0\\\\\n",
" \\frac{\\sqrt{2}}{2}\n",
" \\end{array}\n",
"\\right) \\\\&=\n",
"0+0 \\\\\n",
"&=0\n",
"\\end{align*}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0j"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.set_qs(np.array([2**0.5 / 2, 0, 0, 2**0.5 / 2])) # 设置模拟器状态\n",
"sim.get_expectation(hams2) # 计算出模拟器当前量子态关于hams2的期望值"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"该操作不会改变量子态,我们查看当前量子态:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.70710678+0.j, 0. +0.j, 0. +0.j, 0.70710678+0.j])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.get_qs()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"可以发现,量子态依然是最初设定的$\\frac{\\sqrt{2}}{2}|00⟩+\\frac{\\sqrt{2}}{2}|11⟩$\n",
"\n",
"我们学习认识了量子计算中重要的一个操作——测量,还使用MindQuantum测量量子线路验证我们的理论结果,并使用不同可视化工具展示出测量结果。\n",
"\n",
"想学习MindQuantum中量子线路的高阶操作,构建并训练量子经典混合神经网络,请查看`get_expectation_with_grad()`和`apply_hamitonian()`的文档。\n",
"\n",
"若想查询更多关于MindQuantum的API,请点击:[https://mindspore.cn/mindquantum/](https://mindspore.cn/mindquantum/)。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "MindSpore",
"language": "python",
"name": "mindspore"
},
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}