量子测量

下载Notebook下载样例代码查看源文件

概述

在量子线路设计时,我们最终需要通过测量(measure)操作获得结果,进行测量的时候需要选定特定的基态进行测量,而测量得到的结果是不确定的,测量后量子态也会随机坍塌到我们测量的某个基态上。

量子测量由一组测量算子Mm描述,这些算子作用在被测系统状态空间上,指标m表示实验中可能的测量结果,若在测量前,量子系统的状态为|ψ,则结果m发生的可能性为:

p(m)=ψ|MmMm|ψ

测量后系统的状态塌缩为:

Mm|ψψ|MmMm|ψ

测量算子满足完备性方程:

ΣmMmMm=I

完备性方程表达了概率之和为1的事实:

1=Σmp(m)=Σmψ|MmMm|ψ

该方程对所有的|ψ都成立,与完备性方程等价,但直接验证完备性方程更简单,所以将完备性方程作为约束条件。

根据选取测量算子的不同,我们常见的测量分成计算基测量、投影测量、Pauli测量等,MindSpore Quantum提供了丰富的测量功能与可视化展示工具,我们利用这些功能进一步学习量子测量。

计算基测量

我们先对计算基测量有一个简单认识:假设有一个n个量子比特的态,我们对它执行n比特计算基测量,测量后,如果结果为000,表明该n量子比特系统的量子状态已塌缩到|000态;类似地,如果测量其中一个量子比特,那么它表示的2n种情况就会被排除掉一半,即在两个各占一半的空间中,测量操作将量子态投影到其中一个空间,表明该n量子比特系统的量子状态中一个子系统塌缩了。

单量子比特在计算基下的测量

计算基测量算子:M0=|00|M1=|11|,注意到每个测量算子都是Hermite的,即满足M0=M0,M1=M1,并且M02=M0,M12=M1,于是满足完备性关系:

I=M0M0+M1M1=M0+M1

假设被测量状态|ψ=a|0+b|1,则获得测量结果0的概率是:

p(0)=ψ|M0M0|ψ=ψ|M0|ψ=ψ|(|00|)|ψ=(ψ|0)(0|ψ)=[(0|a+1|b)|0][0|(a|0+b|1)]=(a0|0+b1|0)(a0|0+b1|0)=aa=|a|2

类似地,获得测量结果1的概率是p(1)=|b|2。两种情况下,测量后的状态分别为:

M0|ψ|a|=a|a||0M1|ψ|b|=b|b||1

多量子比特在计算基下的测量——以双量子比特为例

测量系统中所有比特

双量子比特系统下计算基测量算子:M00=|0000|,M01=|0101|,M10=|1010|M11=|1111|,注意到每个测量算子都是Hermite的,即满足Mij=Mij,i,j{0,1},并且Mij2=Mij,于是满足完备性关系:

I=M00M00+M01M01+M10M10+M11M11=M00+M01+M10+M11

假设被测量状态|ψ=a|00+b|01+c|10+d|11,则获得测量结果00的概率是:

p(00)=ψ|M00M00|ψ=ψ|M00|ψ=ψ|(|0000|)|ψ=(ψ|00)(00|ψ)=[(00|a+01|b+10|c+11|d)|00][00|(a|00+b|01+c|10+d|11)]=(a00|00+b01|00+c10|00+d11|00)(a00|00+b00|01+c00|10+b00|11)=aa=|a|2

类似地,获得测量结果01的概率是p(01)=|b|2,10的概率是p(10)=|c|2,11的概率是p(11)=|d|2。四种情况下,测量后的状态分别为:

M00|ψ|a|=a|a||00M01|ψ|b|=b|b||01M10|ψ|c|=c|c||10M11|ψ|d|=d|d||11

测量系统中单个比特

如果测量双量子比特量子状态的第一个量子比特,双计算基测量算子:M0=|00|IM1=|11|I,注意到每个测量算子都是Hermite的,即满足M0=M0,M1=M1,并且M02=M0,M12=M1,于是满足完备性关系:

I=M0M0+M1M1=M0+M1

假设被测量状态|ψ=a|00+b|01+c|10+d|11,则测量双量子比特量子状态的第一个量子比特,获得测量结果0的概率是:

p(0)=ψ|M0M0|ψ=ψ|M0|ψ=ψ|(|00|I)|ψ=(00|a+01|b+10|c+11|d)|(|00|I)|(a|00+b|01+c|10+d|11)=(00|a+01|b+10|c+11|d)|(a|00+b|01)=aa+bb=|a|2+|b|2

类似地,获得测量结果1的概率是p(1)=|c|2+|d|2。两种情况下,测量后的状态分别为:

M0|ψ|a|2+|b|2=a|a|2+|b|2|00+b|a|2+|b|2|01M1|ψ|c|2+|d|2=c|c|2+|d|2|10+d|c|2+|d|2|11

通过对计算基测量的学习,我们可以直观认识到,在多量子比特态的其中一个比特上做测量,本质是将量子态投影到两个子空间之一中。为了简洁的区分出这两个子空间,我们利用线性代数知识知道,可以通过恰好有两个唯一特征值的矩阵来描述两个正交子空间。

计算基测量的MindSpore Quantum实现

接下来我们使用MindSpore Quantum搭建一个含测量操作的量子线路并观察结果,首先导入本教程所依赖的模块。

[1]:
import numpy as np                           # 导入numpy库并简写为np
from mindquantum.core.gates import X, H      # 导入量子门H, X
from mindquantum.simulator import Simulator  # 从mindquantum.simulator中导入Simulator类
from mindquantum.core.circuit import Circuit # 导入Circuit模块,用于搭建量子线路
from mindquantum.core.gates import Measure   # 引入测量门

说明:

(1)numpy是一个功能强大的Python库,主要用于对多维数组执行计算,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库;

(2)mindquantum是量子-经典混合计算框架,支持多种量子神经网络的训练和推理;

(3)搭建的量子线路中所需执行的量子门需要从 mindquantum.core 模块中导入;

(4)运行量子线路所需要的量子模拟器需要从 mindquantum.simulator 模块中导入;

(5)搭建量子线路所需要的量子线路类 Circuit 需要从 mindquantum.core 模块中导入;

(6)对量子线路进行测量需要从 mindquantum 中导入 Measure 操作。

我们搭建出一个制备双量子比特均匀叠加态|ψ=2(|00+|11)2的量子线路,并分别展示在所有量子比特上使用计算基测量和只在0号量子比特上使用计算基测量的结果。

MindSpore Quantum实现测量系统中所有比特

在使用代码演示之前,我们先简单计算出理论值。

在所有量子比特上使用计算基测量|ψ=2(|00+|11)2

p(00)=|a|2=(22)2=12p(01)=|b|2=02=0p(10)=|c|2=02=0p(11)=|d|2=(22)2=12

可以看到,测量结果只有两种可能:00和11,概率均是12。测量后的状态分别为:

a|a||00=|00d|d||11=|11

我们开始搭建制备|ψ=2(|00+|11)2并在所有比特上做测量的量子线路:

[2]:
circ_all = Circuit()             # 初始化量子线路
circ_all += H.on(0)              # H门作用在第0位量子比特
circ_all += X.on(1, 0)           # X门作用在第1位量子比特且受第0位量子比特控制
circ_all += Measure('q0').on(0)  # 在0号量子比特作用一个测量,并将该测量命名为'q0'
circ_all += Measure('q1').on(1)  # 在1号量子比特作用一个测量,并将该测量命名为'q1'
circ_all.svg()                   # 绘制SVG格式的量子线路图片
[2]:
../_images/beginner_quantum_measurement_4_0.svg
[3]:
sim = Simulator('mqvector', 2)        # 声明一个2比特的mqvector模拟器
sim.apply_circuit(circ_all).svg()     # 在模拟器上运行量子线路
[3]:
../_images/beginner_quantum_measurement_5_0.svg

可以看到我们得到的测量结果是’11’(由于测量具有随机性,此处的结果在执行时也有可能时’00’),测量后的量子态塌缩为:

[4]:
print(sim.get_qs(True))
1¦11⟩

量子态塌缩成了1|11,与理论值相符。

如果我们多测量几次,可以发现测量结果也会为’00’ (请执行多次观察不同的结果):

[5]:
sim.reset()                         #复位模拟器
sim.apply_circuit(circ_all).svg()   # 在模拟器上运行量子线路
[5]:
../_images/beginner_quantum_measurement_9_0.svg

打印出此时量子态,可以看到它坍缩成了相应的|00

[6]:
print(sim.get_qs(True))
1¦00⟩

我们观察到,测量结果时而为’00’时而为’11’,符合理论预期,但是没有办法观察出现00和11的概率是否相同,我们希望可以多次测量,统计出不同结果出现的频率,以此观察结果是否满足预期的概率分布。为此我们使用量子线路采样(Sampling)功能:

[7]:
sim.reset()
result = sim.sampling(circ_all, shots=1000)  # 对上面定义的线路采样1000次
result.svg()
[7]:
../_images/beginner_quantum_measurement_13_0.svg

我们可以看到,采样1000中,’00’出现了503次,’11’出现了497次(由于测量具有随机性,每次运行结果会略有不同),采样结果符合概率分布,细微的误差是由模拟器噪声导致。仔细阅读的同学可以发现,在量子模拟器教程中我们已经展示过该线路的采样结果,但并未解释结果如是分布的原因,在本教程中学习了计算基测量后,相信同学们对该结果分布的认识更加深刻。

MindSpore Quantum实现测量系统中单个比特

同样地,在使用代码演示之前,我们先简单计算出理论值。

在0号量子比特上使用计算基测量|ψ=2(|00+|11)2

p(0)=|a|2+|b|2=(22)2=12p(1)=|c|2+|d|2=(22)2=12

可以看到,测量结果有两种可能:0和1,概率均是12。测量后的状态分别为:

a|a|2+|b|2|00+b|a|2+|b|2|01=|00c|c|2+|d|2|10+d|c|2+|d|2|11=|11

我们开始搭建制备|ψ=2(|00+|11)2并在0号量子比特上做测量的量子线路:

[8]:
circ_partial = Circuit()             # 初始化量子线路
circ_partial += H.on(0)              # H门作用在第0位量子比特
circ_partial += X.on(1, 0)           # X门作用在第1位量子比特且受第0位量子比特控制
circ_partial += Measure('q0').on(0)  # 在0号量子比特作用一个测量,并将该测量命名为'q0'
circ_partial.svg()                   # 绘制SVG格式的量子线路图片
[8]:
../_images/beginner_quantum_measurement_15_0.svg
[9]:
sim.reset()                            # 复位模拟器
sim.apply_circuit(circ_partial).svg()  # 在模拟器上运行量子线路
[9]:
../_images/beginner_quantum_measurement_16_0.svg

可以看到我们得到的测量结果是’1’(由于测量具有随机性,执行时有可能测量结果为’0’),测量后的量子态塌缩为:

[10]:
print(sim.get_qs(True))
1¦11⟩

量子态塌缩成了1|11,与理论值相符。

同样地,如果我们多测量几次,可以发现测量结果也会为’0’,此处不再演示。我们直接对该量子线路采样1000次观察结果:

[11]:
sim.reset()
result = sim.sampling(circ_partial, shots=1000)  # 对上面定义的线路采样1000次
result.svg()
[11]:
../_images/beginner_quantum_measurement_20_0.svg

我们可以看到,采样1000中,’0’出现了500次,’1’出现了500次。采样结果符合概率分布,细微的误差是由模拟器噪声导致。

以上我们完成了量子计算基测量的学习,接下来我们进入到另一种测量操作的学习:投影测量。

投影测量

投影测量(projective measuremen)由被观察系统状态空间上一个可观测量(observable)Hermite算子M来描述(M=M),该可观测量具有谱分解:

M=ΣmmPm

这里的Pm是在m的特征值m对应特征空间上的投影,测量的可能结果对应于测量算子的特征值m。测量状态|ψ时,得到结果m的概率为

p(m)=ψ|Pm|ψ

测量后量子系统的状态立即为:

Pm|ψp(m)

直观解释是,我们对状态|ψ使用M投影测量,是把|ψM的特征空间上投影,有pm的概率投影到空间Vm中,此时测量结果为该空间对应的特征值m

投影测量一个重要的特征就是很容易计算投影测量的期望值E(M)

E(M)=Σiλipi=Σiλiψ|Pi|ψ=ψ|(ΣiλiPi)|ψ=ψ|M|ψ

投影测量可以视为一般测量的特殊情况,当测量算子除了满足完备性关系ΣmMmMm=I时,还满足Mm是正交投影算子的条件,即Mm是Hermite的,并且

MmMm=δmmMm

有了这些附加限制,一般测量退化成投影测量。

Pauli测量

最后我们学习Pauli测量,Pauli测量是投影测量中把可观测量M选取为泡利算子。以Pauli-Z测量为例,我们考虑Z算子:

Z=(1001)

可以看出,Z满足Z=Z,即Z是Hermite的。Z有两个特征值+1,-1,对应的特征向量分别为:|0⟩和|1⟩。因此Z的谱分解形式为:

Z=(1001)=1×|00|+(1)×|11|

使用Z做投影测量,如果测量结果为+1,我们可得出该量子比特的状态被投影到Z算子的+1特征子空间V+1中,表明被测量态被投影成了|0⟩,相似地,如果测量结果为-1,可得出该量子比特被投影到-1特征子空间V1中,表明被测量态被投影成了|1⟩,这即为Pauli-Z测量。

MindSpore Quantum中为我们提供了基于给定可观测量H计算投影测量期望值的功能:

get_expectation(hamiltonian) 可以计算出模拟器当前量子态关于某个观察量的期望值:E=ψ|H|ψ该操作不会改变量子态

例如,我们希望对处于22|00+22|11态的系统上的q1比特上作用一个Pauli-Z测量,首先我们将模拟器置位:

[12]:
sim = Simulator('mqvector', 2)                        # 声明一个2比特的mqvector模拟器
sim.set_qs(np.array([2**0.5 / 2, 0, 0, 2**0.5 / 2]))  # 设置模拟器状态
print(sim.get_qs())
[0.70710678+0.j 0.        +0.j 0.        +0.j 0.70710678+0.j]

然后我们构造出在q1上做Pauli-Z测量对应的哈密顿量hams:

[13]:
from mindquantum.core.operators import Hamiltonian    # 引入哈密顿量定义模块
from mindquantum.core.operators import QubitOperator  # 引入稀疏算子定义模块

hams = Hamiltonian(QubitOperator('Z1'))               # 构建在q1上作Pauli-Z测量的哈密顿量

为了深刻认识学习Pauli-Z测量操作,我们先手动计算出模拟器当前量子态在q1上做Pauli-Z测量的期望值,并推算出测量结果为+1,-1的概率:

E=ψ|H|ψ=(220022)×(ZI)×(220022)=(220022)×(1001)(1001)×(220022)=(220022)×(1000010000100001)×(220022)=0=1×p(1)+(1)×p(1)=1×p(1)+(1)×(1p(1))=p(1)1+p(1)p(1)=p(1)=0.5

这说明测量的理论期望值为0,测量出+1,-1的概率均为50%,我们使用MindSpore Quantum提供的 get_expectation() 来验证结果:

[14]:
sim.get_expectation(hams)  # 计算出模拟器当前量子态关于hams的期望值
[14]:
0j

可以看到,手动计算和使用 get_expectation(hamiltonian) 计算出的结果相同,符合预期。

我们还可以对处于22|00+22|11态的系统上的q0,q1比特上均作用Pauli-Z测量。类似地构造出在q0,q1上做Pauli-Z测量对应的哈密顿量hams2:

[15]:
hams2 = Hamiltonian(QubitOperator('Z0') + QubitOperator('Z1'))   # 构建在q0,q1上作Pauli-Z测量的哈密顿量

我们同样可以手动计算出模拟器当前量子态在q0、q1上做Pauli-Z测量的期望值:

E=ψ|H|ψ=(220022)×(ZI)×(220022)+(220022)×(IZ)×(220022)=(220022)×(1001)(1001)×(220022)+(220022)×(1001)(1001)×(220022)=(220022)×(1000010000100001)×(220022)+(220022)×(1000010000100001)×(220022)=0+0=0
[16]:
sim.set_qs(np.array([2**0.5 / 2, 0, 0, 2**0.5 / 2]))  # 设置模拟器状态
sim.get_expectation(hams2)                            # 计算出模拟器当前量子态关于hams2的期望值
[16]:
0j

该操作不会改变量子态,我们查看当前量子态:

[17]:
sim.get_qs()
[17]:
array([0.70710678+0.j, 0.        +0.j, 0.        +0.j, 0.70710678+0.j])

可以发现,量子态依然是最初设定的22|00+22|11

我们学习认识了量子计算中重要的一个操作——测量,还使用MindSpore Quantum测量量子线路验证我们的理论结果,并使用不同可视化工具展示出测量结果。

想学习MindSpore Quantum中量子线路的高阶操作,构建并训练量子经典混合神经网络,请查看 get_expectation_with_grad()apply_hamiltonian() 的文档。

[18]:
from mindquantum.utils.show_info import InfoTable

InfoTable('mindquantum', 'scipy', 'numpy')
[18]:
Software Version
mindquantum0.9.11
scipy1.10.1
numpy1.23.5
System Info
Python3.9.16
OSLinux x86_64
Memory8.3 GB
CPU Max Thread8
DateSat Dec 30 00:00:16 2023