def inverse_iteration_for_eigenvector_int(A, eigenvalue): """Performs a series of inverse iteration steps with a known eigenvalue to produce its eigenvector. :param A: The 3x3 matrix to which the eigenvalue belongs. :type A: :py:class:`numpy.ndarray` :param eigenvalue: One approximate eigenvalue of the matrix A. :type eigenvalue: int :return: The eigenvector of this matrix and eigenvalue combination. :rtype: :py:class:`numpy.ndarray` """ A = np.array(A, 'int64') # Subtract the eigenvalue from the diagonal entries of the matrix. for k in xrange(A.shape[0]): A[k, k] -= eigenvalue A, scale = fp.scale_64bit_matrix(A) # Obtain the inverse of the matrix. adj_A = mo.inverse_3by3_int64(A.flatten(), False) eigenvector = adj_A.reshape((3, 3)).sum(1) eigenvector, scale = fp.scale_64bit_vector(eigenvector) e_norm = int(np.sqrt((eigenvector ** 2).sum())) if (eigenvector[0] < 0) and (eigenvector[2] < 0): eigenvector = -eigenvector return eigenvector, e_norm
def inverse_iteration_for_eigenvector_int(A, eigenvalue): """Performs a series of inverse iteration steps with a known eigenvalue to produce its eigenvector. :param A: The 3x3 matrix to which the eigenvalue belongs. :type A: :py:class:`numpy.ndarray` :param eigenvalue: One approximate eigenvalue of the matrix A. :type eigenvalue: int :return: The eigenvector of this matrix and eigenvalue combination. :rtype: :py:class:`numpy.ndarray` """ A = np.array(A, 'int64') # Subtract the eigenvalue from the diagonal entries of the matrix. for k in xrange(A.shape[0]): A[k, k] -= eigenvalue A, scale = fp.scale_64bit_matrix(A) # Obtain the inverse of the matrix. adj_A = mo.inverse_3by3_int64(A.flatten(), False) eigenvector = adj_A.reshape((3, 3)).sum(1) eigenvector, scale = fp.scale_64bit_vector(eigenvector) e_norm = int(np.sqrt((eigenvector**2).sum())) if (eigenvector[0] < 0) and (eigenvector[2] < 0): eigenvector = -eigenvector return eigenvector, e_norm
def QR_algorithm_shift_Givens_int(A): """The QR algorithm with largest value shift for finding eigenvalues, in integer precision. Using Givens rotations for finding RQ. :param A: The square matrix to find eigenvalues of. :type A: :py:class:`numpy.ndarray` :return: The eigenvalues. :rtype: list """ A, scale = fp.scale_64bit_matrix(A.copy()) # First, tridiagonalize the input matrix to a Hessenberg matrix. T = ma.convert_to_Hessenberg_Givens_int(A) m, n = T.shape if n != m: raise np.linalg.LinAlgError("Array must be square.") convergence_measure = [] eigenvalues = np.zeros((m, ), dtype='int64') m -= 1 while m > 0: # Obtain the shift from the lower right corner of the matrix. mu_matrix = np.eye(T.shape[0], dtype='int64') * T[m, m] # Perform Givens QR step (which returns RQ) on the shifted # matrix and then shift it back. T = Givens_QR_step_int(T - mu_matrix) + mu_matrix # Add convergence information and extract eigenvalue if close enough. convergence_measure.append(np.abs(T[m, m - 1])) if convergence_measure[-1] <= 1: eigenvalues[m] = T[m, m] T = T[:m, :m] m -= 1 eigenvalues[0] = T return eigenvalues << scale, convergence_measure