1
1
(*
2
- * Our slow implementation of numbers
3
- * without using C libraries.
2
+ * Compatibility layer to Zarith library.
4
3
*
5
4
* ----------------------------------------------------------------
6
5
*
37
36
* Modified by: Yegor Bryukhov <[email protected] >
38
37
* Modified by: Aleksey Nogin <[email protected] >
39
38
*)
40
- open Lm_big_int
39
+
40
+ (* Uses Zarith *)
41
41
42
42
(* ***********************************************************************
43
43
* TYPES *
44
44
************************************************************************)
45
45
46
- (*
47
- * Have simple ints and big ints.
48
- *)
49
- type num =
50
- Int of int
51
- | Big_int of big_int
52
-
53
- (*
54
- * This is the max value represented in an int.
55
- *)
56
- let shift_int = 30
57
- let max_int = pred (1 lsl shift_int)
58
- let min_int = - max_int
59
-
60
- let shift_mult_int = 15
61
- let max_mult_int = pred (1 lsl shift_mult_int)
62
- let min_mult_int = - max_mult_int
46
+ type num = Z .t
63
47
64
48
(* ***********************************************************************
65
49
* IMPLEMENTATIONS *
@@ -68,193 +52,56 @@ let min_mult_int = -max_mult_int
68
52
(*
69
53
* Catch overflows in addition.
70
54
*)
71
- let add_num i j =
72
- match i, j with
73
- Int i , Int j ->
74
- let sum = i + j in
75
- if (i> 0 ) && (j> 0 ) then
76
- if max_int - i < j then
77
- Big_int (add_big_int (big_int_of_int i) (big_int_of_int j))
78
- else
79
- Int sum
80
- else if (i< 0 ) && (j< 0 ) then
81
- if min_int - i > j then
82
- Big_int (add_big_int (big_int_of_int i) (big_int_of_int j))
83
- else
84
- Int sum
85
- else
86
- Int sum
87
- | Int i , Big_int j ->
88
- Big_int (add_big_int (big_int_of_int i) j)
89
- | Big_int i , Int j ->
90
- Big_int (add_big_int i (big_int_of_int j))
91
- | Big_int i , Big_int j ->
92
- Big_int (add_big_int i j)
55
+ let add_num = Z. add
93
56
94
- let sub_num i j =
95
- match i, j with
96
- Int i , Int j ->
97
- let diff = i - j in
98
- if (i> 0 ) && (j< 0 ) then
99
- if i > max_int + j then
100
- Big_int (sub_big_int (big_int_of_int i) (big_int_of_int j))
101
- else
102
- Int diff
103
- else if (i< 0 ) && (j> 0 ) then
104
- if i < min_int + j then
105
- Big_int (sub_big_int (big_int_of_int i) (big_int_of_int j))
106
- else
107
- Int diff
108
- else
109
- Int diff
110
- | Int i , Big_int j ->
111
- Big_int (sub_big_int (big_int_of_int i) j)
112
- | Big_int i , Int j ->
113
- Big_int (sub_big_int i (big_int_of_int j))
114
- | Big_int i , Big_int j ->
115
- Big_int (sub_big_int i j)
57
+ let sub_num = Z. sub
116
58
117
- let succ_num i =
118
- add_num i (Int 1 )
59
+ let succ_num = Z. succ
119
60
120
- let pred_num i =
121
- sub_num i (Int 1 )
122
-
123
- (*
124
- * Catch overflows in multiplication.
125
- *)
126
- let mult_int i j =
127
- if (i > = min_mult_int) &&
128
- (i < = max_mult_int) &&
129
- (j > = min_mult_int) &&
130
- (j < = max_mult_int)
131
- then
132
- Int (i * j)
133
- else
134
- Big_int (mult_big_int (big_int_of_int i) (big_int_of_int j))
61
+ let pred_num = Z. pred
135
62
136
- let mult_num i j =
137
- match i, j with
138
- Int i , Int j ->
139
- mult_int i j
140
- | Int i , Big_int j ->
141
- Big_int (mult_big_int (big_int_of_int i) j)
142
- | Big_int i , Int j ->
143
- Big_int (mult_big_int i (big_int_of_int j))
144
- | Big_int i , Big_int j ->
145
- Big_int (mult_big_int i j)
63
+ let mult_num = Z. mul
146
64
147
- let div_num i j =
148
- match i, j with
149
- _ , Int 0 ->
150
- raise (Invalid_argument " Lm_num.div_num: division by zero" )
151
- | Int i , Int j ->
152
- Int (i / j)
153
- | Int i , Big_int j ->
154
- Big_int (div_big_int (big_int_of_int i) j)
155
- | Big_int i , Int j ->
156
- Big_int (div_big_int i (big_int_of_int j))
157
- | Big_int i , Big_int j ->
158
- Big_int (div_big_int i j)
65
+ let div_num = Z. div
159
66
160
- let mod_num i j =
161
- match i, j with
162
- _ , Int 0 ->
163
- raise (Invalid_argument " Lm_num.mod_num: division by zero" )
164
- | Int i , Int j ->
165
- Int (i mod j)
166
- | Int i , Big_int j ->
167
- Big_int (mod_big_int (big_int_of_int i) j)
168
- | Big_int i , Int j ->
169
- Big_int (mod_big_int i (big_int_of_int j))
170
- | Big_int i , Big_int j ->
171
- Big_int (mod_big_int i j)
67
+ let mod_num = Z. rem
172
68
173
69
let quo_num = div_num
174
70
let rem_num = mod_num
175
71
176
72
(*
177
- * Power. We stop large powers here--they will just take
178
- * forever.
73
+ * Power.
179
74
*)
180
- let power_aux i j =
181
- if j = 0 then
182
- Int 1
183
- else
184
- let rec collect total j =
185
- if j = 0 then
186
- total
187
- else
188
- collect (mult_num total i) (pred j)
189
- in
190
- collect i (pred j)
191
75
192
76
let power_num i j =
193
- match j with
194
- Int j ->
195
- power_aux i j
196
- | Big_int j ->
197
- if is_integer_big_int j then
198
- power_aux i (integer_big_int j)
199
- else
200
- raise (Invalid_argument " power_num: argument is too big" )
77
+ if Z. fits_int j then
78
+ Z. pow i (Z. to_int j)
79
+ else
80
+ raise (Invalid_argument " power_num: argument is too big" )
201
81
202
82
(*
203
83
* Absolute value.
204
84
*)
205
- let abs_num = function
206
- Int i ->
207
- Int (abs i)
208
- | Big_int i ->
209
- Big_int (abs_big_int i)
85
+ let abs_num = Z. abs
210
86
211
- let neg_num = function
212
- Int i ->
213
- Int (- i)
214
- | Big_int i ->
215
- Big_int (neg_big_int i)
87
+ let neg_num = Z. neg
216
88
217
89
(*
218
90
* Equality.
219
91
*)
220
- let eq_num i j =
221
- match i, j with
222
- Int i , Int j ->
223
- i = j
224
- | Int i , Big_int j ->
225
- eq_big_int (big_int_of_int i) j
226
- | Big_int i , Int j ->
227
- eq_big_int i (big_int_of_int j)
228
- | Big_int i , Big_int j ->
229
- eq_big_int i j
92
+ let eq_num = Z. equal
230
93
231
- let compare_num i j =
232
- match i, j with
233
- Int i , Int j ->
234
- Pervasives. compare i j
235
- | Int i , Big_int j ->
236
- compare_big_int (big_int_of_int i) j
237
- | Big_int i , Int j ->
238
- compare_big_int i (big_int_of_int j)
239
- | Big_int i , Big_int j ->
240
- compare_big_int i j
94
+ let compare_num = Z. compare
241
95
242
- let lt_num i j =
243
- compare_num i j < 0
96
+ let lt_num = Z. lt
244
97
245
- let le_num i j =
246
- compare_num i j < = 0
98
+ let le_num = Z. leq
247
99
248
- let gt_num i j =
249
- compare_num i j > 0
100
+ let gt_num = Z. gt
250
101
251
- let ge_num i j =
252
- compare_num i j > = 0
102
+ let ge_num = Z. geq
253
103
254
- let is_zero = function
255
- Int 0 -> true
256
- | Int _ -> false
257
- | Big_int i -> is_zero_big_int i
104
+ let is_zero n = Z. equal Z. zero n
258
105
259
106
(* ***********************************************************************
260
107
* CONVERSION *
@@ -263,53 +110,22 @@ let is_zero = function
263
110
(*
264
111
* Integer conversions.
265
112
*)
266
- let is_integer_num = function
267
- Int _ ->
268
- true
269
- | Big_int i ->
270
- is_integer_big_int i
113
+ let is_integer_num = Z. fits_int
271
114
272
- let integer_num = function
273
- Int i ->
274
- i
275
- | Big_int i ->
276
- integer_big_int i
115
+ let integer_num = Z. to_int
277
116
278
- let num_of_int i =
279
- Int i
117
+ let num_of_int = Z. of_int
280
118
281
119
let int_of_num = integer_num
282
120
283
121
(*
284
122
* String conversions.
285
123
*)
286
- let string_of_num = function
287
- Int i ->
288
- string_of_int i
289
- | Big_int i ->
290
- string_of_big_int i
291
-
292
- let num_of_string s =
293
- let i = big_int_of_string s in
294
- if is_integer_big_int i then
295
- Int (integer_big_int i)
296
- else
297
- Big_int i
298
-
299
- let to_string = string_of_num
300
- let of_string = num_of_string
301
-
302
- (*
303
- * Int32 conversions.
304
- *)
305
- let to_int32 = function
306
- Int i ->
307
- Int32. of_int i
308
- | Big_int i ->
309
- Lm_big_int. to_int32 i
124
+ let to_string = Z. to_string
125
+ let of_string = Z. of_string
310
126
311
- let of_int32 i =
312
- Big_int ( Lm_big_int. of_int32 i)
127
+ let string_of_num = to_string
128
+ let num_of_string = of_string
313
129
314
130
(*
315
131
* -*-
0 commit comments