//  TAU2.C
      //  Calculates a series of tau values
      //  Author: Peter Meyer
      //  Last mod.: 1999-01-12
      
      #include <string.h>
      #include <stdio.h>
      #include <math.h>
      #include <conio.h>
      
      #define VERBOSE 0
      
      double tau_1(int n);
      double tau_2(int n, int m);
      
      /*----------------------------*/
      void main(int argc,char *argv[])
      {
      int n;
      double this_tau, last_tau;
      
      printf("\nThis program calculates the series of tau(n), where"
             "\ntau(n) = sqrt(1^n + sqrt(2^n + sqrt(3^n + sqrt(4^n + ..,))))\n");
      
      last_tau = 0;
      
      for ( n=0; n<15; n++ )
          {
          this_tau = tau_1(n);
          printf("\ntau(%d)%s = %19.16f",n,(n<10?" ":""),this_tau);
          if ( last_tau > 0 )
              printf("   diff = %2.6f",this_tau - last_tau);
          last_tau = this_tau;
      #if VERBOSE
          getch();
      #endif
          }
      printf("\n");
      }
      
      /*---------------*/
      double tau_1(int n)
      {
      int m=2;
      double t0, t1=0;
      
      do    {
          t0 = t1;
          t1 = tau_2(n,m++);
      #if VERBOSE
          printf("\n%18.16f",t1);
      #endif
          } while ( t1 != t0 );
      
      return ( t1 );
      }
      
      /*----------------------*/
      double tau_2(int n, int m)
      {
      int i;
      double x;
      
      x = sqrt(pow((double)m,(double)n));          //  x = sqrt(m^n)
      for ( i=m-1; i>=1; i-- )
          x = sqrt(pow((double)i,(double)n) + x);  // x = sqrt(i^n + x)
      
      return ( x );
      }