qml.math.trace_distance¶
- trace_distance(state0, state1, check_state=False, c_dtype='complex128')[source]¶
Compute the trace distance between two quantum states.
\[T(\rho, \sigma)=\frac12\|\rho-\sigma\|_1 =\frac12\text{Tr}\left(\sqrt{(\rho-\sigma)^{\dagger}(\rho-\sigma)}\right)\]where \(\|\cdot\|_1\) is the Schatten \(1\)-norm.
The trace distance measures how close two quantum states are. In particular, it upper-bounds the probability of distinguishing two quantum states.
- Parameters
state0 (tensor_like) –
(2**N, 2**N)
or(batch_dim, 2**N, 2**N)
density matrix.state1 (tensor_like) –
(2**N, 2**N)
or(batch_dim, 2**N, 2**N)
density matrix.check_state (bool) – If True, the function will check the states’ validity (shape and norm).
c_dtype (str) – Complex floating point precision type.
- Returns
Trace distance between state0 and state1
- Return type
float
Examples
The trace distance between two equal states is always zero:
>>> x = np.array([[1, 0], [0, 0]]) >>> qml.math.trace_distance(x, x) 0.0
It is possible to use state vectors by first transforming them into density matrices via the
reduce_statevector()
function:>>> y = qml.math.reduce_statevector(np.array([0.2, np.sqrt(0.96)]), [0]) >>> qml.math.trace_distance(x, y) 0.9797958971132713
The quantum states can also be provided as batches of density matrices:
>>> batch0 = np.array([np.eye(2) / 2, np.ones((2, 2)) / 2, np.array([[1, 0],[0, 0]])]) >>> batch1 = np.array([np.ones((2, 2)) / 2, np.ones((2, 2)) / 2, np.array([[1, 0],[0, 0]])]) >>> qml.math.trace_distance(batch0, batch1) array([0.5, 0. , 0. ])
If only one of the two states represent a single element, then the trace distances are taken with respect to that element:
>>> rho = np.ones((2, 2)) / 2 >>> qml.math.trace_distance(rho, batch0) array([0.5 , 0. , 0.70710678])