#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep  3 15:34:18 2024

@author: sam
"""

def polyx(a,x):
    f = 0
    for i in range(len(a)):
        f += a[i]*(x)**i
    return f

def vandint(x,xp,yp):
    V = np.hstack([xp**0])
    for i in range(1,len(xp)):
        V = np.hstack([V,xp**i])
    
    VI = np.linalg.inv(V)

    A = np.matmul(VI,yp)
    return polyx(A,x)

def lagx(j,x,xp):
    #j first element
    if j == 0:
        l = (x-xp[1])/(xp[j]-xp[1])
        for i in range(2,len(xp)):
            l *= (x-xp[i])/(xp[j]-xp[i])
    
    #j last element
    elif j == len(xp)-1:
        l = (x-xp[0])/(xp[j]-xp[0])
        for i in range(1,j):
            l *= (x-xp[i])/(xp[j]-xp[i])
            
    #j somewhere in middle
    else:
        l = (x-xp[0])/(xp[j]-xp[0])
        for i in range(1,j):
            l *= (x-xp[i])/(xp[j]-xp[i])
        for i in range(j+1,len(xp)):
            l *= (x-xp[i])/(xp[j]-xp[i])
    return l

def lagint(x,xp,yp):
    L = 0
    for i in range(len(xp)):
        L += lagx(i,x,xp)*yp[i]
    return polyx(L,x)