// horner_64.c long integer and double Horners method of evaluating polynomials
//             everything 64-bit
// given a polynomial  Y = a_n X^n + a_n-1 X^n-1 + ... a_1 X + a_0
// a_n is the coefficient 'a' with subscript n. X^n is X to nth power
// compute y_1 = a_n * X + a_n-1
// compute y_2 = y_1 * X + a_n-2
// compute y_i = y_i-1 * X + a_n-i   i=3..n
// thus    y_n = Y = value of polynomial 

#include <stdio.h>
int main(int argc, char *argv[])
{
  long int a[]  = {2, 5, -7, 22, -9}; // a[n] first
  long int aa[] = {-9, 22, -7, 5, 2}; // aa[0] first
  double af[]   = {-9.0, 22.0, -7.0, 5.0, 2.0}; // af[0] first
  long int n    = 4;
  long int X, Y;
  double XF, YF; 
  long int i;

  // evaluate an integer polynomial a, X=7, using a_n first, count n
  X = 7;
  Y = a[0]*X + a[1];
  for(i=2; i<=n; i++) Y = Y*X + a[i];
  printf("a  %ld\n", Y);

  // evaluate an integer polynomial aa , X=7, using a_0 first, count n
  X = 7;
  Y = aa[n]*X + aa[n-1];
  for(i=n-2; i>=0; i--) Y = Y*X + aa[i];
  printf("aa %ld\n", Y);

  // evaluate a double floating polynomial, X=7.0, using af_0 first, n
  XF = 7.0;
  YF = af[n]*X + af[n-1];
  for(i=n-2; i>=0; i--) YF = YF*XF + af[i];
  printf("af %e\n", YF);

  return 0;
}