def test_ginibre_has_correct_second_moment(): # Numerically calculate Eq. 3.20 from # Zyczkowski and Sommers, J. Phys. A: Math. Gen. 34 7111, (2001) # # <Tr[rho^2])_{D,K} = ( D + K ) / ( D * K + 1 ) # # D is dimension of Hilbert space and K is rank of state matrix N_avg = 5000 K = 2 D = 2 avg_purity = 0 for idx in range(0, N_avg): rho = rand_ops.ginibre_state_matrix(D, K) avg_purity += np.trace(np.matmul(rho, rho)) / N_avg ans = (D + K) / (D * K + 1) assert np.absolute(avg_purity - ans) < 1e-2 D = 3 avg_purity = 0 for idx in range(0, N_avg): rho = rand_ops.ginibre_state_matrix(D, K) avg_purity += np.trace(np.matmul(rho, rho)) / N_avg ans = (D + K) / (D * K + 1) assert np.absolute(avg_purity - ans) < 1e-2
def test_ginibre_is_positive_operator(): N_avg = 10 K = 2 D = 2 eigenvallist = [] for idx in range(0, N_avg): eigenval = la.eig(rand_ops.ginibre_state_matrix(D, K))[0] eigenvallist += [eigenval] eigenvalues = np.asarray(eigenvallist) eigenvalues = eigenvalues.reshape(1, D * N_avg) assert np.max(np.absolute(np.imag(eigenvalues))) < 1e-10 assert np.min(np.real(eigenvalues)) >= -1e-10 D = 3 eigenvallist = [] for idx in range(0, N_avg): eigenval = la.eig(rand_ops.ginibre_state_matrix(D, K))[0] eigenvallist += [eigenval] eigenvalues = np.asarray(eigenvallist) eigenvalues = eigenvalues.reshape(1, D * N_avg) assert np.max(np.absolute(np.imag(eigenvalues))) < 1e-10 assert np.min(np.real(eigenvalues)) >= -1e-10
def test_ginibre_is_trace_one(): N_avg = 100 K = 2 D = 2 avg_trace = 0 for idx in range(0, N_avg): avg_trace += np.trace(rand_ops.ginibre_state_matrix(D, K)) / N_avg assert avg_trace <= 1 + 1e-10 assert avg_trace >= 1 - 1e-10