M:= <<0,1>|<1,1>>: fib4:= n -> mpow(n-1)[2,2]: F[0]:= 0: F[1]:= 1: F[-1]:= 1: mpow := proc(n) option remember; if type(n, posint) then if type(n,even) then mpow(n/2)^2 else mpow((n-1)/2)^2 . M end if elif type(n, negint) then mpow(-n)^(-1) elif type(n,`+`) then mpow(op(1,n)) . mpow(n-op(1,n)) elif type(n,`*`) then mpow(n/op(1,n))^op(1,n) else <|> end if end proc: phi:= 1/2 + sqrt(5)/2: fibapp:= n -> phi^n/sqrt(5): invfib := proc(x::posint) local q, n; q:= evalf((ln(x+1/2) + ln(5)/2)/ln(phi)); n:= floor(q); if fib4(n) <= x then while fib4(n+1) <= x do n := n+1 end do else while fib4(n) > x do n := n-1 end do end if; n end: