基于HHL(Harrow-Hassidim-Lloyd)算法求解线性方程组
线路宽度限制为4量子比特,求解上述方程并返回解
HHL算法的基本思路可以理解为,首先可以将矩阵
HHL算法的基本量子线路结构如下图1所示。其中量子寄存器从上到下可以标记为:辅助寄存器、用于相位估计的时钟寄存器以及编码
图 1. HHL 算法
最后,通过测量辅助寄存器,当其输出为1时候对应有输入寄存器的状态将坍缩至
本节介绍基于pyqpanda实现HHL算法求解线性方程组
对于HHL算法而言,其输入为线性方程组
(1)Hermitian条件满足。首先,使用如下的工具函数判断输入的
Dag = lambda matrix: matrix.conj().T
def is_hermitian(matrix):
return np.allclose(matrix, Dag(matrix))
即简单的比较
但这样做加大了算法需要处理的矩阵维度。本实现中考虑如下的预处理以解决该问题:
从而
(2)归一化条件。即要求向量
normed_b = (b / np.linalg.norm(b)).round(4)
对于该问题而言,经过Hermitian条件满足的预处理后的
选用振幅编码将已归一化的
def encode(b):
circuit = create_empty_circuit()
# circuit << amplitude_encode(qubits[3], b)
circuit << X(qubits[3])
return circuit
对应编码结果如下图2所示:
图 2. 状态制备
此部分完成HHL算法主要步骤中的第一个:量子相位估计。针对
其中的受控量子门部分需要实现一组受控酉门
图 3. 量子相位估计
考虑本问题,对上述预处理后的
# C-U^1
QOracle(qubits[3], expMat(1j, A, np.pi / 2)).control(qubits[2])
# C-U^2
QOracle(qubits[3], expMat(1j, A, np.pi)).control(qubits[1])
然而上述实现使用的
图 4. 基于 CU 门实现受控酉门
此外,该量子相位估计中所使用的双量子比特量子傅里叶逆变换(IQFT)线路如下图5所示。
图 5. 双量子比特IQFT
则完整的相位估计线路如下图6所示。
图 6. 相位估计实现
受控旋转操作实现了将提取到基态的特征值信息以倒数的形式还原到概率幅上的功能。其中使用的旋转门作用于辅助寄存器
其中
对本问题而言,
图 7. r与测量概率和解近似度关系
则本实验中选择
图 8. 受控旋转
此部分为与相位估计部分相对称的去操作。以还原时钟寄存器状态。则对应线路如下图9所示:
图 9. 去操作
至此,完整的HHL算法线路为:
# Step 1. state preparation
prog << encode(normed_b)
# Step 2. phase estimation
prog << phase_estimation(A)
# Step 3. rotation
prog << rotation()
# Step 4. uncompute
prog << uncompute(A)
其中具体的辅助函数实现见代码。
HHL算法测量部分,当辅助比特(对应qubits[0])测量结果为1时候对应输入寄存器结果为目标解。则此部分相关代码实现为:
prog << Measure(qubits[0], cbits[0])
result = directly_run(prog)
if not result['c0']:
return HHL(A, b)
注意测量结果中
当测量结果为1时候,此时读取寄存器状态(使用
# Step 6. get results
qstate = get_qstate()
# 0001 1001
normed_x = np.real(np.array([qstate[1], qstate[9]]))
则完整的线路包含状态制备、相位估计、受控旋转、去处理以及测量部分如图10所示:
图 10. 完整线路
如前所述,此时输入寄存器中的状态为归一化的解的近似态,为获取目标的解
首先,假设求得的
注意到真实解
则恢复真实解
从而可列出方程组:
其中求任意一个方程均可求出目标的缩放比例
# Step 7. recover x
N = len(normed_b)
ratio = 0.0
for i in range(N):
if not abs(normed_b[i]) < 1e-8:
ratio = normed_b[i][0] / \
np.sum([normed_x[j] * A[i][j] for j in range(N)])
break
首先,使用经典求解线性方程组的方法可以简单的计算出带求解线性方程组
经由上述HHL算法求解,当测量辅助比特结果为1时候,得到输入寄存器对应的状态(即归一化解
计算所求解与真实解间的欧式距离为0.0004764,可见基于上述HHL算法实现可以很好的计算出该线性方程组的解。
按题目要求同时输出了对应HHL算法的OriginIR指令序列如下所示:
QINIT 4
CREG 4
X q[3]
H q[1]
H q[2]
BARRIER q[1],q[2]
CU q[2],q[3],(-0.78539816,-4.712389,-4.712389,4.712389)
CU q[1],q[3],(-4.712389,-9.424778,-9.424778,-6.2831853)
BARRIER q[1],q[2]
SWAP q[1],q[2]
H q[2]
DAGGER
CONTROL q[1]
S q[2]
ENDCONTROL
ENDDAGGER
H q[1]
SWAP q[1],q[2]
CONTROL q[2]
RY q[0],(0.09817477)
ENDCONTROL
CONTROL q[1]
RY q[0],(0.19634954)
ENDCONTROL
SWAP q[1],q[2]
H q[1]
CONTROL q[1]
S q[2]
ENDCONTROL
H q[2]
SWAP q[1],q[2]
BARRIER q[1],q[2]
CU q[1],q[3],(-4.712389,-9.424778,-9.424778,-6.2831853)
CU q[2],q[3],(0.78539816,-4.712389,-1.5707963,-1.5707963)
BARRIER q[1],q[2]
H q[1]
H q[2]
MEASURE q[0],c[0]