前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通用量子算法:量子相位估计算法

通用量子算法:量子相位估计算法

作者头像
量子发烧友
发布2023-02-24 15:37:07
9770
发布2023-02-24 15:37:07
举报
文章被收录于专栏:量子发烧友

概述

量子相位估计算法(quantum phase estimation,QPE)也称作量子特征值估计算法,是很多量子算法的基本步骤,其中包括Shor`s算法(秀尔算法)和HHL算法(线性方程组的量子算法)。它的作用就是快速的估计一个酉变换的特征值。由于酉矩阵拥有一个性质:酉矩阵的特征值都是模为1的复数。所以对酉矩阵而言,其特征值和相位基本是对等的。

1.相位估计

相位是用来描述信号波形变化的度量,通常用角度作为单位,所以也称作相角或相。当信号波形以一定周期的方式发生变化,波形循环一周就是三百六十度。比如月有阴晴圆缺的月相,也属于这个相位的概念。其实月相说白了就是月球的相位。

量子相位估计,顾名思义是用来估计相位的整体操作的特征向量的。更精确地说,量子相位估计其实是一种量子算法,是量子傅里叶变换的一个重要应用。相位估计 (Phase estimation,PE) 是量子傅里叶变换 (QFT) 的一个重要应用, 它的重要性体现在它是很多量子算法的基础,主要分为受控操作和逆量子傅里叶变换(inverse quantum Fourier transform, IQFT)构成,其中第一部分是提取相位操作,第二部分是将相位转变为可测量的基矢态。在量子傅里叶变换的基础上,我们可以实现量子相位估计算法。

相位估计问题定义:

给定可作用于量子线路的幺正矩阵 U 以及其本征向量之一|b⟩,求其对应的本征值。由于幺正矩阵的本征值一定是幺模的,于是该本征值可以被表示为 。求本征值在这里等价于求相位ϕ,从算法名可以看出,接下来的算法实际求解的是相位ϕ。

量子相位估计示意图

示意图中比特Q1-5为存放结果的寄存器,Q6-8为输入向量。U矩阵作为受控门电路作用在Q6-8上。

2.量子傅立叶变换

量子相位估计算法是用来估计某个幺正算符本征态对应本征值的算法。它是许多量子算法的子程序,例如Shor 算法。量子傅里叶变换是在量子计算机上 对量子态进行傅里叶变换的算法。它是量子相位估计的子程序。量子傅里叶变换在Shor算法中有非常大的作用,但更准确的说是在量子相位估计(QPE)中起到作用。量子傅里叶变换可以帮助我们仅通过一次测量就读出一系列比特串的相位信息,是很多量子算法的关键。

假设一个酉算子U有特征向量|u⟩和特征值 其中,ψ是未知量,我们的目标就是用相位估计估算ψ的值,为了实现估计操作,我们先假设我们可以实现一个黑盒子,这个黑盒子是控制 门,j是非负整数,相位估计并不是一个算法,而是算法的一个模块,我们将用这些黑盒子实现这个模块。

相位估计过程包含两个寄存器,第一个寄存器包含t个qubit,初始化为|0⟩它的多少决定了估计的精度,第二个寄存器初始化为|u⟩ ,也就是U的特征向量。

相位估计的过程,我们先将第一部分的线路图,如下:

第一个寄存器最后的状态为:

进行逆傅里叶变换就是傅立叶变换的逆过程,简单来说就是把它的酉矩阵取它的逆矩阵,如何构造其逆过程上一节的习题里有布置,因为门是可逆的,所以很容易构造。以下是线路图:

把第一个过程得到的结果做下变换,对于ψ,我们假设其为 ,那么我们把这个带入上面的式子,得到:

我们发现,这和傅立叶变换后得到的结果那个式子很像(其实就是一个形式的),那么我们进行逆傅里叶变换后,会得到 ,我们测量的话会得到ψ。总之,相位估计可以给定一个特征向量的情况下,估计一个酉算子的一个对应特征值的相位。

3.量子相位估计算法

量子相位估计算法(Quantom Phase Estimation)也称作量子特征值估计算法,是一个比较基础的算法。它的作用就是快速的估计一个酉变换的特征值。由于酉矩阵拥有一个性质:酉矩阵的特征值都是模为1的复数。所以对酉矩阵而言,其特征值和相位基本是对等的。

给定一个酋矩阵U,假设其有一个特征向量为|φ⟩,对应的特征值为 ,

满足 。相位估计算法就是用来测量这个θ。步骤主要分一下4步:

步骤1:其中输入部分,|φ⟩是U的其中一个特征向量,另外N个量子位是作为辅助位存在的。在n个辅助位上应用n个H门,可以得到:

步骤2:受控酋操作:引入受控酋门C-U。已知 ,即是

应用n个受控操作 (这里0≤j≤n-1) ,因为

那么可以将 写成如下格式:

步骤3:回顾傅里叶变换公式:

步骤4:测量结果:

当 不是整数的时候, 结果会以百分之四十的概率得到

4.QPE代码实现(以MindQuantum为例)

用一个实例来演示如何在MindQuantum实现量子相位估计算法,选择T门作为进行估计的幺正算符,由定义T|1⟩ = e^(iπ/4)|1⟩

可知需要估计的相位角为φ=1/8。

现在假设我们不知道T门的相位信息,只知道幺正算符U是T门且本征态为|1⟩,接下来我们需要用量子相位估计算法求出其对应的本征值,即需要估计本征值指数上的相位角。

首先导入相关依赖。

代码语言:javascript
复制
from mindquantum.core.gates import T, H, X, Power, BARRIER
from mindquantum.core.circuit import Circuit, UN
from mindquantum.simulator import Simulator
from mindquantum.algorithm.library import qft
import numpy as np

UN可以指定量子门,目标比特和控制比特,从而在线路中搭建门操作;Power可以得到指定量子门的指数形式。因为我们已知T门的本征态为|1⟩,所以第二寄存器只需1个比特,而在第一寄存器中的比特数越多,得到的结果就越准确,在这里我们使用4个比特。

因此我们需要搭建5比特线路,q_0,q_1,q_2,q_3比特用于估计,属于第一寄存器,q_4属于第二寄存器用于传入T算符的本征态。利用UN对q_0,q_1,q_2,q_3进行Hadamard门操作,用X门对q_4进行翻转,得到T门的本征态|1⟩。

代码语言:javascript
复制
# pylint: disable=W0104
n = 4
circ = Circuit()
circ += UN(H, n) # 对前4个比特作用力H门
circ += X.on(n)  # 对q4作用X门
circ.svg()

以q_4为目标比特,添加控制T^(2^i )门。

代码语言:javascript
复制
# pylint: disable=W0104
for i in range(n):
    circ += Power(T, 2**i).on(n, n - i - 1) # 添加T^2^i门,其中q4为目标比特,n-i-1为控制比特
circ.svg()

对第一寄存器中的比特进行逆量子傅里叶变换。

代码语言:javascript
复制
# pylint: disable=W0104
circ += BARRIER
circ += qft(range(n)).hermitian() # 对前4个比特作用量子傅立叶变换的逆变换
circ.svg()

选择后端、传入总比特数创建模拟器,对量子线路进行演化,得到末态。

代码语言:javascript
复制
# pylint: disable=W0104
from mindquantum.core.gates import Measure
sim = Simulator('projectq', circ.n_qubits)         # 创建模拟器
sim.apply_circuit(circ)                            # 用模拟器演化线路
qs = sim.get_qs()                              # 获得演化得到的量子态
res = sim.sampling(UN(Measure(), circ.n_qubits - 1), shots=100) # 在寄存器1中加入测量门并对线路进行100次采样,获得统计结果
res.svg()

需要注意的是,测量结果作为二进制串的读取顺序应为|q_0 q_1 q_2 q_3⟩,因此我们得到寄存器1的测量结果为0010,概率幅为1,该末态可以精准地反映相位φ。但0010是二进制结果,因此我们将它转回十进制后再除以2n,就得到了我们最终的估计值:φ=224=18。我们也可以通过线路演化得到的量子态qs找出第一寄存器中振幅最大值a_max的位置,进而得到其对应的本征基矢|x⟩,其中的x再除以2^t即为相位的估计值。

代码语言:javascript
复制
index = np.argmax(np.abs(qs))
print(bin(index)[2:])

需要注意的是,qs对应的是整个量子线路的末态,因此得到的index也包含第二寄存器中的比特,不能直接得到第一寄存器末态中a_max对应的|x⟩,需要将index转成二进制后将q_4对应的比特位剔除,然后得到的才是第一寄存器的|x⟩。

代码语言:javascript
复制
bit_string = bin(index)[2:].zfill(circ.n_qubits)[1:]        # 将index转换成01串并剔除q4
bit_string = bit_string[::-1]                               # 将比特串顺序调整为q0q1q2q3
print(bit_string)

再将二进制转回十进制,得到我们最终的估计值。

代码语言:javascript
复制
# pylint: disable=W0104
theta_exp = int(bit_string, 2) / 2**n
theta_exp

可见得到的估计相位和φ近似相等。

参考资料:

1\https://blog.csdn.net/m0_37622530/article/details/88852073

2\https://www.mindspore.cn/mindquantum/docs/zh-CN/master/quantum_phase_estimation.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子发烧友 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档