
import numpy as np

def cgsa (A):
#- [Q,R] = cgsa (A)
#- classical Gram Schmidt QR factorization of A
    m,n = np.shape(A)
    Q = np.zeros([m,n])
    R = np.zeros([n,n])
    for j in range(n):
        q = A[:,j] 
        for i in range(j) :
            r = np.dot(A[:,j],Q[:,i])         
            q = q - r*Q[:,i]
            R[i,j] = r
        r = np.sqrt(np.dot(q,q)) 
        #----------- error exit for case rjj == 0
        if (r==0.0): raise TypeError(' ->zero column encountered!') 
        Q[:,j] = q / r 
        R[j,j] = r   
    return Q, R
        
def mgsa (A):
#- [Q,R] = mgsa (A)
#- modified Gram Schmidt QR factorization of A
    m,n = np.shape(A)
    Q = np.zeros([m,n])
    R = np.zeros([n,n])
    for j in range(n):
        q = A[:,j] 
        for i in range(j) :
            r = np.dot(q,Q[:,i])         
            q = q - r*Q[:,i]
            R[i,j] = r
        r = np.sqrt(np.dot(q,q)) 
        #----------- error exit for case rjj == 0
        if (r==0.0): raise TypeError(' ->zero column encountered!') 
        Q[:,j] = q / r 
        R[j,j] = r   
    return Q, R
        
