Source code for toqito.matrices.gen_gell_mann

"""Generalized Gell-Mann matrices."""
from __future__ import annotations
from scipy import sparse

import numpy as np


[docs] def gen_gell_mann( ind_1: int, ind_2: int, dim: int, is_sparse: bool = False ) -> np.ndarray | sparse.lil_matrix: r""" Produce a generalized Gell-Mann operator [WikGM2]_. Construct a :code:`dim`-by-:code:`dim` Hermitian operator. These matrices span the entire space of :code:`dim`-by-:code:`dim` matrices as :code:`ind_1` and :code:`ind_2` range from 0 to :code:`dim-1`, inclusive, and they generalize the Pauli operators when :code:`dim = 2` and the Gell-Mann operators when :code:`dim = 3`. Examples ========== The generalized Gell-Mann matrix for :code:`ind_1 = 0`, :code:`ind_2 = 1` and :code:`dim = 2` is given as .. math:: G_{0, 1, 2} = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}. This can be obtained in :code:`toqito` as follows. >>> from toqito.matrices import gen_gell_mann >>> gen_gell_mann(0, 1, 2) [[0., 1.], [1., 0.]]) The generalized Gell-Mann matrix :code:`ind_1 = 2`, :code:`ind_2 = 3`, and :code:`dim = 4` is given as .. math:: G_{2, 3, 4} = \begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}. This can be obtained in :code:`toqito` as follows. >>> from toqito.matrices import gen_gell_mann >>> gen_gell_mann(2, 3, 4) [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 1.], [0., 0., 1., 0.]]) References ========== .. [WikGM2] Wikipedia: Gell-Mann matrices, https://en.wikipedia.org/wiki/Gell-Mann_matrices :param ind_1: A non-negative integer from 0 to :code:`dim-1` (inclusive). :param ind_2: A non-negative integer from 0 to :code:`dim-1` (inclusive). :param dim: The dimension of the Gell-Mann operator. :param is_sparse: If set to :code:`True`, the returned Gell-Mann operator is a sparse lil_matrix and if set to :code:`False`, the returned Gell-Mann operator is a dense :code:`numpy` array. :return: The generalized Gell-Mann operator. """ if ind_1 == ind_2: if ind_1 == 0: gm_op = sparse.eye(dim) else: scalar = np.sqrt(2 / (ind_1 * (ind_1 + 1))) diag = np.ones((ind_1, 1)) diag = np.append(diag, -ind_1) diag = scalar * np.append(diag, np.zeros((dim - ind_1 - 1, 1))) gm_op = sparse.lil_matrix((dim, dim)) gm_op.setdiag(diag) else: e_mat = sparse.lil_matrix((dim, dim)) e_mat[ind_1, ind_2] = 1 if ind_1 < ind_2: gm_op = e_mat + e_mat.conj().T else: gm_op = 1j * e_mat - 1j * e_mat.conj().T if not is_sparse: return gm_op.todense() return gm_op