Source code for toqito.matrix_props.is_pseudo_hermitian
"""Checks if matrix is pseudo hermitian with respect to given signature."""
import numpy as np
from toqito.matrix_props import has_same_dimension, is_hermitian, is_square
[docs]
def is_pseudo_hermitian(mat: np.ndarray, signature: np.ndarray, rtol: float = 1e-05, atol: float = 1e-08) -> bool:
r"""Check if a matrix is pseudo-Hermitian.
A matrix \(H\) is pseudo-Hermitian with respect to a given signature matrix \(\eta\) if it satisfies:
\[
\eta H \eta^{-1} = H^{\dagger},
\]
where:
- \(H^{\dagger}\) is the conjugate transpose (Hermitian transpose) of \(H\),
- \(\eta\) is a Hermitian, invertible matrix.
Examples:
Consider the following matrix:
\[
H = \begin{pmatrix}
1 & 1+i \\
-1+i & -1
\end{pmatrix}
\]
with the signature matrix:
\[
\eta = \begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}
\]
Our function confirms that \(H\) is pseudo-Hermitian:
```python exec="1" source="above"
import numpy as np
from toqito.matrix_props import is_pseudo_hermitian
H = np.array([[1, 1+1j], [-1+1j, -1]])
eta = np.array([[1, 0], [0, -1]])
print(is_pseudo_hermitian(H, eta))
```
However, the following matrix \(A\)
\[
A = \begin{pmatrix}
1 & i \\
-i & 1
\end{pmatrix}
\]
is not pseudo-Hermitian with respect to the same signature matrix.
```python exec="1" source="above"
import numpy as np
from toqito.matrix_props import is_pseudo_hermitian
eta = np.array([[1, 0], [0, -1]])
A = np.array([[1, 1j], [-1j, 1]])
print(is_pseudo_hermitian(A, eta))
```
Raises:
ValueError: If `signature` is not Hermitian or not invertible.
Args:
mat: The matrix to check.
signature: The signature matrix \(\eta\), which must be Hermitian and invertible.
rtol: The relative tolerance parameter (default 1e-05).
atol: The absolute tolerance parameter (default 1e-08).
Returns:
Return `True` if the matrix is pseudo-Hermitian, and `False` otherwise.
"""
if not is_hermitian(signature):
raise ValueError("Signature not hermitian matrix.")
if np.linalg.matrix_rank(signature) != signature.shape[0]:
raise ValueError("Signature is not invertible.")
if not is_square(mat) or not has_same_dimension([mat, signature]):
return False
eta_H_inv_eta = signature @ mat @ np.linalg.inv(signature)
return np.allclose(eta_H_inv_eta, mat.conj().T, rtol=rtol, atol=atol)