import numpy as np
import numpy.linalg as alg
from scipy.special import binom

def mat(n) :
    A = np.zeros((n+1,n+1))
    for i in range(n+1) :
        for j in range(n+1) :
            A[i,j] = binom(n,i)/(n-i+j+1)
    return A

# for n in range(2,9) :
#     A = mat(n)
#     P = alg.eig(mat(n))[1]
#     print(A,np.dot(alg.inv(P),np.dot(A,P)))
    
def prod_scal(x,y,n) :
    s = 0
    for i in range(n+1) :
        for j in range(n+1) :
            s += x[i]*y[j]/(i+j+1)
    return s
    
# print(prod_scal([1,2,3],[4,5,6],2))

# A = mat(1)
# P = alg.eig(A)[1]
# U,V = P[:,0],P[:,1]
# print(prod_scal(U,V,1))

# A = mat(2)
# P = alg.eig(A)[1]
# U,V,W = P[:,0],P[:,1],P[:,2]
# print(prod_scal(U,V,2),prod_scal(U,W,2),prod_scal(W,V,2))