<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