Here is a definition of the Fibonacci function.
Fixpoint fib (n:nat) : nat :=
match n with
0 => 1
| 1 => 1
| S ((S p) as q) => fib p + fib q
end.
Prove the following statements:
forall n, fib (2*n) = fib (n) * fib (n) +
(fib (n+1) - fib n)*(fib (n+1) - fib n).
forall n, fib (2*n+1) = 2 * fib n * fib (n+1) - fib n * fib n.
forall n, fib (S (2*n+1)) = fib (n+1) * (fib (n+1)) + fib n * fib n.
Use these formulas to define another function that computes the values of the Fibonacci function for n, with only a logarithmic number of recursive calls (to compute the values for 17 and 18, this function should only compute the values for 8, 9, 4, 5, 2, and 3).