#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N (1027*103)
#define M 101
#define pi acos(-1.0L)
#define sqr(x) ((x)*(x))

double x[N], w[N], fp[N];

double f(double X){// CHEAT !!!
  //  return(sin(X));
    return(1.0/(1.0 + 25.0*sqr(X)));
}

double fprime(double X){
  return(-50.*X/sqr(1.0+25.0*sqr(X)));
}

void IPoints(){// intrerpolating points
  int k; 
  for(k=0;k<N;k++){
    //    x[k]=(double)k*pi/(double)(N-1);
    x[k] = -1.0 + (2.0*(double)k/(double)(N));
  }
}

void IPoints_Ch(){// Chebyshev points
  int k; 
  for(k=0;k<N;k++){
    x[k] = cos( (double)k*pi/(double)(N) );
  }

}

void fPoints(){
  int k;
  for(k=0;k<N;k++){
    fp[k] = f(x[k]);
  }

}

void W(){// the weights
  int j,k;
  double temp;

  for(j=0;j<N;j++){
    temp = 1.0;
    for(k=0;k<j;k++){
      temp = temp * (x[j]-x[k]);}
    for(k=(j+1);k<N;k++){
      temp = temp * (x[j]-x[k]);}
    w[j] = 1.0 / temp ; 
  }

}


double l(double X){
  double temp; 
  int j;

  temp = 1.0;
  for(j=0;j<N;j++){
    temp = temp * (X-x[j]);}
  return(temp);
}

double lprime(double X){
  double temp=0.0;
  int j;

  for(j=0;j<N;j++){
    temp = temp + (1.0/(X-x[j]));}

  return(l(X)*temp);
  

}

main(){
  int j,m;
  double temp1, temp2, X;


  IPoints_Ch(); // define the points
  fPoints(); // define the function 
  W();       // compute the weights

  
  for(m=1; m < M ; m++){
    X = -1.0 + (2.0*(double)m/(double)M);

    temp1 = 0.0; temp2 = 0.0;
    for(j=0;j<N;j++){
      temp1 = temp1 + (w[j]*fp[j]/(X-x[j]));
      temp2 = temp2 + (w[j]*fp[j]/sqr(X-x[j]));

}

    printf("%g\t%g\t%g\n", X, fabs(l(X)*temp1-f(X)), fabs(lprime(X)*temp1 - l(X)*temp2-fprime(X)));
  }

}




