GHC/Integer/Logarithms.hs

    {-# 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#