{-# LANGUAGE MagicHash, UnboxedTuples, NoImplicitPrelude #-}
module GHC.Integer.Logarithms
( integerLogBase#
, integerLog2#
, wordLog2#
) where
import GHC.Prim
import GHC.Integer
import qualified GHC.Integer.Logarithms.Internals as I
integerLogBase# :: Integer -> Integer -> Int#
integerLogBase# :: Integer -> Integer -> Int#
integerLogBase# Integer
b Integer
m = case Integer -> (# Integer, Int# #)
step Integer
b of
(# Integer
_, Int#
e #) -> Int#
e
where
step :: Integer -> (# Integer, Int# #)
step Integer
pw =
if Integer
m Integer -> Integer -> Bool
`ltInteger` Integer
pw
then (# Integer
m, Int#
0# #)
else case Integer -> (# Integer, Int# #)
step (Integer
pw Integer -> Integer -> Integer
`timesInteger` Integer
pw) of
(# Integer
q, Int#
e #) ->
if Integer
q Integer -> Integer -> Bool
`ltInteger` Integer
pw
then (# Integer
q, Int#
2# Int# -> Int# -> Int#
*# Int#
e #)
else (# Integer
q Integer -> Integer -> Integer
`quotInteger` Integer
pw, Int#
2# Int# -> Int# -> Int#
*# Int#
e Int# -> Int# -> Int#
+# Int#
1# #)
integerLog2# :: Integer -> Int#
integerLog2# :: Integer -> Int#
integerLog2# = Integer -> Int#
I.integerLog2#
wordLog2# :: Word# -> Int#
wordLog2# :: Word# -> Int#
wordLog2# = Word# -> Int#
I.wordLog2#