toqito.state_props.schmidt_rank¶
Calculate the Schmidt rank of a quantum state.
Module Contents¶
- toqito.state_props.schmidt_rank.schmidt_rank(rho, dim=None)[source]¶
Compute the Schmidt rank [@WikiScmidtDecomp].
For complex Euclidean spaces (mathcal{X}) and (mathcal{Y}), a pure state (u in mathcal{X} otimes mathcal{Y}) possesses an expansion of the form:
- [
u = sum_{i} lambda_i v_i w_i,
]
where (v_i in mathcal{X}) and (w_i in mathcal{Y}) are orthonormal states.
The Schmidt coefficients are calculated from
- [
A = text{Tr}_{mathcal{B}}(u^* u).
]
The Schmidt rank is the number of non-zero eigenvalues of (A). The Schmidt rank allows us to determine if a given state is entangled or separable. For instance:
If the Schmidt rank is 1: The state is separable,
If the Schmidt rank > 1: The state is entangled.
Compute the Schmidt rank of the input rho, provided as either a vector or a matrix that is assumed to live in bipartite space, where both subsystems have dimension equal to sqrt(len(vec)).
The dimension may be specified by the 1-by-2 vector dim and the rank in that case is determined as the number of Schmidt coefficients larger than tol.
Examples
Computing the Schmidt rank of the entangled Bell state should yield a value greater than one.
`python exec="1" source="above" from toqito.states import bell from toqito.state_props import schmidt_rank rho = bell(0) @ bell(0).conj().T print(schmidt_rank(rho)) `Computing the Schmidt rank of the entangled singlet state should yield a value greater than (1).
`python exec="1" source="above" from toqito.states import bell from toqito.state_props import schmidt_rank u = bell(2) @ bell(2).conj().T print(schmidt_rank(u)) `Computing the Schmidt rank of a separable state should yield a value equal to (1).
`python exec="1" source="above" from toqito.states import basis from toqito.state_props import schmidt_rank import numpy as np e_0, e_1 = basis(2, 0), basis(2, 1) e_00 = np.kron(e_0, e_0) e_01 = np.kron(e_0, e_1) e_10 = np.kron(e_1, e_0) e_11 = np.kron(e_1, e_1) rho = 1 / 2 * (e_00 - e_01 - e_10 + e_11) rho = rho @ rho.conj().T print(schmidt_rank(rho)) `- Parameters:
rho (numpy.ndarray) – A bipartite vector or matrix to have its Schmidt rank computed.
dim (int | list[int] | numpy.ndarray | None) – A 1-by-2 vector or matrix.
- Returns:
The Schmidt rank of rho.
- Return type:
int | float