第六届·2024 MindSpore 量子计算黑客松热身赛赛题解读
第六届·2024 MindSpore量子计算黑客松火热进行中。本次大赛由量子信息网络产业联盟主办,昇思MindSpore Quantum社区承办,多所高校和单位联合举办。开发者将全面体验全新一代通用量子计算框架MindSpore Quantum。
热身赛为量子计算基础学习和编程演练。完成热身赛的前100名选手将有机会获得定制文化衫1件,数量有限,不容错过。
第一步:关注MindQuantum代码仓,参见量子软件编程指南
第二步:注册并完成华为云账号实名认证。
第三步:登录HiQ量子计算云平台进行在线答题。
热身赛参考文档:https://competition.huaweicloud.com/information/1000042022/noise
每道题目的上方都有两个链接:MindQuantum教程和MindQuantum API参考。两个链接中都能找到题目的解答。小技巧:在MindQuantum API参考中搜索题目中的关键词,可以快速找到对应的内容。
热身赛通过攻略视频回放:https://www.koushare.com/live/details/33684
第一题
这道题考的是如何在线路中用on的方式添加量子门,在MindQuantum中,每个量子门都有on方法,比如X.on(0, 1)就意味着将X门作用在第0个比特上,并且受第1个比特控制。本题要求X门作用在第2个比特上,受第0个和第1个比特控制。因此可以用X.on(2, [0, 1])来表示。可以看到,on方法的第二个参数可以接受包含多个控制位的列表,因此可以方便的添加多控制门。详细用法可以参考 on方法的API文档。
第二题
这道题考的是如何对量子线路进行压缩。在MindSpore Quantum中,Circuit类是量子线路模块,其中实现了很多操作量子线路的方法。其中就有一个方法可以压缩线路,接口名就叫作compress()。因此,这道题调用compress()方法就可以成功通过了。
第三题
这道题考的是线路翻转,也就是说,我们需要将线路的比特顺序上下颠倒。题中给出了一个很长的线路,但是我们并不需要关心线路的具体内容,因为Circuit类中有一个方法可以直接实现线路翻转的功能——reverse_qubits(),我们在代码中直接调用该方法就可以成功通过了。
第四题
这道题考的是如何给参数化量子线路中的变量名添加后缀,掌握这种技巧就可以很方便的搭建变分量子线路了。在mindquantum.core.circuit模块中,add_suffix()函数就可以实现添加后缀的功能。具体来说,它需要接受一个量子线路和一个后缀字符串作为输入参数,然后返回一个添加了后缀的新的量子线路。选手只需要将这个新的量子线路通过+=的方式添加到新构造的线路后面,就可以构造出多层的变分线路了。题中的代码如下:
首先我们需要将add_suffix()函数 import 进来。题目中需要搭建3层线路,因此可以用一个循环实现,在每次循环中都对 new_circ 用+=的方式添加add_suffix()函数返回的新线路,后缀字符串设置为循环计数器的值p,就可以成功通过题目了。
第五题
题目中给出了所有需要用到模块的链接,点击即可查看用法。其中,第三个门——RY受控门可以用RY门简单搭建出来:circ += RY(0.1).on(1, 0) 。QubitOperator可以构造泡利算子,Hamiltonian则是构造哈密顿量的类,因此题中的哈密顿量可以这样构建:ham = Hamiltonian(QubitOperator(“X0 Y1”)) 。最后,运行 sim.get_expectation(ham, circ) 就得到哈密顿量的期望值了。
第六题
mindquantum.algorithm.nisq 中可以看到各种已实现的Ansatz线路,只需要传入比特数和层数即可构造(题中ansatz为RYCascade),构造完成后,circ = RYCascade(n_qubits, depth).circuit 就得到ansatz线路了。
第七题
这题考的是Rn门的构造,以及如何求变分线路参数关于哈密顿量的期望值和梯度。Rn门有3个参数,因此可以像这样构造含参线路: circ += Rn(‘a’,’b’,’c’).on(0) ,哈密顿量的构造方法与第五题类似:ham = Hamiltonian(QubitOperator(“Z0”)) ,梯度算子需要调用模拟器的类方法来得到:grad_ops = sim.get_expectation_with_grad(ham, circ) ,得到的梯度算子可以传入线路参数的具体数值,并返回相应的期望值和梯度: f, g = grad_ops(np.array([alpha, beta, gamma])) ,由于题目需要求α的导数值,最后将得到的梯度值的第一个参数的实部返回即可:return np.real(g[0,0,0]) 。
第八题
此题中涉及的数学概念较多,但总的来说考的是TimeEvolution模块的使用,下面我们详细分析一下。
TimeEvolution类属于mindquantum.core.operator模块,主要功能是根据哈密顿量生成式子对应的量子线路。它接受两个输入参数:第一个是哈密顿量H,第二个是演化时间t。调用TimeEvolution().circuit方法将返回一个量子线路,对应于算符。在某些情况下,生成的线路只是理论值的一种近似,因此会出现精度问题,而这种近似可以通过增加近似阶数 n 来提高精度(具体近似公式如题中所述)。在本题中,我们需要用TimeEvolution生成 n 阶的近似线路,并与理论计算得到的精确值相比较。
可以看到,在题目代码中已经给出了哈密顿量H(第7行)和精确值 m1(第8行),并且在循环中给出了线路对应的矩阵m2(第14行),以及m1与m2比较的代码(第15行)。我们只需要补充第12行,即:用TimeEvolution生成 n 阶的近似线路。
在近似公式中可以发现,所谓n阶近似,就是将演化时间t除以n,变成,再将该式子作用 n次,即。这个式子可以这样构造:括号中的式子可以用TimeEvolution模块生成量子线路,然后将该线路重复n次,即可得到n阶近似线路。我们可以很简洁的实现整个过程:TimeEvolution(h, 1.0/n).circuit*n,一行简短的代码就构造出了n阶近似。
之后这个线路的矩阵m2会与理论解m1相比较,如果达到精度1e-2的话,则跳出循环,这样就得到了达到精度所需的最小的n。
第九题
本题考的是如何在线路中添加噪声。在MindQuantum中,通过ChannelAdder可以构建噪声模型。首先我们通过GateSelector设置需要添加噪声的门,然后用MixerAdder结合想要添加的噪声,例如:MixerAdder([GateSelector('x'),DepolarizingChannelAdder(0.05, 1)]) 。Y门和CNOT门以此类推,最后,通过SequentialAdder结合成一个噪声模型:
第十题
本题考虑的是运行真实量子硬件的情况,此时我们无法直接求得关于哈密顿量的期望值,只能通过处理多次采样获得的比特串来得到结果。 假设线路末态为
,则期望值为(因为)。在采样10000次后,得到的比特串分布应当近似于相应的系数,因此可以认为:a=res.data.get('00', 0)/shots,以此类推,最后将计算出的期望值返回即可。
大赛报名&邀请好友参赛
点击查看奖品和操作步骤:https://competition.huaweicloud.com/information/1000042022/invite
大赛链接:https://competition.huaweicloud.com/information/1000042022/introduction