diff --git a/double.lisp b/double.lisp
index e69de29..6bbd871 100644
--- a/double.lisp
+++ b/double.lisp
@@ -0,0 +1,4 @@
+(in-package :math-algo)
+
+(defun my-double (x)
+  (* x 2))
diff --git a/even?.lisp b/even?.lisp
index e69de29..fa05dd2 100644
--- a/even?.lisp
+++ b/even?.lisp
@@ -0,0 +1,7 @@
+(in-package :math-algo)
+
+(defun my-even? (x)
+  (if (= (rem x 2) 0)
+      t
+      nil))
+
diff --git a/fast-expt.lisp b/fast-expt.lisp
index e69de29..fc92c2c 100644
--- a/fast-expt.lisp
+++ b/fast-expt.lisp
@@ -0,0 +1,14 @@
+(in-package :math-algo)
+
+(defun my-fast-expt-recu-impl (b n)
+  (cond ((= n 0) 1)
+        ((my-even? n) (my-square (my-fast-expt-recu-impl b (my-half n))))
+        (t (* b (my-fast-expt-recu-impl b (- n 1))))))
+
+(defun my-fast-expt-iter-impl (b n)
+  (defun my-fast-expt-iter (b product max)
+    (cond ((= 0 max) product)
+          ((my-even? max) (my-fast-expt-iter (my-square b) product (my-half max)))
+          ((my-odd? max) (my-fast-expt-iter b (* product b) (- max 1)))))
+  (my-fast-expt-iter b 1 n))
+
diff --git a/half.lisp b/half.lisp
index e69de29..63cb831 100644
--- a/half.lisp
+++ b/half.lisp
@@ -0,0 +1,4 @@
+(in-package :math-algo)
+
+(defun my-half (x)
+  (/ x 2))
diff --git a/math-algorithm.asd b/math-algorithm.asd
index 299d29c..0f782e7 100644
--- a/math-algorithm.asd
+++ b/math-algorithm.asd
@@ -14,8 +14,13 @@
   ((:file "packages")
    (:file "abs" :depends-on ("packages"))
    (:file "average" :depends-on ("packages"))
+   (:file "double" :depends-on ("packages"))
+   (:file "even?" :depends-on ("packages"))
    (:file "expt" :depends-on ("packages"))
    (:file "factorial" :depends-on ("packages"))
+   (:file "fast-expt" :depends-on ("packages" "square" "even?" "half"))
    (:file "fib" :depends-on ("packages"))
+   (:file "half" :depends-on ("packages"))
+   (:file "odd?" :depends-on ("packages"))
    (:file "square" :depends-on ("packages"))
    (:file "sqrt" :depends-on ("packages" "abs" "average" "square"))))
diff --git a/odd?.lisp b/odd?.lisp
index e69de29..b5baf05 100644
--- a/odd?.lisp
+++ b/odd?.lisp
@@ -0,0 +1,6 @@
+(in-package :math-algo)
+
+(defun my-odd? (x)
+  (if (not (= (rem x 2) 0))
+      t
+      nil))
diff --git a/packages.lisp b/packages.lisp
index 4477740..59fe460 100644
--- a/packages.lisp
+++ b/packages.lisp
@@ -5,17 +5,23 @@
   (:documentation "Implement some math algorithms")
   (:nicknames :math-algo)
   (:use :common-lisp)
-  (:export my-square
-           my-abs
+  (:export my-abs
            my-average
-           my-sqrt
+           my-double
+           my-even?
            my-expt-recu-impl
            my-expt-iter-impl
            my-expt-do-impl
            my-factorial-recu-impl
            my-factorial-iter-impl
            my-factorial-do-impl
+           my-fast-expt-recu-impl
+           my-fast-expt-iter-impl
+           my-fast-expt-do-impl
            my-fib-do-impl
            my-fib-recu-impl
            my-fib-iter-impl
-           my-expt-recu-impl))
+           my-half
+           my-odd?
+           my-square
+           my-sqrt))