fun unfold 0 = [] | unfold n = let val ((q:int), (r:int)) = (n div 2, n mod 2) in (unfold q) @ [if r = 1 then true else false] end fun crunch (p, (f, g)) = if p then (f*(f+2*g), f*f+g*g) else (f*f+g*g, g*(2*f-g)) fun myfib n = #2 (foldl crunch (1, 0) (unfold n)) val n = valOf(Int.fromString(hd(CommandLine.arguments()))) handle Option => (print ("usage: tailfib n\n"); OS.Process.exit(OS.Process.failure)) val _ = print (IntInf.toString (myfib n) ^ "\n")