Replace (^) with a faster variant (from trac #1687)
authorIan Lynagh <igloo@earth.li>
Tue, 18 Mar 2008 00:30:17 +0000 (00:30 +0000)
committerIan Lynagh <igloo@earth.li>
Tue, 18 Mar 2008 00:30:17 +0000 (00:30 +0000)
GHC/Real.lhs

index f7e2eb2..17faed9 100644 (file)
@@ -404,13 +404,12 @@ odd             =  not . even
         Integer -> Int -> Integer,
         Int -> Int -> Int #-}
 (^)             :: (Num a, Integral b) => a -> b -> a
-_ ^ 0           =  1
-x ^ n | n > 0   =  f x (n-1) x
-                   where f _ 0 y = y
-                         f a d y = g a d  where
-                                   g b i | even i  = g (b*b) (i `quot` 2)
-                                         | otherwise = f b (i-1) (b*y)
-_ ^ _           = error "Prelude.^: negative exponent"
+x ^ y | y < 0     = error "Negative exponent"
+      | y == 0    = 1
+      | y == 1    = x
+      | odd y     = x * (x ^ (y - 1))
+      | otherwise = let x' = x ^ (y `div` 2)
+                    in x' * x'
 
 -- | raise a number to an integral power
 {-# SPECIALISE (^^) ::