コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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