| 28308 |      1 | (*  Title:      Pure/General/integer.ML
 | 
| 24633 |      2 |     Author:     Florian Haftmann, TU Muenchen
 | 
|  |      3 | 
 | 
|  |      4 | Unbounded integers.
 | 
|  |      5 | *)
 | 
|  |      6 | 
 | 
|  |      7 | signature INTEGER =
 | 
|  |      8 | sig
 | 
|  |      9 |   val sign: int -> order
 | 
|  |     10 |   val sum: int list -> int
 | 
|  |     11 |   val div_mod: int -> int -> int * int
 | 
|  |     12 |   val square: int -> int
 | 
|  |     13 |   val pow: int -> int -> int (* exponent -> base -> result *)
 | 
|  |     14 |   val gcd: int -> int -> int
 | 
|  |     15 |   val gcds: int list -> int
 | 
|  |     16 |   val lcm: int -> int -> int
 | 
|  |     17 |   val lcms: int list -> int
 | 
|  |     18 | end;
 | 
|  |     19 | 
 | 
|  |     20 | structure Integer : INTEGER =
 | 
|  |     21 | struct
 | 
|  |     22 | 
 | 
|  |     23 | fun sign x = int_ord (x, 0);
 | 
|  |     24 | 
 | 
|  |     25 | fun sum xs = fold (curry op +) xs 0;
 | 
|  |     26 | 
 | 
|  |     27 | fun div_mod x y = IntInf.divMod (x, y);
 | 
|  |     28 | 
 | 
|  |     29 | fun square x = x * x;
 | 
|  |     30 | 
 | 
|  |     31 | fun pow k l =
 | 
|  |     32 |   let
 | 
|  |     33 |     fun pw 0 _ = 1
 | 
|  |     34 |       | pw 1 l = l
 | 
|  |     35 |       | pw k l =
 | 
|  |     36 |           let
 | 
|  |     37 |             val (k', r) = div_mod k 2;
 | 
|  |     38 |             val l' = pw k' (l * l);
 | 
|  |     39 |           in if r = 0 then l' else l' * l end;
 | 
|  |     40 |   in
 | 
|  |     41 |     if k < 0
 | 
|  |     42 |     then error "pow: negative exponent"
 | 
|  |     43 |     else pw k l
 | 
|  |     44 |   end;
 | 
|  |     45 | 
 | 
|  |     46 | fun gcd x y =
 | 
|  |     47 |   let
 | 
|  |     48 |     fun gxd x y = if y = 0 then x else gxd y (x mod y)
 | 
|  |     49 |   in if x < y then gxd y x else gxd x y end;
 | 
|  |     50 | 
 | 
|  |     51 | fun gcds xs = fold gcd xs 0;
 | 
|  |     52 | 
 | 
|  |     53 | fun lcm x y = (x * y) div (gcd x y);
 | 
|  |     54 | fun lcms xs = fold lcm xs 1;
 | 
|  |     55 | 
 | 
|  |     56 | end;
 | 
|  |     57 | 
 |