量子逻辑门¶
经典计算中,最基本的单元是比特,而最基本的控制模式是逻辑门。我们可以通过逻辑门的组合来达到我们控制电路的目的。类似地,处理量子比特的方式就是量子逻辑门。 使用量子逻辑门,我们有意识的使量子态发生演化。所以量子逻辑门是构成量子算法的基础。
量子逻辑门由酉矩阵表示。最常见的量子门在一个或两个量子位的空间上工作,就像常见的经典逻辑门在一个或两个位上操作一样。
常见量子逻辑门矩阵形式¶
单比特量子逻辑门:
I |
\(\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\quad\)
|
|
Hadamard |
\(\begin{bmatrix} 1/\sqrt {2} & 1/\sqrt {2} \\ 1/\sqrt {2} & -1/\sqrt {2} \end{bmatrix}\quad\)
|
|
T |
\(\begin{bmatrix} 1 & 0 \\ 0 & \exp(i\pi / 4) \end{bmatrix}\quad\)
|
|
S |
\(\begin{bmatrix} 1 & 0 \\ 0 & 1i \end{bmatrix}\quad\)
|
|
Pauli-X |
\(\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\quad\)
|
|
Pauli-Y |
\(\begin{bmatrix} 0 & -1i \\ 1i & 0 \end{bmatrix}\quad\)
|
|
Pauli-Z |
\(\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}\quad\)
|
|
X1 |
\(\begin{bmatrix} 1/\sqrt {2} & -1i/\sqrt {2} \\ -1i/\sqrt {2} & 1/\sqrt {2} \end{bmatrix}\quad\)
|
|
Y1 |
\(\begin{bmatrix} 1/\sqrt {2} & -1/\sqrt {2} \\ 1/\sqrt {2} & 1/\sqrt {2} \end{bmatrix}\quad\)
|
|
Z1 |
\(\begin{bmatrix} \exp(-i\pi/4) & 0 \\ 0 & \exp(i\pi/4) \end{bmatrix}\quad\)
|
|
RX |
\(\begin{bmatrix} \cos(\theta/2) & -1i×\sin(\theta/2) \\ -1i×\sin(\theta/2) & \cos(\theta/2) \end{bmatrix}\quad\)
|
|
RY |
\(\begin{bmatrix} \cos(\theta/2) & -\sin(\theta/2) \\ \sin(\theta/2) & \cos(\theta/2) \end{bmatrix}\quad\)
|
|
RZ |
\(\begin{bmatrix} \exp(-i\theta/2) & 0 \\ 0 & \exp(i\theta/2) \end{bmatrix}\quad\)
|
|
U1 |
\(\begin{bmatrix} 1 & 0 \\ 0 & \exp(i\theta) \end{bmatrix}\quad\)
|
|
U2 |
\(\begin{bmatrix} 1/\sqrt {2} & -\exp(i\lambda)/\sqrt {2} \\ \exp(i\phi)/\sqrt {2} & \exp(i\lambda+i\phi)/\sqrt {2} \end{bmatrix}\quad\)
|
|
U3 |
\(\begin{bmatrix} \cos(\theta/2) & -\exp(i\lambda)×\sin(\theta/2) \\ \exp(i\phi)×\sin(\theta/2) & \exp(i\lambda+i\phi)×\cos(\theta/2) \end{bmatrix}\quad\)
|
|
U4 |
\(\begin{bmatrix} u0 & u1 \\ u2 & u3 \end{bmatrix}\quad\)
|
多比特量子逻辑门:
CNOT |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{bmatrix}\quad\)
|
|
CR |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & \exp(i\theta) \end{bmatrix}\quad\)
|
|
iSWAP |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos(\theta) & -i×\sin(\theta) & 0 \\ 0 & -i×\sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\quad\)
|
|
SWAP |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\quad\)
|
|
CZ |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \end{bmatrix}\quad\)
|
|
CU |
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & u0 & u1 \\ 0 & 0 & u2 & u3 \end{bmatrix}\quad\)
|
|
Toffoli |
\(\begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ \end{bmatrix}\quad\)
|
QPanda 2把所有的量子逻辑门封装为API向用户提供使用,并可获得QGate类型的返回值。比如,您想要使用Hadamard门,就可以通过如下方式获得:
from pyqpanda import * import numpy as np qvm = CPUQVM() qvm.init() qubits = qvm.qAlloc_many(4) h = H(qubits[0])
其中参数为目标比特,返回值为量子逻辑门
pyqpanda中支持的不含角度的单门有: I
、 H
、 T
、 S
、 X
、 Y
、 Z
、 X1
、 Y1
、 Z1
qubit如何申请会在 量子虚拟机 部分介绍。
单门带有一个旋转角的逻辑门门,例如RX门:
rx = RX(qubits[0],np.pi/3)
第一个参数为目标比特 第二个参数为旋转角度
pyqpanda中支持的单门带有一个旋转角度的逻辑门有: RX
、RY
、RZ
、U1
pyqpanda中还支持 U2
、U3
、U4
门,其用法如下:
# U2(qubit, phi, lambda) 有两个角度 u2 = U2(qubits[0],np.pi, np.pi/2) # U3(qubit, theta, phi, lambda) 有三个角度 u3 = U3(qubits[0],np.pi, np.pi/2, np.pi/4) # U4(qubit, alpha, beta, gamma, delta) 有四个角度 u4 = U4(qubits[0],np.pi, np.pi/2, np.pi/4, np.pi/2)
两比特量子逻辑门的使用和单比特量子逻辑门的用法相似,只不过是输入的参数不同,例如CNOT门:
cnot = CNOT(qubits[0],qubits[1])
第一个参数为控制比特 第二个参数为目标比特 注:两个比特不能相同
pyqpanda中支持的双门不含角度的逻辑门有: CNOT
、CZ
、SWAP
、iSWAp
、SqiSWAP
双门带有旋转角度的门,例如CR门:
cr = CR(qubits[0],qubits[1],np.pi)
第一个参数为控制比特, 第二个参数为目标比特, 第三个参数为旋转角度
支持CU门,使用方法如下:
# CU(control, target, alpha, beta, gamma, delta) 有四个角度 cu = CU(qubits[0],qubits[1],np.pi,np.pi/2,np.pi/3,np.pi/4)
获得三量子逻辑门 Toffoli
的方式:
toffoli = Toffoli(qubits[0], qubits[1], qubits[2])
三比特量子逻辑门Toffoli实际上是CCNOT门,前两个参数是控制比特,最后一个参数是目标比特。
接口介绍¶
在本章的开头介绍过,所有的量子逻辑门都是酉矩阵,那么您也可以对量子逻辑门做转置共轭操作,获得一个量子逻辑门 dagger
之后的量子逻辑门可以用下面的方法:
rx_dagger = RX(qubits[0], np.pi).dagger()
或:
rx_dagger = RX(qubits[0], np.pi) rx_dagger.set_dagger(true)
也可以为量子逻辑门添加控制比特,获得一个量子逻辑门 control 之后的量子逻辑门可以用下面的方法:
qvec = [qubits[0], qubits[1]] rx_control = RX(qubits[2], np.pi).control(qvec)
- 或:
qvec = [qubits[0], qubits[1]] rx_control = RX(qubits[2], np.pi) rx_control.set_control(qvec)
pyqpanda 还封装了一些比较方便的接口,会简化一些量子逻辑门的操作
cir = apply_QGate(qubits, H)
qubits的每个量子比特都添加H们
实例¶
以下实例主要是向您展现QGate类型接口的使用方式.
from pyqpanda import * if __name__ == "__main__": qvm = CPUQVM() qvm.init_qvm() qubits = qvm.qAlloc_many(3) control_qubits = [qubits[0], qubits[1]] prog = QProg() # 构建量子程序 prog << apply_QGate([qubits[0], qubits[1]], H) \ << H(qubits[0]).dagger() \ << X(qubits[2]).control(control_qubits) # 对量子程序进行概率测量 result = qvm.prob_run_dict(prog, qubits, -1) # 打印测量结果 print(result)
计算结果如下:
{'000': 0.4999999999999894, '001': 0.0, '010': 0.4999999999999894, '011': 0.0, '100': 0.0, '101': 0.0, '110': 0.0, '111': 0.0}