def fib(n) (fib_iter 1 0 0 1 n) def fib_iter(a b p q n) (if (iso n 0) b even?.n (fib_iter a b p*p + q*q q*q + 2*p*q n/2) :else (fib_iter (b*q + a*q + a*p) (b*p + a*q) p q n-1))