src/Pure/General/integer.ML
author blanchet
Tue, 17 Feb 2009 14:01:54 +0100
changeset 29956 62f931b257b7
parent 29606 fedb8be05f24
child 33002 f3f02f36a3e2
permissions -rw-r--r--
Reintroduce set_interpreter for Collect and op :. I removed them by accident when removing old code that dealt with the "set" type. Incidentally, there is still some broken "set" code in Refute that should be fixed (see TODO in refute.ML).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28308
d4396a28fb29 fixed headers
haftmann
parents: 24633
diff changeset
     1
(*  Title:      Pure/General/integer.ML
24633
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     3
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     4
Unbounded integers.
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     5
*)
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     6
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     7
signature INTEGER =
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     8
sig
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
     9
  val sign: int -> order
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    10
  val sum: int list -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    11
  val div_mod: int -> int -> int * int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    12
  val square: int -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    13
  val pow: int -> int -> int (* exponent -> base -> result *)
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    14
  val gcd: int -> int -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    15
  val gcds: int list -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    16
  val lcm: int -> int -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    17
  val lcms: int list -> int
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    18
end;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    19
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    20
structure Integer : INTEGER =
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    21
struct
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    22
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    23
fun sign x = int_ord (x, 0);
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    24
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    25
fun sum xs = fold (curry op +) xs 0;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    26
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    27
fun div_mod x y = IntInf.divMod (x, y);
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    28
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    29
fun square x = x * x;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    30
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    31
fun pow k l =
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    32
  let
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    33
    fun pw 0 _ = 1
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    34
      | pw 1 l = l
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    35
      | pw k l =
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    36
          let
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    37
            val (k', r) = div_mod k 2;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    38
            val l' = pw k' (l * l);
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    39
          in if r = 0 then l' else l' * l end;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    40
  in
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    41
    if k < 0
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    42
    then error "pow: negative exponent"
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    43
    else pw k l
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    44
  end;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    45
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    46
fun gcd x y =
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    47
  let
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    48
    fun gxd x y = if y = 0 then x else gxd y (x mod y)
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    49
  in if x < y then gxd y x else gxd x y end;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    50
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    51
fun gcds xs = fold gcd xs 0;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    52
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    53
fun lcm x y = (x * y) div (gcd x y);
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    54
fun lcms xs = fold lcm xs 1;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    55
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    56
end;
0a3a02066244 moved Tools/integer.ML to Pure/General/integer.ML;
wenzelm
parents:
diff changeset
    57