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