]> gitweb.factorcode.org Git - factor.git/commitdiff
math.functions: faster (integer) m^n.
authorJohn Benediktsson <mrjbq7@gmail.com>
Fri, 31 Aug 2012 22:10:48 +0000 (15:10 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Fri, 31 Aug 2012 22:10:48 +0000 (15:10 -0700)
basis/math/functions/functions.factor

index 264a15d7b06b6ff94fd2dd6555a58da1ea17705a..5c3720c99c68ae0bf4aebf8372580d1a949e4a39 100644 (file)
@@ -25,12 +25,25 @@ M: real sqrt
 
 <PRIVATE
 
-GENERIC# ^n 1 ( z w -- z^w ) foldable
+: (^fixnum) ( z w -- z^w )
+    [ 1 ] 2dip
+    [ dup zero? ] [
+        dup odd? [
+            [ [ * ] keep ] [ 1 - ] bi*
+        ] when [ sq ] [ 2/ ] bi*
+    ] until 2drop ; inline
+
+: (^bignum) ( z w -- z^w )
+    make-bits 1 [ [ over * ] when [ sq ] dip ] reduce nip ; inline
 
 : (^n) ( z w -- z^w )
-    make-bits 1 [ [ over * ] when [ sq ] dip ] reduce nip ; inline
+    dup fixnum? [ (^fixnum) ] [ (^bignum) ] if ; inline
+
+GENERIC# ^n 1 ( z w -- z^w ) foldable
+
+M: fixnum ^n (^n) ;
 
-M: integer ^n
+M: bignum ^n
     [ factor-2s ] dip [ (^n) ] keep rot * shift ;
 
 M: ratio ^n