8. 应用展示¶
8.1 T1测量原理展示¶
超导量子比特的T1时间是指量子态在材料中保持纯态的时间,也可以看作是比特的相干时间。测量T1时间的方法通常基于退相干的过程,可以简要概括如下:
准备量子态:通过准备一个特定的量子态,例如|0⟩或|1⟩态,作为待测量的初始态。
等待时间:在初始态之后,让量子态在超导电路中等待一段时间,通常称为等待时间或重复测量周期。
测量量子态:在等待时间结束后,通过测量电荷或磁通比特的状态,可以得到量子态的信息。
重复实验:通过多次重复上述过程,对比特的状态进行多次测量,以获得比特的退相干行为。
分析数据:根据测量结果,通过对比特退相干的曲线进行拟合或分析,可以得到T1时间。
简言之,T1测量需要在量子态置1后,通过不同延时后的测量,统计延时量与态变化的关系。 量子程序很简单,但需要多个不同延时的线路。 这里通过经典程序生成批量的线路。
In [1]:
Copied!
from ezQgd import *
account = Account(login_key='2p1adksE+s6ib6uJa5/P/G3sc2O9kejgGBjgIukfGmY=', machine_name='gd_qc1')
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 ezQgd import *
account = Account(login_key='2p1adksE+s6ib6uJa5/P/G3sc2O9kejgGBjgIukfGmY=', machine_name='gd_qc1')
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')
100 X Q3 I Q3 1000 M Q3 当前创建实验使用的机器名: Xiaohong 新建实验合辑成功,ID= 3849984a57c64b55ad72a5af7244d9d0 ['7112246906843037697', '7112246906843037699', '7112246906843037701', '7112246906843037703', '7112246906843037705', '7112246906843037707', '7112246906843037709', '7112246906843037711', '7112246906843037713', '7112246906843037715', '7112246906843037717', '7112246906843037719', '7112246906843037721', '7112246906843037723', '7112246906843037725', '7112246906843037727', '7112246906843037729', '7112246906843037731', '7112246906843037733', '7112246906843037735', '7112246906843037737', '7112246906843037739', '7112246906843037741', '7112246906843037743', '7112246906843037745', '7112246906843037747', '7112246906843037749', '7112246906843037751', '7112246906843037753', '7112246906843037755', '7112246906843037757', '7112246906843037759', '7112246906843037761', '7112246906843037763', '7112246906843037765', '7112246906843037767', '7112246906843037769', '7112246906843037771', '7112246906843037773', '7112246906843037775', '7112246906843037777', '7112246906843037779', '7112246906843037781', '7112246906843037783', '7112246906843037785', '7112246906843037787', '7112246906843037789', '7112246906843037791', '7112246906843037793', '7112246906843037795'] 查询实验结果请等待: 2.67秒 查询实验结果请等待: 4.32秒 查询实验结果请等待: 5.01秒 查询实验结果请等待: 4.29秒 查询实验结果请等待: 1.65秒 查询实验结果请等待: 1.29秒 查询实验结果请等待: 4.17秒 查询实验结果请等待: 4.44秒 查询实验结果请等待: 0.96秒 查询实验结果请等待: 0.81秒 查询实验结果请等待: 2.57秒 查询实验结果请等待: 1.87秒 查询实验结果请等待: 1.64秒 查询实验结果请等待: 1.74秒 查询实验结果请等待: 2.07秒 查询实验结果请等待: 4.64秒 查询实验结果请等待: 1.45秒 查询实验结果请等待: 1.62秒 查询实验结果请等待: 1.60秒 查询实验结果请等待: 2.61秒 查询实验结果请等待: 4.75秒 ['7112246906843037797', '7112246906843037799', '7112246906843037801', '7112246906843037803', '7112246906843037805', '7112246906843037807', '7112246906843037809', '7112246906843037811', '7112246906843037813', '7112246906843037815', '7112246906843037817', '7112246906843037819', '7112246906843037821', '7112246906843037823', '7112246906843037825', '7112246906843037827', '7112246906843037829', '7112246906843037831', '7112246906843037833', '7112246906843037835', '7112246906843037837', '7112246906843037839', '7112246906843037841', '7112246906843037843', '7112246906843037845', '7112246906843037847', '7112246906843037849', '7112246906843037851', '7112246906843037853', '7112246906843037855', '7112246906843037857', '7112246906843037859', '7112246906843037861', '7112246906843037863', '7112246906843037865', '7112246906843037867', '7112246906843037869', '7112246906843037871', '7112246906843037873', '7112246906843037875', '7112246906843037877', '7112246906843037879', '7112246906843037881', '7112246906843037883', '7112246906843037885', '7112246906843037887', '7112246906843037889', '7112246906843037891', '7112246906843037893', '7112246906843037895']
拟合参数为 [35.51988195] [[0.23752543]] T1为 [35.51988195] us
<Figure size 432x288 with 0 Axes>
8.2 质因数分解(15)¶
Shor算法的重要意义在于突破了传统密码学安全性,证明了量子计算机的指数级加速能力,并推动了量子安全密码学和基础科学的发展。
以下对15的质因数分解为国盾量子计算云平台发布会上的展示代码,其理论以及来自于论文Nature Physics volume 8, pages719–723 (2012)
In [2]:
Copied!
# Shor 算法分解 15 = 5 x 3 演示
from isq import LocalDevice
from ezQgd import *
import math
import time
account = Account(login_key='2p1adksE+s6ib6uJa5/P/G3sc2O9kejgGBjgIukfGmY=', machine_name='gd_qc1')
# 算法分解 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 次运行 | 结果 |')
print('+------------+------------+')
events = result[0]['results']
index = 0
for s in events[1:100]: #计算最大公约数得到最终结果
index = index + 1
if s[0] == 0 and s[1] == 0:
r = 0
elif s[0] == 1 and s[1] == 0:
r = 1
elif s[0] == 0 and s[1] == 1:
r = 2
elif s[0] == 1 and s[1] == 1:
r = 3
if r == 0:
print('| {:05d}'.format(index)+' | failed |');
else:
p = math.gcd(int(4**(r/2)+1), 15)
q = math.gcd(int(4**(r/2)-1), 15)
print('| {:05d}'.format(index)+' | 15 = '+str(p)+' x '+str(q)+' |')
# Shor 算法分解 15 = 5 x 3 演示
from isq import LocalDevice
from ezQgd import *
import math
import time
account = Account(login_key='2p1adksE+s6ib6uJa5/P/G3sc2O9kejgGBjgIukfGmY=', machine_name='gd_qc1')
# 算法分解 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 次运行 | 结果 |') print('+------------+------------+') events = result[0]['results'] index = 0 for s in events[1:100]: #计算最大公约数得到最终结果 index = index + 1 if s[0] == 0 and s[1] == 0: r = 0 elif s[0] == 1 and s[1] == 0: r = 1 elif s[0] == 0 and s[1] == 1: r = 2 elif s[0] == 1 and s[1] == 1: r = 3 if r == 0: print('| {:05d}'.format(index)+' | failed |'); else: p = math.gcd(int(4**(r/2)+1), 15) q = math.gcd(int(4**(r/2)-1), 15) print('| {:05d}'.format(index)+' | 15 = '+str(p)+' x '+str(q)+' |')
H Q57 Y2P Q51 CZ Q57 Q51 Y2M Q51 Y2P Q62 CZ Q57 Q62 Y2M Q62 H Q57 M Q63 M Q57 查询实验结果请等待: 0.94秒 查询实验结果请等待: 4.21秒 查询实验结果请等待: 0.99秒 查询实验结果请等待: 2.22秒 查询实验结果请等待: 3.96秒 ========= [计算完成] ========= +------------+------------+ | 第 n 次运行 | 结果 | +------------+------------+ | 00001 | 15 = 5 x 3 | | 00002 | failed | | 00003 | 15 = 5 x 3 | | 00004 | failed | | 00005 | 15 = 5 x 3 | | 00006 | 15 = 5 x 3 | | 00007 | 15 = 5 x 3 | | 00008 | failed | | 00009 | failed | | 00010 | failed | | 00011 | 15 = 5 x 3 | | 00012 | failed | | 00013 | 15 = 5 x 3 | | 00014 | failed | | 00015 | 15 = 5 x 3 | | 00016 | failed | | 00017 | 15 = 5 x 3 | | 00018 | failed | | 00019 | 15 = 5 x 3 | | 00020 | failed | | 00021 | 15 = 5 x 3 | | 00022 | failed | | 00023 | failed | | 00024 | 15 = 5 x 3 | | 00025 | 15 = 5 x 3 | | 00026 | 15 = 5 x 3 | | 00027 | failed | | 00028 | 15 = 5 x 3 | | 00029 | failed | | 00030 | 15 = 5 x 3 | | 00031 | 15 = 5 x 3 | | 00032 | failed | | 00033 | 15 = 5 x 3 | | 00034 | failed | | 00035 | 15 = 5 x 3 | | 00036 | 15 = 5 x 3 | | 00037 | failed | | 00038 | 15 = 5 x 3 | | 00039 | 15 = 5 x 3 | | 00040 | failed | | 00041 | failed | | 00042 | 15 = 5 x 3 | | 00043 | 15 = 5 x 3 | | 00044 | 15 = 5 x 3 | | 00045 | failed | | 00046 | failed | | 00047 | failed | | 00048 | 15 = 5 x 3 | | 00049 | failed | | 00050 | 15 = 5 x 3 | | 00051 | 15 = 5 x 3 | | 00052 | 15 = 5 x 3 | | 00053 | 15 = 5 x 3 | | 00054 | 15 = 5 x 3 | | 00055 | failed | | 00056 | 15 = 5 x 3 | | 00057 | failed | | 00058 | 15 = 5 x 3 | | 00059 | 15 = 5 x 3 | | 00060 | 15 = 5 x 3 | | 00061 | failed | | 00062 | 15 = 5 x 3 | | 00063 | 15 = 5 x 3 | | 00064 | failed | | 00065 | failed | | 00066 | failed | | 00067 | 15 = 5 x 3 | | 00068 | 15 = 5 x 3 | | 00069 | 15 = 5 x 3 | | 00070 | 15 = 5 x 3 | | 00071 | 15 = 5 x 3 | | 00072 | 15 = 5 x 3 | | 00073 | 15 = 5 x 3 | | 00074 | 15 = 5 x 3 | | 00075 | failed | | 00076 | 15 = 5 x 3 | | 00077 | 15 = 5 x 3 | | 00078 | 15 = 5 x 3 | | 00079 | 15 = 5 x 3 | | 00080 | failed | | 00081 | 15 = 5 x 3 | | 00082 | failed | | 00083 | failed | | 00084 | 15 = 5 x 3 | | 00085 | failed | | 00086 | 15 = 5 x 3 | | 00087 | 15 = 5 x 3 | | 00088 | failed | | 00089 | 15 = 5 x 3 | | 00090 | failed | | 00091 | failed | | 00092 | 15 = 3 x 1 | | 00093 | 15 = 5 x 3 | | 00094 | 15 = 5 x 3 | | 00095 | 15 = 3 x 1 | | 00096 | 15 = 5 x 3 | | 00097 | 15 = 5 x 3 | | 00098 | 15 = 5 x 3 | | 00099 | 15 = 5 x 3 |