state_props.schmidt_rank

Calculate the Schmidt rank of a quantum state.

Functions

schmidt_rank(rho[, dim])

Compute the Schmidt rank [1].

_operator_schmidt_rank(rho[, dim])

Operator Schmidt rank of variable.

Module Contents

state_props.schmidt_rank.schmidt_rank(rho, dim=None)

Compute the Schmidt rank [1].

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.

>>> from toqito.states import bell
>>> from toqito.state_props import schmidt_rank
>>> rho = bell(0) @ bell(0).conj().T
>>> schmidt_rank(rho)
np.int64(4)

Computing the Schmidt rank of the entangled singlet state should yield a value greater than \(1\).

>>> from toqito.states import bell
>>> from toqito.state_props import schmidt_rank
>>> u = bell(2) @ bell(2).conj().T
>>> schmidt_rank(u)
np.int64(4)

Computing the Schmidt rank of a separable state should yield a value equal to \(1\).

>>> 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
>>> schmidt_rank(rho)
np.int64(1)

References

[1] (1,2)

Wikipedia. Schmidt decomposition. URL: https://en.wikipedia.org/wiki/Schmidt_decomposition.

Parameters:
  • rho (numpy.ndarray) – A bipartite vector or matrix to have its Schmidt rank computed.

  • dim (int | list[int] | numpy.ndarray) – A 1-by-2 vector or matrix.

Returns:

The Schmidt rank of rho.

Return type:

float

state_props.schmidt_rank._operator_schmidt_rank(rho, dim=None)

Operator Schmidt rank of variable.

If the input is provided as a density operator instead of a vector, compute the operator Schmidt rank.

Parameters:
  • rho (numpy.ndarray)

  • dim (int | list[int] | numpy.ndarray)

Return type:

float