Source code for toqito.matrix_ops.null_space

"""Compute an orthonormal basis for the null space of a matrix."""

import numpy as np


[docs] def null_space(mat: np.ndarray, tol: float = 1e-08) -> np.ndarray: r"""Return an orthonormal basis for the kernel of ``mat`` [@WikiNullSpace]. The routine employs the singular value decomposition so that the columns of the returned matrix span the null space and are orthonormal with respect to the standard inner product. Examples: Consider the matrix \[ A = \begin{pmatrix} 1 & 1 & 0 \\ 0 & 0 & 0 \end{pmatrix}. \] Its null space is spanned by the vectors \((1,-1,0)\) and \((0,0,1)\). ```python exec="1" source="above" import numpy as np from toqito.matrix_ops import null_space A = np.array([[1, 1, 0], [0, 0, 0]], dtype=float) null_basis = null_space(A) print(null_basis) ``` Args: mat: Matrix whose null space is sought. tol: Numerical tolerance that distinguishes zero singular values. Returns: A matrix whose columns form an orthonormal basis for the null space. """ mat = np.asarray(mat, dtype=np.complex128) if mat.ndim != 2: raise ValueError("Input must be a two-dimensional array.") if mat.size == 0: return np.zeros((mat.shape[0], 0), dtype=np.complex128) _, singular_values, vh = np.linalg.svd(mat, full_matrices=True) rank = np.sum(singular_values > tol) kernel = vh[rank:].conj().T if kernel.size == 0: return np.zeros((mat.shape[1], 0), dtype=np.complex128) q, _ = np.linalg.qr(kernel) return q