Open1
partial transposeをpythonで実装
n-qubitのdensity matrixでそのsubsystem (qubitのindexのlistで指定)のみtransposeする方法を共有します。
qutipのpartial transposeは壊れているので、自分で書き直しました。
以下のように再帰を使えば良いです。
計算量はqubit数に対して、
def partial_transpose(n, rho, subsystem):
return _partial_transpose(n, rho, [n - sub for sub in subsystem])
def _partial_transpose(n, rho, subsystem):
if n == 1:
if n in subsystem:
return rho.transpose()
else:
return rho
else:
size = rho.shape[0]
rho_00 = _partial_transpose(n - 1, rho[:size // 2, :size // 2], subsystem)
rho_01 = _partial_transpose(n - 1, rho[:size // 2, size // 2:], subsystem)
rho_10 = _partial_transpose(n - 1, rho[size // 2:, :size // 2], subsystem)
rho_11 = _partial_transpose(n - 1, rho[size // 2:, size // 2:], subsystem)
if n in subsystem:
return np.concatenate([np.concatenate([rho_00, rho_10], axis = 1), np.concatenate([rho_01, rho_11], axis=1)], axis=0)
else:
return np.concatenate([np.concatenate([rho_00, rho_01], axis = 1), np.concatenate([rho_10, rho_11], axis=1)], axis=0)