summaryrefslogtreecommitdiff
path: root/fib.hs
diff options
context:
space:
mode:
Diffstat (limited to 'fib.hs')
-rw-r--r--fib.hs13
1 files changed, 13 insertions, 0 deletions
diff --git a/fib.hs b/fib.hs
new file mode 100644
index 0000000..647f75e
--- /dev/null
+++ b/fib.hs
@@ -0,0 +1,13 @@
+fib n = fi n 1 1
+
+fi 1 x y = x
+fi a x y = fi (a-1) (x+y) x
+
+ffib n = ffi n 1 1 1 0 1 0
+
+ffi 1 a b c d x y = (a*x + b*y)
+ffi n a b c d x y =
+ if odd n
+ then ffi (div n 2) (a*a + b*c) (a*b + b*d) (a*c + c*d) (d*d + b*c) (a*x + b*y) (c*x + d*y)
+ else ffi (div n 2) (a*a + b*c) (a*b + b*d) (a*c + c*d) (d*d + b*c) x y
+