8. 应用展示¶
8.1 T1测量原理展示¶
超导量子比特的T1时间是指量子态在材料中保持纯态的时间,也可以看作是比特的相干时间。测量T1时间的方法通常基于退相干的过程,可以简要概括如下:
准备量子态:通过准备一个特定的量子态,例如|0⟩或|1⟩态,作为待测量的初始态。
等待时间:在初始态之后,让量子态在超导电路中等待一段时间,通常称为等待时间或重复测量周期。
测量量子态:在等待时间结束后,通过测量电荷或磁通比特的状态,可以得到量子态的信息。
重复实验:通过多次重复上述过程,对比特的状态进行多次测量,以获得比特的退相干行为。
分析数据:根据测量结果,通过对比特退相干的曲线进行拟合或分析,可以得到T1时间。
简言之,T1测量需要在量子态置1后,通过不同延时后的测量,统计延时量与态变化的关系。 量子程序很简单,但需要多个不同延时的线路。 这里通过经典程序生成批量的线路。
In [ ]:
Copied!
from pyezQ import * #导出量子计算机SDK的支持包,该支持包于2023年7月正式更名为pyezQ,此前的ezQpy包停更,并且停更版本已经不支持新功能。
account = Account(login_key='554393d4e2425130b0bcf7579163ffe2', machine_name='Xiaohong')
import numpy as np
#设置相关参量,对应的比特,延时的起止时间,变化的步进等。
qubit0 = 'Q3'
IStart = 0
IEnd = 100000
IStep = 1000
Irange = np.arange(IStart, IEnd, IStep)
#通过经典变量表达的线路。
template1 = '''
X {qubit0}
I {qubit0} {delay}
M {qubit0}
'''
template = template1
qCircuits = []
#用经典程序参数待使用的量子线路。
for qdelay in Irange:
c = template.format(qubit0 = qubit0, delay = qdelay)
qCircuits.append(c)
#计算一下要运行的线路数量,以及打印一个线路,看上述替换效果是否正确。
print(len(qCircuits))
#注意确认线路数量,多于600时需要分段提交。
print(qCircuits[1])
#创建实验目录
create_res = account.create_experiment('T1_demo')
if create_res == 0:
print('新建实验合集失败')
else :
print('新建实验合辑成功,ID=', create_res)
lab_id = create_res
#实验合集id建议长期保留,以便后继使用。
import math
import time
# 提交之前先下载使用的实验参数
config_json = account.download_config(down_file=False)
exp_name = "T1_{qubit0}_".format(qubit0 = qubit0)+str(int(time.time()))
query_id = account.submit_job(circuit=qCircuits, version=exp_name, lab_id=lab_id, num_shots=2000, is_verify=False)
#批量提交实验,注意单次提交的实验线路不要超量。
# 分批查询实验结果,批量返回的只有原始数据,后端最多支持50条实验id批量查询
p1 = []
if query_id:
for idx in range(0, len(query_id), 50):
print(query_id[idx:idx+50])
result=account.query_experiment(query_id[idx:idx+50], max_wait_time=60*1000)
for query_res in result:
# 实验结果转换,概率转换,读取矫正
# results = account.readout_data_to_state_probabilities_whole(query_res)
prob = account.probability_calibration(query_res, config_json)
prob = account.probability_correction(prob)
#提出索要结果。
p1.append(prob['1'])
#对于T1测量,只要绘制延时与|1>态的概率关系即可看出衰减过程。
import matplotlib.pyplot as plt
plt.plot(Irange, p1)
plt.xlabel('qubit0 delay')
plt.ylabel('qubit0 |1> probability')
plt.title('T1 test')
plt.show()
#进行T1的拟合。即寻找1的概率降到1/e的时间。
#此处拟合部分借鉴自云平台用户的贡献。
import scipy.optimize as optimize
x=[]
y=p1
e=2.718281828459045
for tt in Irange:
x.append(tt*0.5/1000)
def target_func(x, t1):
return e**(-x/t1)
p0 = 10
para, cov = optimize.curve_fit(target_func, x, y, p0=p0)
print('拟合参数为',para, cov)
print('T1为',para,'us')
plt.figure()
plt.scatter(x, y, color='gray',label="Experiment results")
y_fit = [target_func(a, *para) for a in x]
plt.plot(x, y_fit, color = "blue",label="Fitted curve")
plt.title('y=e^(-x/%.5f)' % (para))
plt.xlabel("t(us)")
plt.ylabel("P(0)")
plt.legend(loc='best')
plt.show()
plt.savefig(f'T1-{qubit0}.png')
from pyezQ import * #导出量子计算机SDK的支持包,该支持包于2023年7月正式更名为pyezQ,此前的ezQpy包停更,并且停更版本已经不支持新功能。
account = Account(login_key='554393d4e2425130b0bcf7579163ffe2', machine_name='Xiaohong')
import numpy as np
#设置相关参量,对应的比特,延时的起止时间,变化的步进等。
qubit0 = 'Q3'
IStart = 0
IEnd = 100000
IStep = 1000
Irange = np.arange(IStart, IEnd, IStep)
#通过经典变量表达的线路。
template1 = '''
X {qubit0}
I {qubit0} {delay}
M {qubit0}
'''
template = template1
qCircuits = []
#用经典程序参数待使用的量子线路。
for qdelay in Irange:
c = template.format(qubit0 = qubit0, delay = qdelay)
qCircuits.append(c)
#计算一下要运行的线路数量,以及打印一个线路,看上述替换效果是否正确。
print(len(qCircuits))
#注意确认线路数量,多于600时需要分段提交。
print(qCircuits[1])
#创建实验目录
create_res = account.create_experiment('T1_demo')
if create_res == 0:
print('新建实验合集失败')
else :
print('新建实验合辑成功,ID=', create_res)
lab_id = create_res
#实验合集id建议长期保留,以便后继使用。
import math
import time
# 提交之前先下载使用的实验参数
config_json = account.download_config(down_file=False)
exp_name = "T1_{qubit0}_".format(qubit0 = qubit0)+str(int(time.time()))
query_id = account.submit_job(circuit=qCircuits, version=exp_name, lab_id=lab_id, num_shots=2000, is_verify=False)
#批量提交实验,注意单次提交的实验线路不要超量。
# 分批查询实验结果,批量返回的只有原始数据,后端最多支持50条实验id批量查询
p1 = []
if query_id:
for idx in range(0, len(query_id), 50):
print(query_id[idx:idx+50])
result=account.query_experiment(query_id[idx:idx+50], max_wait_time=60*1000)
for query_res in result:
# 实验结果转换,概率转换,读取矫正
# results = account.readout_data_to_state_probabilities_whole(query_res)
prob = account.probability_calibration(query_res, config_json)
prob = account.probability_correction(prob)
#提出索要结果。
p1.append(prob['1'])
#对于T1测量,只要绘制延时与|1>态的概率关系即可看出衰减过程。
import matplotlib.pyplot as plt
plt.plot(Irange, p1)
plt.xlabel('qubit0 delay')
plt.ylabel('qubit0 |1> probability')
plt.title('T1 test')
plt.show()
#进行T1的拟合。即寻找1的概率降到1/e的时间。
#此处拟合部分借鉴自云平台用户的贡献。
import scipy.optimize as optimize
x=[]
y=p1
e=2.718281828459045
for tt in Irange:
x.append(tt*0.5/1000)
def target_func(x, t1):
return e**(-x/t1)
p0 = 10
para, cov = optimize.curve_fit(target_func, x, y, p0=p0)
print('拟合参数为',para, cov)
print('T1为',para,'us')
plt.figure()
plt.scatter(x, y, color='gray',label="Experiment results")
y_fit = [target_func(a, *para) for a in x]
plt.plot(x, y_fit, color = "blue",label="Fitted curve")
plt.title('y=e^(-x/%.5f)' % (para))
plt.xlabel("t(us)")
plt.ylabel("P(0)")
plt.legend(loc='best')
plt.show()
plt.savefig(f'T1-{qubit0}.png')
8.2 质因数分解(15)¶
Shor算法的重要意义在于突破了传统密码学安全性,证明了量子计算机的指数级加速能力,并推动了量子安全密码学和基础科学的发展。
以下对15的质因数分解为国盾量子计算云平台发布会上的展示代码,其理论以及来自于论文Nature Physics volume 8, pages719–723 (2012)
In [1]:
Copied!
# Shor 算法分解 15 = 5 x 3 演示
from isq import LocalDevice
from pyezQ import *
import math
import time
account = Account(login_key='3c2e5450ef90bde1f658531f7d7ef341', machine_name='Xiaohong')
# 算法分解 15 的量子程序
isq_code = '''
qbit q[66];
procedure main() {
H<q[57]>;
CNOT<q[57],q[51]>;
CNOT<q[57],q[62]>;
H<q[57]>;
M<q[63,57]>;
}
'''
ld = LocalDevice() #编译
ir = ld.compile_to_ir(isq_code, target = "qcis") #提交量子线路到云端量子计算机
print(ir)
query_id_isQ = account.submit_job(circuit=ir,num_shots=5000, version="shor_15_v"+str(int(time.time())))
if query_id_isQ:
result=account.query_experiment(query_id_isQ, max_wait_time=360000)
print('===================== [计算完成] =======================') # 显示结果
print('+------------+-------------------------+--------------+')
print('| 第 n 次运行 | r, s[0], s[1] | 结果 |')
print('+------------+-------------------------+--------------+')
events = result[0]['results']
index = 0
r0=0
r1=0
r2=0
r3=0
for s in events[1:100]: #计算最大公约数得到最终结果
index = index + 1
if s[0] == 0 and s[1] == 0:
r = 0
r0=r0+1
print('| {:05d}'.format(index)+' | r = 0 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | failed |');
elif s[0] == 1 and s[1] == 0:
r = 1
r1=r1+1
p = math.gcd(int(4**(r/2)+1), 15)
q = math.gcd(int(4**(r/2)-1), 15)
print('| {:05d}'.format(index)+' | r = 1 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |')
elif s[0] == 0 and s[1] == 1:
r = 2
r2=r2+1
p = math.gcd(int(4**(r/2)+1), 15)
q = math.gcd(int(4**(r/2)-1), 15)
print('| {:05d}'.format(index)+' | r = 2 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |')
elif s[0] == 1 and s[1] == 1:
r = 3
r3=r3+1
p = math.gcd(int(4**(r/2)+1), 15)
q = math.gcd(int(4**(r/2)-1), 15)
print('| {:05d}'.format(index)+' | r = 3 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |')
print('r0= '+str(r0)+' times, r1= '+str(r1)+' times, r2= '+str(r2)+' times, r3= '+str(r3)+' times')
# Shor 算法分解 15 = 5 x 3 演示
from isq import LocalDevice
from pyezQ import *
import math
import time
account = Account(login_key='3c2e5450ef90bde1f658531f7d7ef341', machine_name='Xiaohong')
# 算法分解 15 的量子程序
isq_code = '''
qbit q[66];
procedure main() {
H
; CNOT; CNOT; H; M; } ''' ld = LocalDevice() #编译 ir = ld.compile_to_ir(isq_code, target = "qcis") #提交量子线路到云端量子计算机 print(ir) query_id_isQ = account.submit_job(circuit=ir,num_shots=5000, version="shor_15_v"+str(int(time.time()))) if query_id_isQ: result=account.query_experiment(query_id_isQ, max_wait_time=360000) print('===================== [计算完成] =======================') # 显示结果 print('+------------+-------------------------+--------------+') print('| 第 n 次运行 | r, s[0], s[1] | 结果 |') print('+------------+-------------------------+--------------+') events = result[0]['results'] index = 0 r0=0 r1=0 r2=0 r3=0 for s in events[1:100]: #计算最大公约数得到最终结果 index = index + 1 if s[0] == 0 and s[1] == 0: r = 0 r0=r0+1 print('| {:05d}'.format(index)+' | r = 0 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | failed |'); elif s[0] == 1 and s[1] == 0: r = 1 r1=r1+1 p = math.gcd(int(4**(r/2)+1), 15) q = math.gcd(int(4**(r/2)-1), 15) print('| {:05d}'.format(index)+' | r = 1 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |') elif s[0] == 0 and s[1] == 1: r = 2 r2=r2+1 p = math.gcd(int(4**(r/2)+1), 15) q = math.gcd(int(4**(r/2)-1), 15) print('| {:05d}'.format(index)+' | r = 2 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |') elif s[0] == 1 and s[1] == 1: r = 3 r3=r3+1 p = math.gcd(int(4**(r/2)+1), 15) q = math.gcd(int(4**(r/2)-1), 15) print('| {:05d}'.format(index)+' | r = 3 s[0]='+str(s[0])+' s[1]='+str(s[1])+' | 15 = '+str(p)+' x '+str(q)+' |') print('r0= '+str(r0)+' times, r1= '+str(r1)+' times, r2= '+str(r2)+' times, r3= '+str(r3)+' times')
H Q57 Y2P Q51 CZ Q57 Q51 Y2M Q51 Y2P Q62 CZ Q57 Q62 Y2M Q62 H Q57 M Q63 M Q57 查询实验结果请等待: 2.09秒 查询实验结果请等待: 2.63秒 查询实验结果请等待: 1.48秒 查询实验结果请等待: 1.29秒 查询实验结果请等待: 0.91秒 查询实验结果请等待: 2.41秒 查询实验结果请等待: 5.56秒 查询实验结果请等待: 2.49秒 查询实验结果请等待: 5.59秒 查询实验结果请等待: 3.72秒 查询实验结果请等待: 2.96秒 查询实验结果请等待: 2.07秒 查询实验结果请等待: 3.06秒 查询实验结果请等待: 1.54秒 查询实验结果请等待: 4.49秒 查询实验结果请等待: 1.36秒 查询实验结果请等待: 1.63秒 查询实验结果请等待: 5.01秒 查询实验结果请等待: 4.74秒 查询实验结果请等待: 3.37秒 查询实验结果请等待: 3.39秒 查询实验结果请等待: 3.93秒 查询实验结果请等待: 4.15秒 ===================== [计算完成] ======================= +------------+-------------------------+--------------+ | 第 n 次运行 | r, s[0], s[1] | 结果 | +------------+-------------------------+--------------+ | 00001 | r = 0 s[0]=0 s[1]=0 | failed | | 00002 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00003 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00004 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00005 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00006 | r = 0 s[0]=0 s[1]=0 | failed | | 00007 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00008 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00009 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00010 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00011 | r = 0 s[0]=0 s[1]=0 | failed | | 00012 | r = 0 s[0]=0 s[1]=0 | failed | | 00013 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00014 | r = 0 s[0]=0 s[1]=0 | failed | | 00015 | r = 0 s[0]=0 s[1]=0 | failed | | 00016 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00017 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00018 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00019 | r = 0 s[0]=0 s[1]=0 | failed | | 00020 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00021 | r = 0 s[0]=0 s[1]=0 | failed | | 00022 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00023 | r = 0 s[0]=0 s[1]=0 | failed | | 00024 | r = 0 s[0]=0 s[1]=0 | failed | | 00025 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00026 | r = 0 s[0]=0 s[1]=0 | failed | | 00027 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00028 | r = 0 s[0]=0 s[1]=0 | failed | | 00029 | r = 0 s[0]=0 s[1]=0 | failed | | 00030 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00031 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00032 | r = 0 s[0]=0 s[1]=0 | failed | | 00033 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00034 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00035 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00036 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00037 | r = 0 s[0]=0 s[1]=0 | failed | | 00038 | r = 0 s[0]=0 s[1]=0 | failed | | 00039 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00040 | r = 0 s[0]=0 s[1]=0 | failed | | 00041 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00042 | r = 0 s[0]=0 s[1]=0 | failed | | 00043 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00044 | r = 0 s[0]=0 s[1]=0 | failed | | 00045 | r = 0 s[0]=0 s[1]=0 | failed | | 00046 | r = 0 s[0]=0 s[1]=0 | failed | | 00047 | r = 0 s[0]=0 s[1]=0 | failed | | 00048 | r = 0 s[0]=0 s[1]=0 | failed | | 00049 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00050 | r = 0 s[0]=0 s[1]=0 | failed | | 00051 | r = 0 s[0]=0 s[1]=0 | failed | | 00052 | r = 0 s[0]=0 s[1]=0 | failed | | 00053 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00054 | r = 0 s[0]=0 s[1]=0 | failed | | 00055 | r = 0 s[0]=0 s[1]=0 | failed | | 00056 | r = 0 s[0]=0 s[1]=0 | failed | | 00057 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00058 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00059 | r = 0 s[0]=0 s[1]=0 | failed | | 00060 | r = 0 s[0]=0 s[1]=0 | failed | | 00061 | r = 0 s[0]=0 s[1]=0 | failed | | 00062 | r = 0 s[0]=0 s[1]=0 | failed | | 00063 | r = 0 s[0]=0 s[1]=0 | failed | | 00064 | r = 0 s[0]=0 s[1]=0 | failed | | 00065 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00066 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00067 | r = 0 s[0]=0 s[1]=0 | failed | | 00068 | r = 0 s[0]=0 s[1]=0 | failed | | 00069 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00070 | r = 0 s[0]=0 s[1]=0 | failed | | 00071 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00072 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00073 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00074 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00075 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00076 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00077 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00078 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00079 | r = 0 s[0]=0 s[1]=0 | failed | | 00080 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00081 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00082 | r = 0 s[0]=0 s[1]=0 | failed | | 00083 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00084 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00085 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00086 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00087 | r = 0 s[0]=0 s[1]=0 | failed | | 00088 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00089 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00090 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00091 | r = 0 s[0]=0 s[1]=0 | failed | | 00092 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00093 | r = 0 s[0]=0 s[1]=0 | failed | | 00094 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00095 | r = 0 s[0]=0 s[1]=0 | failed | | 00096 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | | 00097 | r = 0 s[0]=0 s[1]=0 | failed | | 00098 | r = 0 s[0]=0 s[1]=0 | failed | | 00099 | r = 2 s[0]=0 s[1]=1 | 15 = 5 x 3 | r0= 46 times, r1= 0 times, r2= 53times, r3= 0 times