code: def nullspace(A, atol=1e-13, rtol=0):
      
      A = np.atleast_2d(A)
      u, s, vh = np.linalg.svd(A)
      tol = max(atol, rtol * s[0])
      nnz = (s >= tol).sum()
      ns = vh[nnz:].conj().T
      return ns
docs: Compute an approximate basis for the nullspace of A.
      The algorithm used by this function is based on the singular value
      decomposition of `A`.
  
      Parameters
      ----------
      A : numpy.ndarray
          A should be at most 2-D.  A 1-D array with length k will be treated
          as a 2-D with shape (1, k)
      atol : float
          The absolute tolerance for a zero singular value.  Singular values
          smaller than `atol` are considered to be zero.
      rtol : float
          The relative tolerance.  Singular values less than rtol*smax are
          considered to be zero, where smax is the largest singular value.
  
      If both `atol` and `rtol` are positive, the combined tolerance is the
      maximum of the two; that is::
      tol = max(atol, rtol * smax)
      Singular values smaller than `tol` are considered to be zero.
  
      Returns
      -------
      numpy.ndarray
          If `A` is an array with shape (m, k), then `ns` will be an array
          with shape (k, n), where n is the estimated dimension of the
          nullspace of `A`.  The columns of `ns` are a basis for the
          nullspace; each element in numpy.dot(A, ns) will be approximately
          zero.
  
      Notes
      -----
      Taken from the numpy cookbook.