使用MindQuantum的过程中,发现量子模拟器运算速度很慢。
可能是设置的并行内核数太低了或者是并行内核数过高,特别是在大型服务器中,如果不设置内核数,默认会占用所有的CPU,速度反而会降低。
在运行代码前,我们需要设置量子模拟器运行时的并行内核数,例如:如果需要设置并行内核数为4,可运行如下代码:
export OMP_NUM_THREADS=4
当发现量子模拟器运算速度很慢的时候,可以适当调整并行内核数。请根据模型规模合理设置并行内核数以达到最优效果。
双量子比特门———CNOT
门,是量子计算中最基本且最常用的量子门,那么在MindQuantum中,我们要如何实现CNOT
门呢?
CNOT
门,其本质上是受控X
门(Controlled-X
gate),如果我们需要执行CNOT
门,只需设定X
门的控制比特位和目标比特位即可(实际上,任意的量子门我们都可以设定控制比特位和所需执行量子门操作的目标比特位)。
如果我们需要执行CNOT
门,运行如下代码:
- import mindquantum as mq
- from mindquantum import X
-
- X.on(1, 0)
x(1 <-: 0)
运行结果为:x(1 <-: 0),其表示第1
位量子比特位为目标比特位,第0
位量子比特位为控制比特位,第1
位量子比特受第0
位量子比特控制,若第0
位量子比特为1,则对第1位量子比特执行X
门操作,否则不作任何操作。
注意:我们需要先设置目标比特位,再设置控制比特位。
为了更加直观,我们将其量子线路打印出来,运行如下代码:
- from mindquantum import Circuit
-
- circuit = Circuit()
- circuit += X.on(1, 0)
- circuit
上述就是MindQuantum中实现CNOT
门的语法,大家需要注意哦!
《参数化量子线路》
在MindQuantum中,量子比特的读取顺序是从左到右还是从右往左?
在我们学习量子计算的理论知识的时候,我们对于量子比特的读取顺序是从左到右,然而在使用MindQuantum的时候,量子比特的读取顺序却是从右往左的。
我们通过一个具体的例子来说明。
首先,运行如下代码,得到一个3量子比特的均匀叠加态:
- from mindquantum.simulator import Simulator
- from mindquantum import H, UN
-
- sim = Simulator('projectq', 3)
-
- circuit1 = Circuit()
- circuit1 += UN(H, 3)
-
- sim.apply_circuit(circuit1)
- print(sim.get_qs(True))
√2/4¦000〉
√2/4¦001〉
√2/4¦010〉
√2/4¦011〉
√2/4¦100〉
√2/4¦101〉
√2/4¦110〉
√2/4¦111〉
从运行的结果可以看到,我们得到了3量子比特的均匀叠加态,需要说明的是,所呈现的量子态,最右位的表示是第0
位量子比特,中间位表示第1
位量子比特,最左位表示第2
位量子比特。
我们再举一个例子,运行如下代码,打印量子线路和此时的量子态:
- sim1 = Simulator('projectq', 2)
-
- circuit2 = Circuit()
- circuit2 += X.on(1)
-
- sim1.apply_circuit(circuit2)
-
- print(sim1)
- circuit2
projectq simulator with 2 qubits.
Current quantum state:
1¦10〉
q0: ─────
q1: ──X──
可以看到此时的量子态为|10〉态,量子态中的数字1表示的是第1
位量子比特为|1〉,数字0表示的是第0
位量子比特为|0〉。我们简单地验证一下,在第1
位量子比特添加测量门,运行如下代码:
- from mindquantum import Measure
-
- circuit2 += Measure('q1').on(1)
- circuit2
shots: 100 Keys: q1│0.00 0.2 0.4 0.6 0.8 1.0 ────────┼───────────┴───────────┴───────────┴───────────┴───────────┴ 1│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │ {'1': 100}
从运行的结果可以看到,对存在测量门的量子比特进行重复采样100次,得到的就是100次1的结果,所以再次验证|10〉态中的|1〉是第1
位量子比特。
因此,在MindQuantum中,量子比特的读取顺序都是从右往左的,大家需要注意哦!
我们可以在MindQuantum中搭建各种各样的量子线路,最后我们还可以将搭建好的量子线路打印出来。例如,我们运行如下代码来搭建量子线路:
- import numpy as np
- from mindquantum import RX, RY
-
- circuit3 = Circuit()
- circuit3 += H.on(0)
- circuit3 += X.on(1, 0)
- circuit3 += RX(np.pi/4).on(0)
- circuit3 += RY(np.pi/2).on(1, 0)
- circuit3 += Measure('q0').on(0)
- circuit3 += Measure('q1').on(1)
- circuit3
q0: ──H────●────RX(π/4)───────●───────M(q0)── │ │ q1: ───────X───────────────RY(π/2)────M(q1)──
但是,有时会出现如下图所示的线路错乱问题。
这个的原因是浏览器等宽字体格式的问题。
这个时候,我们只需要打开浏览器的设置,找到“外观”,找到“自定义字体”,然后在“宽度固定的字体”(有的浏览器为“等宽字体”)下,选择“Consolas”字体即可。此外,用户还可以下载并安装开源的Fira Code字体来获得更优质的输出。当我们设置好等宽字体后,就可以看到最开始打印的量子线路了。(如下网址提供了一些等宽字体供用户自行选择(三款代码字体:Fira Code、JetBrains Mono 与 Cascadia Code - 知乎)