Open1

partial transposeをpythonで実装

BOBOBOBO

n-qubitのdensity matrixでそのsubsystem (qubitのindexのlistで指定)のみtransposeする方法を共有します。
qutipのpartial transposeは壊れているので、自分で書き直しました。
以下のように再帰を使えば良いです。
計算量はqubit数に対して、O(n2^n)です。

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)