public class InterpNewton{
FoncRdansR f;
double x[];	
double a[];

//constructeurs
/* InterpNewton()
{
f=null;
x=null;
a=null;
}
*/ 

InterpNewton(FoncRdansR fonc,double[] XX)
{int n=XX.length;
f=fonc;
x=XX;
//x= new double[n];
//for(int i=0;i<n;i++)
//x[i]=XX[i];
a=new double[n];
for(int i=0;i<n;i++)
a[i]=f.calcul(x[i]);
for(int j=1;j<n;j++)
for(int i=n-1;i>=j;i--)
a[i]=(a[i]-a[i-1])/(x[i]-x[i-j]);
}

InterpNewton(FoncRdansR fonc,double aa, double b, int n)
{double XX[]= new double[n+1];
double h=(b-aa)/n;
XX[0]=aa;
XX[n]=b;
for (int i=1;i<n;i++)
XX[i]=aa+i*h;
f=fonc;
/*x= new double[n+1];
for(int i=0;i<n+1;i++)
x[i]=XX[i];*/
x=XX;
a=new double[n+1];
for(int i=0;i<n+1;i++)
a[i]=f.calcul(x[i]);
for(int j=1;j<=n;j++)
for(int i=n;i>=j;i--)
a[i]=(a[i]-a[i-1])/(x[i]-x[i-j]);
}

InterpNewton(FoncRdansR fonc,double aa, double b, int n,int k)
{double XX[]= new double[n+1];
double h=Math.PI/n;
XX[0]=aa;
XX[n]=b;
for (int i=1;i<n;i++)
XX[i]=aa+0.5*(b-aa)*(1-Math.cos(i*h));
f=fonc;

x=XX;
a=new double[n+1];
for(int i=0;i<n+1;i++)
a[i]=f.calcul(x[i]);
for(int j=1;j<=n;j++)
for(int i=n;i>=j;i--)
a[i]=(a[i]-a[i-1])/(x[i]-x[i-j]);
}

public double eval(double y){
int n=a.length;
double S=a[n-1];
	for(int i= n-2;i>=0;i--)
	S=a[i]+S*(y-x[i]);
	return S;
	}

public double[] evalVec(double y[]){
	int p=y.length;
int n=a.length;
double ev[]= new double[p];
for(int j=0;j<p;j++){
double S=a[n-1];
	for(int i= n-2;i>=0;i--)
	S=a[i]+S*(y[j]-x[i]);
	ev[j]=S;
	}
return ev;
}

public void afficherCoeffs(){
	for(int i=0;i<x.length;i++)
System.out.println("a"+i+"="+a[i]);	
	}

}