看着好像没几个正经的答案,那就勉强答一发吧。
时间坐标2019-2020,当时Quantum Information课设跟着两个队友准备搞点事情,开始选题的时候心潮澎湃.....Shor/HHL//VQE/QAOA...etc(均为各种花里胡哨的量子算法),后来发现能用的physical qubit顶多三五个...人都裂了
Sycamore和IBM的premium硬件是肯定用不起的,作为穷学生,只能玩开放的免费硬件。当时IBM的开放硬件大概是Yorktown,Athens那一批 [1] ,就三五个比特,教授自己实验室的Quantum Inspire [2] 也不太行
![](https://img.jasve.com/2024-4/a3149a4436191f5e8951664b45030be5.webp)
就这三五个比特fidelity还差的离谱...而且还没有全联通(比如见上图),远距离的qubit做门只能花式SWAP....
ps想放个当时fidelity的数据在这的,好家伙一看IBM的硬件现在都27个qubit了,老硬件都淘汰了,离谱....勉强拿Santiago的数据看一下吧
![](https://img.jasve.com/2024-4/7e35052b5e8a3d9c31fa6a2843eb0131.webp)
Santiago的CNOT的error大概在1e-3这个量级,比起当时用的来说已经高了不少...
(personally我觉得这玩意完全不能叫量子计算机,顶多叫可控多比特系统)
没办法只能变着花在这几个qubit上搞点东西出来...当时想的是大规模的线路效果估计也不好,那就整点toy model做做benchmark....看看跟预期结果差多少。
然后就跟室友整了个非常弱智的线路,近似克隆算法(Quantum Approximate Cloning Machine , QACM) [3] 。根据non-cloning theorem,量子态是不可能被完美复制的,但是我们可以通过QACM提取出最大上限的量子信息然后复制一个近似的态,这个态的fidelity理论上限是5/6
这玩意的线路大概是这样的
![](https://img.jasve.com/2024-4/c5a2720cf101397e5fcc0847b72a2566.webp)
![](https://img.jasve.com/2024-4/fb02ff5c09259c56818ad1a036cc9c39.webp)
![](https://img.jasve.com/2024-4/7b9a4993d8ed08206f8625f2cdc9c2e5.webp)
你没看错,这玩意一共用了3个qubit,一个目标输入 a0,一个复制输出 a1,一个ancilla(辅助比特)b1。这个线路实际实现的是一个projective measurement+copy的过程。因而输入态a0的信息必然会有所损失,最终实现的结果是 \rho_1=\rho_2
好了,重点来了, 写代码是什么体验?
答案是根本没啥体验,因为完全算不上代码....
大部分云平台的都采用的可视化editor,鼠标上去拖两下就完事了,比如IBM Q Experience的界面如图
![](https://img.jasve.com/2024-4/f636d77366bc81ecae1d8e4e1c2882ba.webp)
当然如果你实在想不开的话也可以去写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线路的推导如下
![](https://img.jasve.com/2024-4/1e7fe4a76c5d0abbbe4269ab66c03cdc.webp)
以上的 |\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试试
以上
参考
- ^https://quantum-computing.ibm.com/
- ^https://www.quantum-inspire.com/about-qi/
- ^https://journals.aps.org/pra/abstract/10.1103/PhysRevA.62.012302