import numpy as np
from scipy import linalg as la

def peig(A,tol): 

    NMAX = 1000

    ukold = 0.

    zk = np.zeros([len(A),1])
    zk[[0]] = 1

    for i in range(NMAX):
        yk = A @ zk
        uk = abs(yk).max() #l-infinity norm
    
        zk = yk/uk
    
        if i>2 and abs(uk-ukold)<tol:
            return uk,zk
    
        ukold = uk
    
    print('Warning in peig: eigenvalue iteration failed to converge.')
    


def ipeig(A,tol): 

    AI = la.inv(A)

    NMAX = 1000

    ukold = 0.

    zk = np.zeros([len(A),1])
    zk[[0]] = 1

    for i in range(NMAX):
        yk = AI @ zk
        uk = abs(yk).max()
    
        zk = yk/uk
    
        if i>2 and abs(uk-ukold)<tol:
            return (1/uk),zk
    
        ukold = uk
    
    print('Warning in peig: eigenvalue iteration failed to converge.')


def qreigs(A,tol): 

    NMAX = 1000

    ukold = 0.

    Ak = A
    eigsold = np.zeros(len(A))
    
    for i in range(NMAX):
        Q, R = la.qr(Ak)
    
        Ak = R @ Q
        
        eigs = np.diag(Ak)
        
        if i > 2 and la.norm(eigs-eigsold,2)<tol:        
            return eigs

        eigsold = eigs
        
    print('Warning in peig: eigenvalue iteration failed to converge.')
    

