void fibLogSlave(int n, int *Fn1, int *Fn)  /*See*/
 { int a, b, c, d;                          /*Urbanek*/
   if( n==1 )                               /*also*/
    { *Fn1 = 0; *Fn = 1; }                  /*Gries*/
   else                                     /*and*/
    { fibLogSlave(n/2, &a, &b);             /*Levin*/
      c = a*a+b*b;                          /*in*/
      d = b*(b+2*a);                        /*Inf.Proc.Lett*/
      if( n % 2 )/*n odd*/                  /*11(2)*/
       { *Fn1 = d; *Fn = c+d; }             /*66-67&68-69*/
      else/*n even*/                        /*Oct*/
       { *Fn1 = c; *Fn = d; }               /*1980*/
 }  }                                       /* -- L.Allison */


int fibonacciVF(int n)
 { int Fn1, Fn;
   fibLogSlave(n, &Fn1, &Fn);
   return Fn;
 }

/* O(log(n)) time Fibonacci Function */
