1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
   10 
   11 
   12 
   13 
   14 
   15   module IntLib (readInteger, showInteger, makeNumber, chop,
   16                  powerMod, cubeRoot, log2) where 
   17   import List--1.3
   18   rcsid = "$Header: /srv/cvs/cvs.haskell.org/fptools/nofib/spectral/primetest/IntLib.lhs,v 1.2 1996/07/25 21:32:53 partain Exp $"
   19 
   20 
   21 
   22   readInteger :: String -> Integer
   23   readInteger s = read s
   24 
   25   showInteger :: Integer -> String
   26   showInteger i = show i
   27 
   28 
   29 
   30 
   31 
   32 
   33 
   34 
   35   makeNumber :: Integer -> [Integer] -> Integer
   36   makeNumber b = foldl f 0 where f a x = a * b + x
   37 
   38 
   39 
   40   chop :: Integer -> Integer -> [Integer]
   41   chop b = chop' [] where chop' a n = if n == 0 then a else chop' (r:a) q
   42                                       where (q,r) = n `divMod` b
   43 
   44 
   45 
   46 
   47 
   48 
   49 
   50 
   51 
   52   powerMod :: Integer -> Integer -> Integer -> Integer
   53   powerMod a 0 m = 1
   54   powerMod a b m
   55    = f a' (b-1) a'
   56      where a' = a `mod` m
   57            f a 0 c = c
   58            f a b c = g a b where
   59                      g a b | even b    = g ((a*a) `mod` m) (b `div` 2)
   60                            | otherwise = f a (b-1) ((a*c) `mod` m)
   61 
   62 
   63 
   64 
   65 
   66 
   67 
   68 
   69 
   70 
   71 
   72 
   73 
   74 
   75 
   76   cubeRoot :: Integer -> Integer
   77   cubeRoot x = until satisfy improve x
   78                where satisfy y = y*y*y >= x && y'*y'*y' < x where y' = y-1
   79                      improve y = (2*y*y*y+x) `ddiv` (3*y*y)
   80                      ddiv a b  = if (r < b `div` 2) then q else q+1
   81                                  where (q,r) = divMod a b
   82 
   83 
   84 
   85 
   86 
   87 
   88   log2 :: Integer -> Integer
   89   log2 = genericLength . chop 2
   90 
   91 
   92