当前位置: 华文星空 > 知识

用量子计算机写代码会是一番怎样的体验?

2014-12-08知识

看着好像没几个正经的答案,那就勉强答一发吧。

时间坐标2019-2020,当时Quantum Information课设跟着两个队友准备搞点事情,开始选题的时候心潮澎湃.....Shor/HHL//VQE/QAOA...etc(均为各种花里胡哨的量子算法),后来发现能用的physical qubit顶多三五个...人都裂了

Sycamore和IBM的premium硬件是肯定用不起的,作为穷学生,只能玩开放的免费硬件。当时IBM的开放硬件大概是Yorktown,Athens那一批 [1] ,就三五个比特,教授自己实验室的Quantum Inspire [2] 也不太行

就这三五个比特fidelity还差的离谱...而且还没有全联通(比如见上图),远距离的qubit做门只能花式SWAP....

ps想放个当时fidelity的数据在这的,好家伙一看IBM的硬件现在都27个qubit了,老硬件都淘汰了,离谱....勉强拿Santiago的数据看一下吧

Santiago的CNOT的error大概在1e-3这个量级,比起当时用的来说已经高了不少...

(personally我觉得这玩意完全不能叫量子计算机,顶多叫可控多比特系统)

没办法只能变着花在这几个qubit上搞点东西出来...当时想的是大规模的线路效果估计也不好,那就整点toy model做做benchmark....看看跟预期结果差多少。

然后就跟室友整了个非常弱智的线路,近似克隆算法(Quantum Approximate Cloning Machine , QACM) [3] 。根据non-cloning theorem,量子态是不可能被完美复制的,但是我们可以通过QACM提取出最大上限的量子信息然后复制一个近似的态,这个态的fidelity理论上限是5/6

这玩意的线路大概是这样的

总的线路,包括prepare(准备)和copy(复制)两个过程
用于准备态的子线路
用于复制的子线路

你没看错,这玩意一共用了3个qubit,一个目标输入 a0,一个复制输出 a1,一个ancilla(辅助比特)b1。这个线路实际实现的是一个projective measurement+copy的过程。因而输入态a0的信息必然会有所损失,最终实现的结果是 \rho_1=\rho_2

好了,重点来了, 写代码是什么体验?

答案是根本没啥体验,因为完全算不上代码....

大部分云平台的都采用的可视化editor,鼠标上去拖两下就完事了,比如IBM Q Experience的界面如图

当然如果你实在想不开的话也可以去写QASM,大概是这样的

OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg c[2]; ry(0.1415394733244273) q[0]; rx(-1.5707963267948966) q[0]; sdg q[1]; h q[1]; tdg q[1]; cx q[0], q[1]; t q[1]; h q[1]; s q[1]; cx q[1], q[0]; rx(1.5707963267948966) q[0]; ry(-0.1415394733244273) q[0]; rx(1.5707963267948966) q[1]; ry(-0.1415394733244273) q[1]; measure q[0] -> c[0]; measure q[1] -> c[1];

或者用Qikist的py接口,

from qiskit import QuantumRegister, classicalRegister, QuantumCircuit from numpy import pi qreg_q = QuantumRegister(2, 'q') creg_c = classicalRegister(2, 'c') circuit = QuantumCircuit(qreg_q, creg_c) circuit.ry(0.1415394733244273, qreg_q[0]) circuit.rx(-1.5707963267948966, qreg_q[0]) circuit.sdg(qreg_q[1]) circuit.h(qreg_q[1]) circuit.tdg(qreg_q[1]) circuit.cx(qreg_q[0], qreg_q[1]) circuit.t(qreg_q[1]) circuit.h(qreg_q[1]) circuit.s(qreg_q[1]) circuit.cx(qreg_q[1], qreg_q[0]) circuit.rx(1.5707963267948966, qreg_q[0]) circuit.ry(-0.1415394733244273, qreg_q[0]) circuit.rx(1.5707963267948966, qreg_q[1]) circuit.ry(-0.1415394733244273, qreg_q[1]) circuit.measure(qreg_q[0], creg_c[0]) circuit.measure(qreg_q[1], creg_c[1])

但是实际上搞这些没什么意义,因为量子线路的QASM完全不具备任何可读性。毕竟QASM只封装到了门(quantum gate)的级别,而量子门对标的是经典数字电路的逻辑门(与或非,NOT,AND,NAND etc),连汇编都算不上..... .

手写汇编已经很反人类了,设计逻辑电路emmmm,只能说目前这个领域还停留在EE级别,跟CS和所谓的代码完全没得关系,请各位程序员老哥别给自己加戏。

非要说写代码的话大概就是拿qiskit的api写个脚本,调IBM的硬件,因为当时扫的参数比较多,还整了个batch改参数....导致那几天IBM Q的后台基本都是400+的排队

在当下这个阶段,设计算法重要的不是写代码,而是理解推导quantum circuit,而这一过程是非常数学且反直觉的,比如上面那个看起来很弱智的copy线路的推导如下

以上的 |\Psi_1\rangle,|\Psi_2\rangle,|\Psi_3\rangle,|\Psi_4\rangle,|\Psi_5\rangle 分别为copy子线路中五条标记的红线位置处的量子态。

量子线路的推导是这样的,先把初始的量子态写出来(很多时候是叠加态)然后每经过一个门就跟根据相应的门操作对态做一次变换,然后把新的态写出来。直到推导完最后一个门。

题主问会不会处理叠加态变量,的确是会处理的,但是这个过程更多是提前做的数学推导,然后发现这一套门的确能取得我们想要的效果,之后要做的就是把门排列起来。

所以说在量子计算机上写代码不存在的,只有数学推导和排门电路两个过程。

pps. 补充一下,手滑把线路的图贴错了,当时一共做了三种线路,QACM,还有两种变体 Phase-Covariant QACM (用于复制XZ轴上的态)以及Economical QACM(经济型,即只有两个qubit)...贴的是EQACM的

ppps. 再补充一下,如果线路规模大了的话再手排门效率会低很多,这时候的确可以用到一些基本的封装比如量子傅里叶变换线路(QFT,线路排列方式是固定的)。但是目前我暂时还不了解有带封装的高级语言,因为NISQ时期能用的qubit的确太少了。

不过诸君也能看出来,量子计算领域的进步还是非常神速的,最起码IBM Q的qubit数量已经翻了好多倍了(至于fidelity能不能摆脱随机数发生器的范围那就另说了,有空可以跑个QAOA试试

以上

参考

  1. ^https://quantum-computing.ibm.com/
  2. ^https://www.quantum-inspire.com/about-qi/
  3. ^https://journals.aps.org/pra/abstract/10.1103/PhysRevA.62.012302