单振幅量子虚拟机


目前我们可以通过量子计算的相关理论,用经典计算机实现模拟量子虚拟机。 量子虚拟机的模拟主要有全振幅与单振幅两种解决方案,其主要区别在于,全振幅一次模拟计算就能算出量子态的所有振幅,单振幅一次模拟计算只能计算出 \(2^{N}\) 个振幅中的一个。

然而全振幅模拟量子计算时间较长,计算量随量子比特数指数增长, 在现有硬件下,无法模拟超过49量子比特。通过单振幅量子虚拟机技术可以模拟超过49量子比特,同时模拟速度有较大提升,且算法的计算量不随量子比特数指数提升。

使用介绍


其使用方式与前面介绍的量子虚拟机模块非常类似。主要接口有以下几种:

run :输入参数为执行的量子程序,申请的量子比特,最大RANK,quickBB优化的最大运行时间

pmeasure_bin_index :输入参数为二进制索引字符串,输出为该索引下的量子态。使用前需要调用run接口如 pmeasure_bin_index(“0000000000”) ,同时保证字符串长度与测量的比特数相同

pmeasure_dec_index :输入参数为十进制索引字符串,输出为该索引下的量子态。使用前需要调用run接口。如 pmeasure_dec_index(“1”),同时保证索引大小不超过2的n次方(n为比特数)。

get_prob_dict :输入参数为要执行的量子程序,以及要测量的量子比特。输出为对应量子比特的所有态结果。使用前需要调用run接口。需要注意的是该接口要求量子比特数为30个以内时使用。

prob_run_dict :输入参数为要执行的量子程序,以及要测量的量子比特。输出为对应量子比特的所有态结果。需要注意的是该接口要求量子比特数为30个以内时使用。

首先通过 SingleAmpQVM 初始化一个单振幅量子虚拟机对象用于管理后续一系列行为

from pyqpanda import *
from numpy import pi

qvm = SingleAmpQVM()

然后是量子程序的初始化、构建与装载过程:

qvm.init_qvm()

qv = qvm.qAlloc_many(10)
cv = qvm.cAlloc_many(10)

prog = QProg()

# 构建量子程序
prog << CZ(qv[1], qv[5])\
    << CZ(qv[3], qv[5])\
    << CZ(qv[2], qv[4])\
    << CZ(qv[3], qv[7])\
    << CZ(qv[0], qv[4])\
    << RY(qv[7], pi / 2)\
    << RX(qv[8], pi / 2)\
    << RX(qv[9], pi / 2)\
    << CR(qv[0], qv[1], pi)\
    << CR(qv[2], qv[3], pi)\
    << RY(qv[4], pi / 2)\
    << RZ(qv[5], pi / 4)\
    << RX(qv[6], pi / 2)\
    << RZ(qv[7], pi / 4)\
    << CR(qv[8], qv[9], pi)\
    << CR(qv[1], qv[2], pi)\
    << RY(qv[3], pi / 2)\
    << RX(qv[4], pi / 2)\
    << RX(qv[5], pi / 2)\
    << CR(qv[9], qv[1], pi)\
    << RY(qv[1], pi / 2)\
    << RY(qv[2], pi / 2)\
    << RZ(qv[3], pi / 4)\
    << CR(qv[7], qv[8], pi)

接口使用如下:

pmeasure_bin_index ,使用时需要结合 run 方法。用法示例:

结果输出如下:

0001000000 :  0.001953123603016138

pmeasure_dec_index ,使用时需要结合 run 方法。用法示例:

qvm.run(prog, qv)
dec_result = qvm.pmeasure_dec_index("2")
print("2 : ",dec_result)

结果输出如下:

2 :  0.001953123603016138

get_prob_dict,使用时需要结合 run 方法。用法示例:

qvm.run(prog, qv)
res = qvm.get_prob_dict(qv)

prob_run_dict 接口是 get_prob_dictrun 的封装,用法示例:

res_1 = qvm.prob_run_dict(prog, qv)