量子逻辑门


经典计算中,最基本的单元是比特,而最基本的控制模式是逻辑门。我们可以通过逻辑门的组合来达到我们控制电路的目的。类似地,处理量子比特的方式就是量子逻辑门。 使用量子逻辑门,我们有意识的使量子态发生演化。所以量子逻辑门是构成量子算法的基础。

量子逻辑门由酉矩阵表示。最常见的量子门在一个或两个量子位的空间上工作,就像常见的经典逻辑门在一个或两个位上操作一样。

常见量子逻辑门矩阵形式

单比特量子逻辑门:

I
I
\(\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\quad\)
H
Hadamard
\(\begin{bmatrix} 1/\sqrt {2} & 1/\sqrt {2} \\ 1/\sqrt {2} & -1/\sqrt {2} \end{bmatrix}\quad\)
T
T
\(\begin{bmatrix} 1 & 0 \\ 0 & \exp(i\pi / 4) \end{bmatrix}\quad\)
S
S
\(\begin{bmatrix} 1 & 0 \\ 0 & 1i \end{bmatrix}\quad\)
X
Pauli-X
\(\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\quad\)
Y
Pauli-Y
\(\begin{bmatrix} 0 & -1i \\ 1i & 0 \end{bmatrix}\quad\)
Z
Pauli-Z
\(\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}\quad\)
X1
X1
\(\begin{bmatrix} 1/\sqrt {2} & -1i/\sqrt {2} \\ -1i/\sqrt {2} & 1/\sqrt {2} \end{bmatrix}\quad\)
Y1
Y1
\(\begin{bmatrix} 1/\sqrt {2} & -1/\sqrt {2} \\ 1/\sqrt {2} & 1/\sqrt {2} \end{bmatrix}\quad\)
Z1
Z1
\(\begin{bmatrix} \exp(-i\pi/4) & 0 \\ 0 & \exp(i\pi/4) \end{bmatrix}\quad\)
RX
RX
\(\begin{bmatrix} \cos(\theta/2) & -1i×\sin(\theta/2) \\ -1i×\sin(\theta/2) & \cos(\theta/2) \end{bmatrix}\quad\)
RY
RY
\(\begin{bmatrix} \cos(\theta/2) & -\sin(\theta/2) \\ \sin(\theta/2) & \cos(\theta/2) \end{bmatrix}\quad\)
RZ
RZ
\(\begin{bmatrix} \exp(-i\theta/2) & 0 \\ 0 & \exp(i\theta/2) \end{bmatrix}\quad\)
U1
U1
\(\begin{bmatrix} 1 & 0 \\ 0 & \exp(i\theta) \end{bmatrix}\quad\)
U2
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
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
U4
\(\begin{bmatrix} u0 & u1 \\ u2 & u3 \end{bmatrix}\quad\)

多比特量子逻辑门:

CNOT
CNOT
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{bmatrix}\quad\)
CR
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
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
SWAP
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\quad\)
CZ
CZ
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \end{bmatrix}\quad\)
CU
CU
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & u0 & u1 \\ 0 & 0 & u2 & u3 \end{bmatrix}\quad\)
Toffoli
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中支持的不含角度的单门有: IHTSXYZX1Y1Z1

qubit如何申请会在 量子虚拟机 部分介绍。

单门带有一个旋转角的逻辑门门,例如RX门:

rx = RX(qubits[0],np.pi/3)

第一个参数为目标比特 第二个参数为旋转角度

pyqpanda中支持的单门带有一个旋转角度的逻辑门有: RXRYRZU1

pyqpanda中还支持 U2U3U4 门,其用法如下:

# 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中支持的双门不含角度的逻辑门有: CNOTCZSWAPiSWApSqiSWAP

双门带有旋转角度的门,例如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}