Source code for toqito.states.horodecki

"""Horodecki state."""
import numpy as np


[docs] def horodecki(a_param: float, dim: list[int] = None) -> np.ndarray: r""" Produce a Horodecki state [HOR]_, [CHR]_. Returns the Horodecki state in either :math:`(3 \otimes 3)`-dimensional space or :math:`(2 \otimes 4)`-dimensional space, depending on the dimensions in the 1-by-2 vector :code:`dim`. The Horodecki state was introduced in [1] which serves as an example in :math:`\mathbb{C}^3 \otimes \mathbb{C}` or :math:`\mathbb{C}^2 \otimes \mathbb{C}^4` of an entangled state that is positive under partial transpose (PPT). The state is PPT for all :math:`a \in [0, 1]` and separable only for :code:`a_param = 0` or :code:`a_param = 1`. These states have the following definitions: .. math:: \begin{equation} \rho_a^{3 \otimes 3} = \frac{1}{8a + 1} \begin{pmatrix} a & 0 & 0 & 0 & a & 0 & 0 & 0 & a \\ 0 & a & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & a & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & a & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & a & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & a & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & \frac{1}{2} \left( 1 + a \right) & 0 & \frac{1}{2} \sqrt{1 - a^2} \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & a & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & \frac{1}{2} \sqrt{1 - a^2} & 0 & \frac{1}{2} \left(1 + a \right) \\ \end{pmatrix}, \end{equation} .. math:: \begin{equation} \rho_a^{2 \otimes 4} = \frac{1}{7a + 1} \begin{pmatrix} a & 0 & 0 & 0 & 0 & a & 0 & 0 \\ 0 & a & 0 & 0 & 0 & 0 & a & 0 \\ 0 & 0 & a & 0 & 0 & 0 & 0 & a \\ 0 & 0 & 0 & a & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & \frac{1}{2} \left(1 + a\right) & 0 & 0 & \frac{1}{2}\sqrt{1 -a^2} \\ a & 0 & 0 & 0 & 0 & a & 0 & 0 \\ 0 & a & 0 & 0 & 0 & 0 & a & 0 \\ 0 & 0 & a & 0 & \frac{1}{2}\sqrt{1 - a^2} & 0 & 0 & \frac{1}{2}\left(1 +a \right) \end{pmatrix}. \end{equation} .. note:: Refer to [CHR]_ (specifically equations (1) and (2)) for more information on this state and its properties. The 3x3 Horodecki state is defined explicitly in Section 4.1 of [HOR]_ and the 2x4 Horodecki state is defined explicitly in Section 4.2 of [HOR]_. Examples ========== The following code generates a Horodecki state in :math:`\mathbb{C}^3 \otimes \mathbb{C}^3` >>> from toqito.states import horodecki >>> horodecki(0.5, [3, 3]) [[0.1 , 0. , 0. , 0. , 0.1 , 0. , 0. , 0. , 0.1 ], [0. , 0.1 , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0.1 , 0. , 0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0.1 , 0. , 0. , 0. , 0. , 0. ], [0.1 , 0. , 0. , 0. , 0.1 , 0. , 0. , 0. , 0.1 ], [0. , 0. , 0. , 0. , 0. , 0.1 , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0. , 0. , 0.15 , 0. , 0.08660254], [0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.1 , 0. ], [0.1 , 0. , 0. , 0. , 0.1 , 0. , 0.08660254, 0. , 0.15 ]] The following code generates a Horodecki state in :math:`\mathbb{C}^2 \otimes \mathbb{C}^4`. >>> from toqito.states import horodecki >>> horodecki(0.5, [2, 4]) [[0.11111111, 0. , 0. , 0. , 0. , 0.11111111, 0. , 0. ], [0. , 0.11111111, 0. , 0. , 0. , 0. , 0.11111111, 0. ], [0. , 0. , 0.11111111, 0. , 0. , 0. , 0. , 0.11111111], [0. , 0. , 0. , 0.11111111, 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0.16666667, 0. , 0. , 0.09622504], [0.11111111, 0. , 0. , 0. , 0. , 0.11111111, 0. , 0. ], [0. , 0.11111111, 0. , 0. , 0. , 0. , 0.11111111, 0. ], [0. , 0. , 0.11111111, 0. , 0.09622504, 0. , 0. , 0.16666667]] References ========== .. [HOR] P. Horodecki. Separability criterion and inseparable mixed states with positive partial transpose. arXiv: 970.3004. .. [CHR] K. Chruscinski. On the symmetry of the seminal Horodecki state. arXiv: 1009.4385. """ if a_param < 0 or a_param > 1: raise ValueError("Invalid: Argument A_PARAM must be in the interval [0, 1].") if dim is None: dim = np.array([3, 3]) if np.array_equal(dim, np.array([3, 3])): n_a_param = 1 / (8 * a_param + 1) b_param = (1 + a_param) / 2 c_param = np.sqrt(1 - a_param**2) / 2 horo_state = n_a_param * np.array( [ [a_param, 0, 0, 0, a_param, 0, 0, 0, a_param], [0, a_param, 0, 0, 0, 0, 0, 0, 0], [0, 0, a_param, 0, 0, 0, 0, 0, 0], [0, 0, 0, a_param, 0, 0, 0, 0, 0], [a_param, 0, 0, 0, a_param, 0, 0, 0, a_param], [0, 0, 0, 0, 0, a_param, 0, 0, 0], [0, 0, 0, 0, 0, 0, b_param, 0, c_param], [0, 0, 0, 0, 0, 0, 0, a_param, 0], [a_param, 0, 0, 0, a_param, 0, c_param, 0, b_param], ] ) return horo_state if np.array_equal(dim, np.array([2, 4])): n_a_param = 1 / (7 * a_param + 1) b_param = (1 + a_param) / 2 c_param = np.sqrt(1 - a_param**2) / 2 horo_state = n_a_param * np.array( [ [a_param, 0, 0, 0, 0, a_param, 0, 0], [0, a_param, 0, 0, 0, 0, a_param, 0], [0, 0, a_param, 0, 0, 0, 0, a_param], [0, 0, 0, a_param, 0, 0, 0, 0], [0, 0, 0, 0, b_param, 0, 0, c_param], [a_param, 0, 0, 0, 0, a_param, 0, 0], [0, a_param, 0, 0, 0, 0, a_param, 0], [0, 0, a_param, 0, c_param, 0, 0, b_param], ] ) return horo_state raise ValueError("InvalidDim: DIM must be one of [3, 3], or [2, 4].")