天天看點

pyqpanda中的線路矩陣與科羅内克張量積的驗證

最近開始使用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))
           

輸出如下:

pyqpanda中的線路矩陣與科羅内克張量積的驗證

同樣用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中的線路矩陣與科羅内克張量積的驗證

張量積的矩陣與兩個量子比特位的線路矩陣相同,說明:

在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中的線路矩陣與科羅内克張量積的驗證

初步使用pyqpanda時,發現這個小的不便之處。

之前使用qiskit 列印電路的矩陣時,預設是輸出 高位矩陣直積低位矩陣的結果。

繼續閱讀