量子相位估计¶
量子相位估计(QPE)可以计算给定幺正算符U的特征值的相位,即求解 \(U\left|\psi\right\rangle= \ e^{2\pi i\varphi}\left|\psi\right\rangle\) 中的 \(\varphi\),此处 \(\left|\psi\right\rangle\) 为U的特征向量。
经典形式的QPE是在QFT的基础上构造的。
量子线路结构概览¶
假设已经构造好特征向量 \(\left|\psi\right\rangle\),量子相位估计包含如下步骤:
- 通过一系列特殊旋转量子门操作将U的特征值相位分解转移到辅助量子比特的振幅上;
- 对辅助量子比特执行IQFT,将振幅上的特征值相位转移到基向量上;
- 对辅助量子比特的基向量分别进行测量后综合可得到特征值的相位信息。
对于幺正算符 \(U\) 的一个特征量子态 \(\left|\psi\right\rangle\),可以通过特定的量子门组合将该量子态对应的特征值相位提取到振幅,但量子态的振幅难以有效准确地测量。
必须借助其他量子门组合将特征值相位数据进行整合,最终通过IQFT可以由振幅到基向量进行数据转化的功能将特征值转移到基向量中。
注解
量子相位估计本质上是为了提取幺正算符的特征值相位,并以便于测量的形式输出。
量子线路构建¶
特征量子态与特征值相位提取¶
由特征量子态的定义有 \(U\left|\psi\right\rangle = e^{2\pi i\varphi}\left|\psi\right\rangle\),
于是由幺正算符 \(U\) 可以定义受控量子门 \((C-U)\) 使得
特征值相位 \(\varphi\) 通过这种受控变换可以提取到振幅中。
特征值相位由振幅转移到基向量¶
选取一组初始化为最大叠加态的辅助比特,通过受控量子门可以将特征值相位提取到振幅中:
此时辅助比特中的量子态形式与QFT的结果量子态相近,借助IQFT有如下结果:
含特征值相位的基向量测量¶
对得到的结果量子态进行测量,结果可以分为两类:
- 如果存在正整数 \(2^n\varphi\in \mathbb{Z}\),则可以以概率 \(1\) 测量得到 \(\left|x\right\rangle=\left|2^n\varphi\right\rangle\)
- 否则以至少概率 \(\frac{4}{\pi^2}\) 得到最接近 \(2^n\varphi\) 的整数,进而得到近似解
注解
如何从最接近 \(2^n\varphi\) 的整数反推得到 \(\varphi\) ?(提示:连续分数展开)
测量结果得到的是相位 \(\varphi\) 的近似解,近似解的精度与辅助比特的数目 \(n\) 相关。\(2^n\varphi\in \mathbb{Z}\) 的情况代表辅助比特的数目已经大于 \(\varphi\) 的二进制展开小数位数,因此才能得到精确解。
量子线路图与代码实现¶
QPE的量子线路图如下所示

由上文中的定义,我们可以基于QPanda-2.0直接给出QPE的函数实现。
量子线路总共可以分为三个部分,特征量子态制备与辅助比特量子态初始化、特征值相位提取、逆量子傅里叶变换。程序实现的核心内容如下:
#!/usr/bin/env python
import pyqpanda as pq
from numpy import pi
def QPE(controlqlist, targetqlist, matrix):
circ = pq.QCircuit()
for i in range(len(controlqlist)):
circ.insert(pq.H(controlqlist[i]))
for i in range(len(controlqlist)):
circ.insert(controlUnitaryPower(targetqlist, controlqlist[controlqlist.size() \
- 1 - i], i, matrix))
circ.insert(pq.QFT(controlqlist).dagger())
return circ
图中的参数matrix是指需要估计特征值的幺正算符 \(U\) 对应的矩阵。
选取 \(U=RY(\frac{\pi}{4}),\left|\psi\right\rangle=\sqrt{\frac{1}{2}}\left|0\right\rangle+i\sqrt{\frac{1}{2}}\left|1\right\rangle\) , 对应的特征值为 \(e^{-i\frac{\pi}{8}}\) ,验证QPE的代码实例如下
#!/usr/bin/env python
import pyqpanda as pq
from numpy import pi
if __name__ == "__main__":
machine = pq.init_quantum_machine(pq.QMachineType.CPU)
qvec = machine.qAlloc_many(1)
cqv = machine.qAlloc_many(4)
prog = pq.create_empty_qprog()
# 构建量子程序
prog.insert(pq.H(cqv[0]))\
.insert(pq.H(cqv[1]))\
.insert(pq.H(cqv[2]))\
.insert(pq.H(cqv[3]))\
.insert(pq.H(qvec[0]))\
.insert(pq.S(qvec[0]))\
.insert(pq.RY(qvec[0], pi/4).control(cqv[0]))\
.insert(pq.RY(qvec[0], pi/2).control(cqv[1]))\
.insert(pq.RY(qvec[0], pi).control(cqv[2]))\
.insert(pq.RY(qvec[0], pi*2).control(cqv[3])) \
.insert(pq.QFT(cqv).dagger())
# 对量子程序进行概率测量
result = pq.prob_run_dict(prog, cqv, -1)
pq.destroy_quantum_machine(machine)
# 打印测量结果
for key in result:
print(key+":"+str(result[key]))
由前文可知输出结果应当以接近 1 的概率得到量子态 \(\left|1111\right\rangle\) (即-1)。因此可得 \(2^4 \varphi = 15,\varphi=15/16\)。因此,特征值为 \(e^{i\pi\frac{8}{15}}=e^{-i\frac{\pi}8}\)
0000:8.027759204248868e-34
0001:1.4038818472306108e-33
0010:6.324302228415449e-35
0011:1.8002817275101533e-33
0100:1.1716099389234709e-34
0101:3.7184613996614186e-35
0110:7.14619905441006e-35
0111:3.163946664340403e-33
1000:1.1716099389234709e-34
1001:2.361635369532623e-33
1010:6.324302228415447e-35
1011:1.5092886417824937e-32
1100:2.0191804511467995e-34
1101:2.142003975785634e-33
1110:1.0410679182118513e-33
1111:0.999999999999936