概述
HHL算法的目的:给定一个 Hermitian一个一个和一个单位向量𝑏 ⃗𝑏→, 求解方程一个𝑥 ⃗=𝑏 ⃗。
令\left|b \right\rangle = \sum_{j=1}^{N} b_{j } \left|j \右\rangle\left|b \right\rangle = \sum_{j=1}^{N} b_{j } \left|j \右\rangle, 算法的关键在于在||湾〉|𝑏〉上模拟𝑒iAΔt𝑒我一个Δ𝑡。
设一个一个的谱分解如下
那么
将||湾〉|𝑏〉用基{|𝑢𝑗〉}表示 :。
使用量子相位估计 QPE(Quantum Phase Estimation),其中,作用结果如下:
其中|𝜆𝑗˜〉|𝜆𝑗~〉是特征值𝜆𝑗𝜆𝑗的估计(波浪线表示估计值,下文同理)。
很容易看出方程的解就是
所以我们只需要将信息从量子态|𝜆𝑗~〉中提取出来即可。
HHL 算法步骤
下面详细介绍 HHL 算法的详细步骤,包含详细的数学推导。
数据预处理
前面提到一个一个需要是 Hermitian 的,也就是一个†=一个一个†=一个。其实这个条件可以放宽,如果一个一个不是 Hermitian 的,构造一个 ̃一个~如下:
然后求解方程
很容易验证方程的解𝑦 ⃗𝑦→一定具有如下的形式
其中一个𝑥 ⃗=𝑏 ⃗。
对于𝑏 ⃗𝑏→,因为 HHL 是量子算法,所以需要输入的是量子态|湾〉=∑𝑁j=1𝑏𝑗|J〉|𝑏〉=∑𝑗=1𝑁𝑏𝑗|𝑗〉。关于如何制备这样量子态,如何将经典信息编码到量子信息,不是本算法关心的重点,这里只假设制备好了这样的量子态。
制备算子
如何高效的制备算子是核心问题。后面将会看到,整个 HHL 算法的复杂度主要取决于算子𝑈𝑈,所以需要高效的模拟𝑈。
制备这个时间演化算子属于量子系统模拟(哈密顿量模拟)问题,本身是一个重要的量子问题,这里并不展开讨论。
在原论文中,对矩阵一个一个作出了稀疏性的限制,其目的就是能够高效的模拟。对于一般的稠密矩阵一个模拟其演化复杂度可能很高。
这里不去展开证明 QPE 的正确性,读者只需要知道 QPE 的输入是一个酉算子𝑈𝑈和其特征向量|U〉|𝑢〉,设𝑈|U〉=𝑒2π我φ|U〉𝑈|𝑢〉=𝑒2𝜋我𝜑|𝑢〉,输出是φ𝜑的估计φ ̃𝜑~。
具体来说,使用𝑡𝑡个辅助量子比特, QPE 的作用如下
其中||φ𝑗˜〉|𝜑𝑗~〉是相位φ𝑗𝜑𝑗的估计。 这里在𝑡𝑡个辅助比特后面还增加了一个辅助比特,是用于后面的旋转步骤。
为了更好的理解,这里举一个例子: 取
那么
两个相位分别是𝜑1=Δ𝑡/2𝜋和𝜑2=−Δ𝑡/2𝜋。
如果我们使用𝑡=4个辅助比特,并且取Δ𝑡=𝜋/4,那么𝜑1=1/8和𝜑2=−1/8。
两个相位的估计值分别是φ1˜=0.0010×24=2和φ2˜=0.1110×24=14。 因为相位是[0,1)之间的小数0.𝑞𝑡1𝑞𝑡2…𝑞𝑡𝑡, 乘上2𝑡得到其对应的量子态|𝑞𝑡1…𝑞𝑡𝑡〉。 需要指出的是,因为相位是模11的小数,−0.0010被映射到了0.1110,我们想要还原相位(为了还原𝜆),首先通过选取足够小的Δ𝑡使得|𝜑|<1/2,这样如果|𝑞𝑡1…𝑞𝑡𝑡〉<2𝑡−1对应正数,|𝑞𝑡1…𝑞𝑡𝑡〉>2𝑡−1对应负数。
通过简单的定量计算,我们得到如下的映射关系:
其中𝜆𝜆是一个一个的特征值,φ是的相位,φ ̃是φ的估计。
条件旋转
经过 QPE 后,整个量子态如下
想要将𝜆𝑗𝜆𝑗的信息从量子态||φ𝑗˜〉|𝜑𝑗~〉中提取出来,我们需要使用条件旋转门𝐶R(k)𝐶𝑅(𝑘),其作用效果如下
简单来说,只有当𝑘𝑘选择了正确的φ ̃,才会对后面的量子比特作用旋转操作。
因为我们不知道正确的φ ̃是什么,所以暴力的枚举所有的可能𝐶𝑅(𝑘),𝑘=1,…,2𝑡−1。
旋转的效果是很简单的
再作用一次逆 QPE,整体的量子态如下
测量
对最后一个量子比特进行测量,当测量结果是 $\left|1 \right\rangle$ 时,其概率是
测量后的量子态变为
显然此时三个量子寄存器之间不存在纠缠,如果只看第一个量子寄存器,它已经是|十〉|𝑥〉的状态了(忽略掉一个归一化系数)。
需要指出的是,旋转操作里面有一个参数𝐶𝐶,我们看到𝐶𝐶不会影响最后结果的正确性,但是却实实在在的影响了得到结果的概率𝑝1𝑝1。 我们肯定希望𝐶𝐶能够尽可能大,从而使𝑝1𝑝1尽可能大。但是𝐶≤||𝜆𝑗||𝐶≤|𝜆𝑗|,它要比所有特征值的绝对值还要小,如果没有先验信息,不知道绝对值最小的𝜆𝜆有多大,那么就只能保守的取一个很小的𝐶𝐶,然后可以通过振幅放大技术来增大得到结果的概率。
MindQuantum 实现
这里使用 MindQuantum 实现一个简单的例子,仅说明 HHL 算法的过程和正确性。
为了计算方便,我们选取一个简单的因为其时间演化算子,比较容易实现。导入所需要的各种函数。
对于量子态 $|b\rangle = \cos\theta |0\rangle + \sin\theta |1\rangle$ 的制备,可以通过一个 $R_y(2 \theta)$ 实现。
下面的代码制备了|B〉=0.6|0〉+0.8|1〉|𝑏〉=0.6|0〉+0.8|1〉并进行了测量。
下面一步步构建出完整的量子线路,取t=4𝑡=4,Δ吨=π/4Δ𝑡=𝜋/4,𝐶=0.5𝐶=0.5。
- 首先是 QPE
- 然后是 $CR(k)$,$k = 1, \ldots, 15$
- 接着是 逆QPE
- 最后测量
如何验证我们的结果的正确性?测量。因为结果是量子态|十〉|𝑥〉,目前 MindQuantum 没有相关的办法能够单独取出某一个量子比特的内部值,我们只能通过测量。
通过统计当 是 1 时, 的测量结果,我们看到 的占比是 ,和答案的预期一致。q0
q5
q5 = 0
0.36
当然这种方法只能得到振幅大小,想要得到更多信息,例如相位,需要对测量进行调整,这里不去讨论。