| author | wenzelm |
| Fri, 05 May 2023 12:01:09 +0200 | |
| changeset 77967 | 6bb2f9b32804 |
| parent 77768 | 65008644d394 |
| child 78171 | 412a24a4c751 |
| permissions | -rw-r--r-- |
| 28308 | 1 |
(* Title: Pure/General/integer.ML |
| 24633 | 2 |
Author: Florian Haftmann, TU Muenchen |
3 |
||
| 33002 | 4 |
Auxiliary operations on (unbounded) integers. |
| 24633 | 5 |
*) |
6 |
||
7 |
signature INTEGER = |
|
8 |
sig |
|
| 77768 | 9 |
val build: (int -> int) -> int |
| 33029 | 10 |
val min: int -> int -> int |
11 |
val max: int -> int -> int |
|
| 33002 | 12 |
val add: int -> int -> int |
13 |
val mult: int -> int -> int |
|
14 |
val sum: int list -> int |
|
15 |
val prod: int list -> int |
|
| 24633 | 16 |
val sign: int -> order |
17 |
val div_mod: int -> int -> int * int |
|
|
73020
b51515722274
tuned signature -- prefer Isabelle/ML structure Integer;
wenzelm
parents:
73019
diff
changeset
|
18 |
val quot_rem: int -> int -> int * int |
| 24633 | 19 |
val square: int -> int |
20 |
val pow: int -> int -> int (* exponent -> base -> result *) |
|
|
73019
05e2cab9af8b
tuned signature -- prefer Isabelle/ML structure Integer;
wenzelm
parents:
69729
diff
changeset
|
21 |
val log2: int -> int |
| 24633 | 22 |
val gcd: int -> int -> int |
|
63227
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
23 |
val lcm: int -> int -> int |
| 24633 | 24 |
val gcds: int list -> int |
25 |
val lcms: int list -> int |
|
| 68028 | 26 |
val radicify: int -> int -> int -> int list (* base -> number of positions -> value -> coefficients *) |
27 |
val eval_radix: int -> int list -> int (* base -> coefficients -> value *) |
|
| 24633 | 28 |
end; |
29 |
||
30 |
structure Integer : INTEGER = |
|
31 |
struct |
|
32 |
||
| 77768 | 33 |
fun build (f: int -> int) = f 0; |
34 |
||
| 33029 | 35 |
fun min x y = Int.min (x, y); |
36 |
fun max x y = Int.max (x, y); |
|
37 |
||
| 33002 | 38 |
fun add x y = x + y; |
39 |
fun mult x y = x * y; |
|
| 24633 | 40 |
|
| 33002 | 41 |
fun sum xs = fold add xs 0; |
42 |
fun prod xs = fold mult xs 1; |
|
43 |
||
44 |
fun sign x = int_ord (x, 0); |
|
| 24633 | 45 |
|
46 |
fun div_mod x y = IntInf.divMod (x, y); |
|
|
73020
b51515722274
tuned signature -- prefer Isabelle/ML structure Integer;
wenzelm
parents:
73019
diff
changeset
|
47 |
fun quot_rem x y = IntInf.quotRem (x, y); |
| 24633 | 48 |
|
49 |
fun square x = x * x; |
|
50 |
||
| 69729 | 51 |
fun pow k l = IntInf.pow (l, k); |
| 24633 | 52 |
|
|
73019
05e2cab9af8b
tuned signature -- prefer Isabelle/ML structure Integer;
wenzelm
parents:
69729
diff
changeset
|
53 |
val log2 = IntInf.log2; |
|
05e2cab9af8b
tuned signature -- prefer Isabelle/ML structure Integer;
wenzelm
parents:
69729
diff
changeset
|
54 |
|
|
63227
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
55 |
fun gcd x y = PolyML.IntInf.gcd (x, y); |
|
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
56 |
fun lcm x y = abs (PolyML.IntInf.lcm (x, y)); |
| 24633 | 57 |
|
|
63227
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
58 |
fun gcds [] = 0 |
|
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
59 |
| gcds (x :: xs) = fold gcd xs x; |
| 24633 | 60 |
|
|
63227
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
61 |
fun lcms [] = 1 |
|
d3ed7f00e818
Integer.lcm normalizes the sign as in HOL/GCD.thy;
wenzelm
parents:
33029
diff
changeset
|
62 |
| lcms (x :: xs) = abs (Library.foldl PolyML.IntInf.lcm (x, xs)); |
| 24633 | 63 |
|
| 68028 | 64 |
fun radicify base len k = |
65 |
let |
|
66 |
val _ = if base < 2 |
|
67 |
then error ("Bad radix base: " ^ string_of_int base) else ();
|
|
68 |
fun shift i = swap (div_mod i base); |
|
69 |
in funpow_yield len shift k |> fst end; |
|
70 |
||
| 77768 | 71 |
fun eval_radix base = |
72 |
build o fold_rev (fn k => fn i => k + i * base); |
|
| 68028 | 73 |
|
| 24633 | 74 |
end; |