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 */