最近开始使用pyqpanda答题,之前一直用qiskit搭电路,初上手pyqpanda 还是有些不适应。
开始入手,本帖验证下门电路的矩阵表示以及多门多线路的矩阵表达。(完全是为了印证下数学概念的表达,没什么高深的东西)
from pyqpanda import *
init(QMachineType.CPU)
qbits = qAlloc_many(2)
prog = QProg()
prog << X(qbits[0])
prog << Z(qbits[1])
mat = np.array(get_matrix(prog,True)).reshape(4,4)
print(mat)
print(draw_qprog(prog))
输出如下:
同样用X,Z门各自的幺正矩阵凑出来如下:
def get_matrix_gate(gate):
init(QMachineType.CPU)
qbits = qAlloc_many(1)
prog = QProg()
prog<<gate(qbits[0])
mat = np.array(get_matrix(prog,True)).reshape(2,2)
return np.mat(mat)
X_mat = get_matrix_gate(X)
print(X_mat)
Z_mat = get_matrix_gate(Z)
print(Z_mat)
print('Tensor product of two gate')
two_qbits_matrix = np.kron(Z_mat,X_mat)
print(two_qbits_matrix)
输出如下:
张量积的矩阵与两个量子比特位的线路矩阵相同,说明:
在pyqpanda 中,
1)索引值高的量子比特位是高位,np.kron(高位门矩阵,低位门矩阵)
2)get_matrix(prog,True) api的第二个参数True表示大小端,在输出矩阵时,尤其是线路矩阵时,!!必须!!,强调下,必须指定为True,否则输出的高低位顺序是反的。然而pyqpanda.get_matrix()中默认是False,这样输出的矩阵对应: 低位矩阵 kron 高位矩阵,如果直接与态矢量(4 by 1)相乘会出错!
比如,默认调用 get_matrix 口:
from pyqpanda import *
init(QMachineType.CPU)
qbits = qAlloc_many(2)
prog = QProg()
prog << X(qbits[0])
prog << Z(qbits[1])
mat = np.array(get_matrix(prog)).reshape(4,4)
print(draw_qprog(prog))
print('Two qbits circuit matrix: ')
print(mat)
print('Tensor product of two gate (X_mat )')
two_qbits_matrix = np.kron(X_mat,Z_mat)
print(two_qbits_matrix)
输出:
初步使用pyqpanda时,发现这个小的不便之处。
之前使用qiskit 打印电路的矩阵时,默认是输出 高位矩阵直积低位矩阵的结果。