#!/bin/python3
import math
import array

def dp(v,u): #performs dot product on two vectors
    ans = 0
    for i in range(len(v)):
        ans = ans + v[i]*u[i]
    return ans


def normalise(v): #makes a vector a unit vector
    n = []
    mag = 0
    for x in v:
        mag = mag + x**2
    mag = math.sqrt(mag)
    for x in v:
        n.append(x / mag)
    return n
        

# Be wary as to the parameter order of proj()
def proj(v,u): #makes a vector a unit vector, proj_{v}(u)
    ans = normalise(u)
    factor = dp(v,ans)
    for i in range(len(ans)):
        ans[i] = ans[i]*factor
    return ans 

def gsp(basis): #basis is a 2d array of vectors
    orthbasis = []
    for v in basis:
        u = v
        for ov in orthbasis:
           u = vecsub(u,proj(u,ov))
        orthbasis.append(u) 
    return orthbasis

def vecsub(v,u): #defines algebraic properties of vector addition (and inherently, subtraction)
    ans = [0,0,0]
    for i in range(len(v)):
        ans[i] = v[i] - u[i]
    return ans




print(gsp([[1,2,3],[4,5,6],[1,1,2]]))

