content: {-# 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
  
  -- | Calculate the integer logarithm for an arbitrary base.
  --   The base must be greater than 1, the second argument, the number
  --   whose logarithm is sought, should be positive, otherwise the
  --   result is meaningless.
  --
  -- > base ^ integerLogBase# base m <= m < base ^ (integerLogBase# base m + 1)
  --
  -- for @base > 1@ and @m > 0@.
  integerLogBase# :: Integer -> Integer -> Int#
  integerLogBase# b m = case step b of
                          (# _, e #) -> e
    where
      step pw =
        if m `ltInteger` pw
          then (# m, 0# #)
          else case step (pw `timesInteger` pw) of
                 (# q, e #) ->
                   if q `ltInteger` pw
                     then (# q, 2# *# e #)
                     else (# q `quotInteger` pw, 2# *# e +# 1# #)
  
  -- | Calculate the integer base 2 logarithm of an 'Integer'.
  --   The calculation is more efficient than for the general case,
  --   on platforms with 32- or 64-bit words much more efficient.
  --
  --  The argument must be strictly positive, that condition is /not/ checked.
  integerLog2# :: Integer -> Int#
  integerLog2# = I.integerLog2#
  
  -- | This function calculates the integer base 2 logarithm of a 'Word#'.
  wordLog2# :: Word# -> Int#
  wordLog2# = I.wordLog2#
  