1 |
dashley |
71 |
//$Header$ |
2 |
|
|
//------------------------------------------------------------------------------------------------- |
3 |
|
|
//This file is part of "David T. Ashley's Shared Source Code", a set of shared components |
4 |
|
|
//integrated into many of David T. Ashley's projects. |
5 |
|
|
//------------------------------------------------------------------------------------------------- |
6 |
|
|
//This source code and any program in which it is compiled/used is provided under the MIT License, |
7 |
|
|
//reproduced below. |
8 |
|
|
//------------------------------------------------------------------------------------------------- |
9 |
|
|
//Permission is hereby granted, free of charge, to any person obtaining a copy of |
10 |
|
|
//this software and associated documentation files(the "Software"), to deal in the |
11 |
|
|
//Software without restriction, including without limitation the rights to use, |
12 |
|
|
//copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the |
13 |
|
|
//Software, and to permit persons to whom the Software is furnished to do so, |
14 |
|
|
//subject to the following conditions : |
15 |
|
|
// |
16 |
|
|
//The above copyright notice and this permission notice shall be included in all |
17 |
|
|
//copies or substantial portions of the Software. |
18 |
|
|
// |
19 |
|
|
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
20 |
|
|
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
21 |
|
|
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE |
22 |
|
|
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
23 |
|
|
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
24 |
|
|
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
25 |
|
|
//SOFTWARE. |
26 |
|
|
//------------------------------------------------------------------------------------------------- |
27 |
|
|
/* |
28 |
|
|
This software module is a careful adaptation of the integer functions |
29 |
|
|
in the GNU MP library. |
30 |
|
|
|
31 |
|
|
By "adaptation" I mean the following: |
32 |
|
|
|
33 |
|
|
o Many of the macros and other constructs that affect readability |
34 |
|
|
have been removed. This has been done for simplicity. |
35 |
|
|
|
36 |
|
|
o Only the needed functions (large integer and rational number |
37 |
|
|
functions) have been included. This is for use in Dave Ashley's |
38 |
|
|
set of tools. |
39 |
|
|
|
40 |
|
|
o The number of source modules has been dramatically reduced. |
41 |
|
|
|
42 |
|
|
o Assembly-language has been removed. Instead, at the lowest |
43 |
|
|
level, the core is generic 'C' provided by GNU (this is |
44 |
|
|
selected if processor=none is the processor chosen). This |
45 |
|
|
certainly has an effect on speed, but I would rather sacrifice |
46 |
|
|
quite a bit of speed and keep it simple (in one module). |
47 |
|
|
|
48 |
|
|
o The GNU MP library has been specifically ported for Microsoft |
49 |
|
|
Visual C++ 6.0. In other words, its portability has been |
50 |
|
|
deliberately destroyed. Do NOT try to use this on another |
51 |
|
|
platform (or at least certainly do NOT contact me if you have |
52 |
|
|
problems with this). |
53 |
|
|
|
54 |
|
|
o Certain other stylistic changes have been made. |
55 |
|
|
*/ |
56 |
|
|
#ifndef GMP_INTS_H_INCLUDED |
57 |
|
|
#define GMP_INTS_H_INCLUDED |
58 |
|
|
|
59 |
|
|
#ifdef MODULE_GMP_INTS |
60 |
|
|
#define DECMOD_GMP_INTS |
61 |
|
|
#else |
62 |
|
|
#define DECMOD_GMP_INTS extern |
63 |
|
|
#endif |
64 |
|
|
|
65 |
|
|
typedef unsigned long int GMP_INTS_limb_t; |
66 |
|
|
//The fundamental data type for representing integers in binary |
67 |
|
|
//form. For MSVC++, this is a 32-bit type. This data type |
68 |
|
|
//is not normally needed publicly. |
69 |
|
|
#define GMP_INTS_BITS_PER_LIMB (32) |
70 |
|
|
//This is the number of bits that each limb is assumed to hold. |
71 |
|
|
//There is an explicit function in the interface to check this, |
72 |
|
|
//in case anything changes with future versions of MSVC++. |
73 |
|
|
//This software module is NOT meant to be portable, or even |
74 |
|
|
//particularly quick. It is meant to be verifiable and |
75 |
|
|
//testable instead. |
76 |
|
|
typedef long int GMP_INTS_limb_signed_t; |
77 |
|
|
//Signed version of above. |
78 |
|
|
typedef GMP_INTS_limb_t * GMP_INTS_limb_ptr; |
79 |
|
|
//Pointer to a limb (or, more characteristically, to an array |
80 |
|
|
//of limbs). |
81 |
|
|
typedef const GMP_INTS_limb_t * GMP_INTS_limb_srcptr; |
82 |
|
|
//Constant pointer used as the source pointer for copies |
83 |
|
|
//and other operations. |
84 |
|
|
typedef long int GMP_INTS_size_t; |
85 |
|
|
//Used for representing the size of things to this module |
86 |
|
|
typedef long int GMP_INTS_exp_t; |
87 |
|
|
//Used for representing exponent. Assumed to be large enough |
88 |
|
|
//for this. |
89 |
|
|
|
90 |
|
|
//Below is fundamental structure which holds an arbitrary-size |
91 |
|
|
//integer. |
92 |
|
|
typedef struct |
93 |
|
|
{ |
94 |
|
|
int flags; |
95 |
|
|
//Bit-flags as to the condition of the |
96 |
|
|
//integer. The bitflags defined so far |
97 |
|
|
//are designed to be mutually exclusive, |
98 |
|
|
//and are listed below. At the same time, |
99 |
|
|
//we need to define the "official" strings |
100 |
|
|
//for these bit flags. |
101 |
|
|
#define GMP_INTS_EF_INTOVF_POS (1) |
102 |
|
|
#define GMP_INTS_EF_INTOVF_POS_STRING \ |
103 |
|
|
"GMP_INTS_EF_INTOVF_POS" |
104 |
|
|
//The integer has become too large |
105 |
|
|
//growing in a positive direction. |
106 |
|
|
//No further arithmetic will be |
107 |
|
|
//performed on it. |
108 |
|
|
#define GMP_INTS_EF_INTOVF_NEG (2) |
109 |
|
|
#define GMP_INTS_EF_INTOVF_NEG_STRING \ |
110 |
|
|
"GMP_INTS_EF_INTOVF_NEG" |
111 |
|
|
//The integer has become too large |
112 |
|
|
//growing in a negative direction. |
113 |
|
|
//No further arithmetic will be |
114 |
|
|
//performed on it. |
115 |
|
|
#define GMP_INTS_EF_INTOVF_TAINT_POS (4) |
116 |
|
|
#define GMP_INTS_EF_INTOVF_TAINT_POS_STRING \ |
117 |
|
|
"GMP_INTS_EF_INTOVF_TAINT_POS" |
118 |
|
|
//The integer has been arithmetically |
119 |
|
|
//combined with an integer that has |
120 |
|
|
//overflowed in the positive direction. |
121 |
|
|
//This integer is thus considered tainted |
122 |
|
|
//and no further arithmetic will be |
123 |
|
|
//performed on it. |
124 |
|
|
#define GMP_INTS_EF_INTOVF_TAINT_NEG (8) |
125 |
|
|
#define GMP_INTS_EF_INTOVF_TAINT_NEG_STRING \ |
126 |
|
|
"GMP_INTS_EF_INTOVF_TAINT_NEG" |
127 |
|
|
//The integer has been arithmetically |
128 |
|
|
//combined with an integer that has |
129 |
|
|
//overflowed in the negative direction. |
130 |
|
|
//This integer is thus considered tainted |
131 |
|
|
//and no further arithmetic will be |
132 |
|
|
//performed on it. |
133 |
|
|
//The flags above will prevent arithmetic |
134 |
|
|
//on an integer and will taint any integer |
135 |
|
|
//that comes into contact with it as the |
136 |
|
|
//result of an operation. These flags are |
137 |
|
|
//cleared only by an assignment operation |
138 |
|
|
//of any kind. |
139 |
|
|
// |
140 |
|
|
//The next logical questions are: |
141 |
|
|
// o Why do we want to make a size |
142 |
|
|
// limit on integers, anyway? |
143 |
|
|
// o How big is too big? |
144 |
|
|
// |
145 |
|
|
//We want a limit because this software module |
146 |
|
|
//will be used in programs that should be |
147 |
|
|
//reliable. Allowing arbitrarily large results |
148 |
|
|
//would invite users to break the software. |
149 |
|
|
//It would also make testing impossible, because |
150 |
|
|
//the module could not be tested out to its |
151 |
|
|
//limits. Assigning limits means that testing |
152 |
|
|
//can be performed to the limits. Also, there |
153 |
|
|
//are certain constructs in the software that |
154 |
|
|
//may break at high limits, such as _alloca(). |
155 |
|
|
// |
156 |
|
|
//The question of how large is too large is a |
157 |
|
|
//harder question. Arbitrarily, let's decide |
158 |
|
|
//that we want the equivalent of integers with |
159 |
|
|
//100,000 decimal digits, which is about |
160 |
|
|
//332,224 bits, or 10,382 limbs. (By the way |
161 |
|
|
//this limit can always be raised later, but |
162 |
|
|
//the important point is that it exists and |
163 |
|
|
//is tested to). Any integer with more limbs |
164 |
|
|
//than this is considered illegal. |
165 |
|
|
#define GMP_INTS_MAXIMUM_LIMBS_PER_INT (10382) |
166 |
|
|
int n_allocd; /* Number of limbs allocated and pointed |
167 |
|
|
to by the limbs field. This gives the |
168 |
|
|
number allocated (i.e. physically |
169 |
|
|
allocated), but the next field tells how |
170 |
|
|
many are used. Memory is never shrunk |
171 |
|
|
automatically by this software module |
172 |
|
|
(per the wise GNU MP design), so this |
173 |
|
|
number does not ever automatically |
174 |
|
|
decrease. */ |
175 |
|
|
int size; /* abs(size) is the number of limbs the |
176 |
|
|
last field points to. If _mp_size is |
177 |
|
|
negative this is a negative number. This |
178 |
|
|
will be zero if the integer is zero. */ |
179 |
|
|
GMP_INTS_limb_t *limbs; |
180 |
|
|
/* Pointer to the limbs. The first field |
181 |
|
|
of the structure (above) tells how many |
182 |
|
|
spots are allocated, and the second |
183 |
|
|
field (above) tells how many are used. |
184 |
|
|
Numbers are stored least-significant |
185 |
|
|
limbs first. */ |
186 |
|
|
} GMP_INTS_mpz_struct; |
187 |
|
|
|
188 |
|
|
|
189 |
|
|
/* Wrappers for non-stack memory allocation function to be used |
190 |
|
|
** by integer, rational number, and integer and rational number |
191 |
|
|
** algorithm functions. These must be public because they are |
192 |
|
|
** used by the other modules that deal with integers and rational |
193 |
|
|
** numbers. |
194 |
|
|
*/ |
195 |
|
|
DECMOD_GMP_INTS void *GMP_INTS_malloc( size_t size ); |
196 |
|
|
DECMOD_GMP_INTS void *GMP_INTS_calloc( size_t num, size_t size ); |
197 |
|
|
DECMOD_GMP_INTS void *GMP_INTS_realloc( void *memblock, size_t size ); |
198 |
|
|
DECMOD_GMP_INTS void *GMP_INTS_realloc_w_size( void *memblock, |
199 |
|
|
size_t old_size, |
200 |
|
|
size_t size ); |
201 |
|
|
DECMOD_GMP_INTS void GMP_INTS_free( void *memblock ); |
202 |
|
|
DECMOD_GMP_INTS void GMP_INTS_free_w_size( void *memblock, size_t size ); |
203 |
|
|
|
204 |
|
|
/******************************************************************/ |
205 |
|
|
/*** PORTABILITY CHECK FUNCTIONS *******************************/ |
206 |
|
|
/******************************************************************/ |
207 |
|
|
//Because there is the risk that Microsoft Visual C++ might |
208 |
|
|
//change in the future, the following function can be called |
209 |
|
|
//to see if the assumptions about data sizes are valid. This |
210 |
|
|
//function returns TRUE if there is a problem, or FALSE |
211 |
|
|
//otherwise. |
212 |
|
|
DECMOD_GMP_INTS int GMP_INTS_data_sizes_are_wrong(void); |
213 |
|
|
|
214 |
|
|
|
215 |
|
|
/******************************************************************/ |
216 |
|
|
/*** ERROR STRING IDENTIFICATION AND PROCESSING FUNCTIONS *******/ |
217 |
|
|
/******************************************************************/ |
218 |
|
|
//These functions are provided because some clients may deal |
219 |
|
|
//only with symbolic representations (Tcl/Tk, for example). |
220 |
|
|
// |
221 |
|
|
//Attempts to identify the passed string as one of the error |
222 |
|
|
//strings sanctioned by this module. Returns -1 if not a match |
223 |
|
|
//or else the following values. |
224 |
|
|
// 0: GMP_INTS_EF_INTOVF_POS |
225 |
|
|
// 1: GMP_INTS_EF_INTOVF_NEG |
226 |
|
|
// 2: GMP_INTS_EF_INTOVF_TAINT_POS |
227 |
|
|
// 3: GMP_INTS_EF_INTOVF_TAINT_NEG |
228 |
|
|
DECMOD_GMP_INTS |
229 |
|
|
int GMP_INTS_identify_nan_string(const char *s); |
230 |
|
|
|
231 |
|
|
//Returns the sanctioned string for the nan value indicated. |
232 |
|
|
//Integers that may be passed are the same as the |
233 |
|
|
//indices above. No parameter except 0-3 is allowed. |
234 |
|
|
DECMOD_GMP_INTS |
235 |
|
|
const char *GMP_INTS_supply_nan_string(int idx); |
236 |
|
|
|
237 |
|
|
/******************************************************************/ |
238 |
|
|
/*** DEBUG PRINTING FUNCTIONS **********************************/ |
239 |
|
|
/******************************************************************/ |
240 |
|
|
//These functions are for printing out integers and limbs |
241 |
|
|
//and groups of limbs for unit testing and debugging. |
242 |
|
|
// |
243 |
|
|
//Prints out a group of limbs, preceded by a description. |
244 |
|
|
//n may be 0 and/or the lg pointer supplied may be NULL. |
245 |
|
|
DECMOD_GMP_INTS |
246 |
|
|
void GMP_INTS_print_limb_group(FILE *stream, |
247 |
|
|
GMP_INTS_limb_srcptr lg, |
248 |
|
|
GMP_INTS_size_t n, |
249 |
|
|
char *desc); |
250 |
|
|
//Prints an entire integer for diagnosis. |
251 |
|
|
DECMOD_GMP_INTS |
252 |
|
|
void GMP_INTS_mpz_print_int(FILE *stream, |
253 |
|
|
const GMP_INTS_mpz_struct *arg, |
254 |
|
|
char *desc); |
255 |
|
|
|
256 |
|
|
/****************************************************************/ |
257 |
|
|
/*** MACRO REPLACEMENTS *************************************/ |
258 |
|
|
/****************************************************************/ |
259 |
|
|
//The functions here are macros that have been replaced and |
260 |
|
|
//made functions for clarity. Speed was sacrificed for clarity. |
261 |
|
|
DECMOD_GMP_INTS |
262 |
|
|
int GMP_INTS_mpz_get_flags(const GMP_INTS_mpz_struct *arg); |
263 |
|
|
//Allows a caller to obtain the flags of an integer. |
264 |
|
|
//A non-zero value indicates trouble. To figure out which |
265 |
|
|
//trouble, compare against the bit constants defined |
266 |
|
|
//with the "flags" field of the structure type, above. |
267 |
|
|
DECMOD_GMP_INTS GMP_INTS_size_t GMP_INTS_abs_of_size_t(GMP_INTS_size_t arg); |
268 |
|
|
//Returns the absolute value of one of the size arguments used |
269 |
|
|
//to indicate number of limbs. This function is useful |
270 |
|
|
//because integers natively stored with a negative size |
271 |
|
|
//for negative arguments, so the absolute value gives the |
272 |
|
|
//number of limbs consumed. |
273 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_sgn(const GMP_INTS_mpz_struct *arg); |
274 |
|
|
//Returns -1 if integer is negative, 0 if it is zero, |
275 |
|
|
//or 1 if it is positive. |
276 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_is_neg(const GMP_INTS_mpz_struct *arg); |
277 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_is_zero(const GMP_INTS_mpz_struct *arg); |
278 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_is_pos(const GMP_INTS_mpz_struct *arg); |
279 |
|
|
//These functions return 1 if the condition is met, or 0 |
280 |
|
|
//otherwise. |
281 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_is_odd(const GMP_INTS_mpz_struct *arg); |
282 |
|
|
//Returns 1 if the integer is odd, or 0 if it is even. |
283 |
|
|
DECMOD_GMP_INTS int GMP_INTS_mpz_is_even(const GMP_INTS_mpz_struct *arg); |
284 |
|
|
//Returns 1 if the integer is even, or 0 if it is odd. |
285 |
|
|
DECMOD_GMP_INTS void GMP_INTS_mpz_negate(GMP_INTS_mpz_struct *arg); |
286 |
|
|
//Negates the number (changes the sign). |
287 |
|
|
DECMOD_GMP_INTS |
288 |
|
|
void GMP_INTS_mpn_normalize(GMP_INTS_limb_ptr limb_array, |
289 |
|
|
GMP_INTS_size_t *idx); |
290 |
|
|
//Adjusts an index downward to bypass any most significant |
291 |
|
|
//zero limbs. This was a macro in the GNU implementation. |
292 |
|
|
//This is for when the size of a result is overestimated |
293 |
|
|
//(the most pessimistic estimates must be made when |
294 |
|
|
//allocating memory before an operation). |
295 |
|
|
DECMOD_GMP_INTS |
296 |
|
|
void GMP_INTS_mpn_copy_limbs(GMP_INTS_limb_ptr dest, |
297 |
|
|
GMP_INTS_limb_srcptr src, |
298 |
|
|
GMP_INTS_size_t n); |
299 |
|
|
//Copies limbs from source to destination. This |
300 |
|
|
//function replaces a macro that was present in the |
301 |
|
|
//GNU code. Again, clarity over speed. |
302 |
|
|
/****************************************************************/ |
303 |
|
|
/*** LOW-LEVEL ARITHMETIC FUNCTIONS *************************/ |
304 |
|
|
/****************************************************************/ |
305 |
|
|
//Gives the flags of a result integer as a function of the |
306 |
|
|
//flags of its two operands. If the function requires only |
307 |
|
|
//one operand, just use zero as the second parameter and the |
308 |
|
|
//result will be correct. Handles tainting. |
309 |
|
|
DECMOD_GMP_INTS |
310 |
|
|
int GMP_INTS_two_op_flags_map(int flags1, int flags2); |
311 |
|
|
|
312 |
|
|
//Adds the single limb s2_limb to the array of limbs s1, |
313 |
|
|
//processing carries, and copies the result to the location |
314 |
|
|
//res_ptr. res_ptr is assumed to be [at least] the same size |
315 |
|
|
//as s1. From the design, s1 and res_ptr may be the |
316 |
|
|
//same set of locations. The |
317 |
|
|
//result is 1 if there was a carry out of the final limb or |
318 |
|
|
//0 otherwise. |
319 |
|
|
DECMOD_GMP_INTS |
320 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_add_1 (GMP_INTS_limb_ptr res_ptr, |
321 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
322 |
|
|
GMP_INTS_size_t s1_size, |
323 |
|
|
GMP_INTS_limb_t s2_limb); |
324 |
|
|
|
325 |
|
|
//Very similar to the addition function. Counts on the single |
326 |
|
|
//limb that is being subtracted being not enough to roll over the |
327 |
|
|
//integer that is being subtracted from. No harm if this is done |
328 |
|
|
//(it just obeys 2-s complement rules) but this was probably not |
329 |
|
|
//the intent. From the design, s1 and res_ptr may |
330 |
|
|
//be the same set of locations. The |
331 |
|
|
//result is 1 if there was a borrow out of the final limb or |
332 |
|
|
//0 otherwise. |
333 |
|
|
DECMOD_GMP_INTS |
334 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_sub_1(GMP_INTS_limb_ptr res_ptr, |
335 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
336 |
|
|
GMP_INTS_size_t s1_size, |
337 |
|
|
GMP_INTS_limb_t s2_limb); |
338 |
|
|
|
339 |
|
|
//Multiplies a limb by a group of limbs. The return value is |
340 |
|
|
//the unsigned overflow out of the "top", which may be up to |
341 |
|
|
//one limb large (i.e. it is more than just a carry, it has |
342 |
|
|
//a value besides 0 and 1). |
343 |
|
|
DECMOD_GMP_INTS |
344 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_mul_1(GMP_INTS_limb_ptr res_ptr, |
345 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
346 |
|
|
GMP_INTS_size_t s1_size, |
347 |
|
|
GMP_INTS_limb_t s2_limb); |
348 |
|
|
|
349 |
|
|
//Adds together two groups of limbs of same size. The result |
350 |
|
|
//may be the same location as one or both of the two |
351 |
|
|
//operands. |
352 |
|
|
DECMOD_GMP_INTS |
353 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_add_n(GMP_INTS_limb_ptr res_ptr, |
354 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
355 |
|
|
GMP_INTS_limb_srcptr s2_ptr, |
356 |
|
|
GMP_INTS_size_t size); |
357 |
|
|
|
358 |
|
|
//This function makes the mapping: |
359 |
|
|
// res_ptr = res_ptr + s2_limb * s1_ptr |
360 |
|
|
//From the design, it appears that it is alright if |
361 |
|
|
//res_ptr and s1_ptr are the same area. The return |
362 |
|
|
//value is the excess that that should exist one limb |
363 |
|
|
//above the MSL of res_ptr (i.e. it is more than a carry, it |
364 |
|
|
//may be larger than one). |
365 |
|
|
DECMOD_GMP_INTS |
366 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_addmul_1(GMP_INTS_limb_ptr res_ptr, |
367 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
368 |
|
|
GMP_INTS_size_t s1_size, |
369 |
|
|
GMP_INTS_limb_t s2_limb); |
370 |
|
|
|
371 |
|
|
//This function adds in general two natural numbers. Numbers must |
372 |
|
|
//be arranged so that S2 takes no more limbs than S1, i.e. |
373 |
|
|
//LIMBS(s1) >= LIMBS(s2). Memory must be allocated, and there must |
374 |
|
|
//be space for the result. Not clear from the design if memory |
375 |
|
|
//areas can be coincident, but suspect can. |
376 |
|
|
DECMOD_GMP_INTS |
377 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_add(GMP_INTS_limb_ptr res_ptr, |
378 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
379 |
|
|
GMP_INTS_size_t s1_size, |
380 |
|
|
GMP_INTS_limb_srcptr s2_ptr, |
381 |
|
|
GMP_INTS_size_t s2_size); |
382 |
|
|
|
383 |
|
|
//Subtracts two same-size operands. They may be coincident in |
384 |
|
|
//memory. |
385 |
|
|
DECMOD_GMP_INTS |
386 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_sub_n(GMP_INTS_limb_ptr res_ptr, |
387 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
388 |
|
|
GMP_INTS_limb_srcptr s2_ptr, |
389 |
|
|
GMP_INTS_size_t size); |
390 |
|
|
|
391 |
|
|
//This function subtracts in general two natural numbers. Numbers must |
392 |
|
|
//be arranged so that S2 takes no more limbs than S1, i.e. |
393 |
|
|
//LIMBS(s1) >= LIMBS(s2). Memory must be allocated, and there must |
394 |
|
|
//be space for the result. Not clear from the design if memory |
395 |
|
|
//areas can be coincident. Result is S1-S2. |
396 |
|
|
DECMOD_GMP_INTS |
397 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_sub (GMP_INTS_limb_ptr res_ptr, |
398 |
|
|
GMP_INTS_limb_srcptr s1_ptr, |
399 |
|
|
GMP_INTS_size_t s1_size, |
400 |
|
|
GMP_INTS_limb_srcptr s2_ptr, |
401 |
|
|
GMP_INTS_size_t s2_size); |
402 |
|
|
|
403 |
|
|
//Shifts UP of size USIZE left by CNT. CNT must be less than the number |
404 |
|
|
//of bits per limb, which is at this time 32. "wp" and "up" may be |
405 |
|
|
//coincident. Zero count is not allowed. Value returned is the bits shifted |
406 |
|
|
//out the left. |
407 |
|
|
DECMOD_GMP_INTS |
408 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_lshift(GMP_INTS_limb_ptr wp, |
409 |
|
|
GMP_INTS_limb_srcptr up, |
410 |
|
|
GMP_INTS_size_t usize, |
411 |
|
|
unsigned int cnt); |
412 |
|
|
|
413 |
|
|
//Shifts UP of size USIZE right by CNT. CNT must be less than the number |
414 |
|
|
//of bits per limb, which is at this time 32. "wp" and "up" may be |
415 |
|
|
//coincident. Zero count is not allowed. Value returned is the bits shifted |
416 |
|
|
//out the right. |
417 |
|
|
DECMOD_GMP_INTS |
418 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_rshift (GMP_INTS_limb_ptr wp, |
419 |
|
|
GMP_INTS_limb_srcptr up, |
420 |
|
|
GMP_INTS_size_t usize, |
421 |
|
|
unsigned int cnt); |
422 |
|
|
|
423 |
|
|
//Compares two natural numbers of same size and returns the expected |
424 |
|
|
//1 iff op1 > op2, -1 if op1 < op2, or 0 if they are equal. Leading |
425 |
|
|
//zero limbs are alright and do not affect the result. |
426 |
|
|
DECMOD_GMP_INTS |
427 |
|
|
int GMP_INTS_mpn_cmp (GMP_INTS_limb_srcptr op1_ptr, |
428 |
|
|
GMP_INTS_limb_srcptr op2_ptr, |
429 |
|
|
GMP_INTS_size_t size); |
430 |
|
|
|
431 |
|
|
//This is the basic multiplication of two natural numbers, each of |
432 |
|
|
//which may occuply many limbs. In the |
433 |
|
|
//original GNU MP code, there were several algorithms which could |
434 |
|
|
//be selected, depending on the size of the operands and other |
435 |
|
|
//factors. This was the most basic case--the basic longhand |
436 |
|
|
//multiplication. The code has been pared so that this is the |
437 |
|
|
//only case. |
438 |
|
|
DECMOD_GMP_INTS |
439 |
|
|
void GMP_INTS_mpn_mul_basecase (GMP_INTS_limb_ptr prodp, |
440 |
|
|
GMP_INTS_limb_srcptr up, |
441 |
|
|
GMP_INTS_size_t usize, |
442 |
|
|
GMP_INTS_limb_srcptr vp, |
443 |
|
|
GMP_INTS_size_t vsize); |
444 |
|
|
|
445 |
|
|
//This is the basic multiplication of two natural numbers. In the old |
446 |
|
|
//GNU MP code, one of several algorithms would be selected. The code |
447 |
|
|
//has been pared down so that this is just a passthrough to |
448 |
|
|
//GMP_INTS_mpn_mul_basecase(). Only the simplest multiplication |
449 |
|
|
//algorithm is used at this point. |
450 |
|
|
DECMOD_GMP_INTS |
451 |
|
|
void GMP_INTS_mpn_mul_n (GMP_INTS_limb_ptr p, |
452 |
|
|
GMP_INTS_limb_srcptr a, |
453 |
|
|
GMP_INTS_limb_srcptr b, |
454 |
|
|
GMP_INTS_size_t n); |
455 |
|
|
//Multiplication of two natural numbers. Value returned is the most |
456 |
|
|
//significant limb of the array of predicted size un+vn, rather than |
457 |
|
|
//the spillover (this is unlike most functions). |
458 |
|
|
DECMOD_GMP_INTS |
459 |
|
|
GMP_INTS_limb_t GMP_INTS_mpn_mul(GMP_INTS_limb_ptr prodp, |
460 |
|
|
GMP_INTS_limb_srcptr up, |
461 |
|
|
GMP_INTS_size_t un, |
462 |
|
|
GMP_INTS_limb_srcptr vp, |
463 |
|
|
GMP_INTS_size_t vn); |
464 |
|
|
|
465 |
|
|
/******************************************************************/ |
466 |
|
|
/*** LIMB SPACE REALLOCATION FUNCTIONS *************************/ |
467 |
|
|
/******************************************************************/ |
468 |
|
|
DECMOD_GMP_INTS |
469 |
|
|
void *GMP_INTS_mpz_realloc (GMP_INTS_mpz_struct *m, |
470 |
|
|
GMP_INTS_size_t new_size); |
471 |
|
|
//Changes the number of limbs allocated. |
472 |
|
|
|
473 |
|
|
/******************************************************************/ |
474 |
|
|
/*** PUBLIC INITIALIZATION AND MEMORY MANAGEMENT FUNCTIONS *****/ |
475 |
|
|
/******************************************************************/ |
476 |
|
|
//Allocate space for an integer and sets it to zero. |
477 |
|
|
//This must be the first call made. |
478 |
|
|
DECMOD_GMP_INTS |
479 |
|
|
void GMP_INTS_mpz_init (GMP_INTS_mpz_struct *x); |
480 |
|
|
|
481 |
|
|
//Deallocates space for an integer. This must be the |
482 |
|
|
//final call made. |
483 |
|
|
DECMOD_GMP_INTS |
484 |
|
|
void GMP_INTS_mpz_clear (GMP_INTS_mpz_struct *x); |
485 |
|
|
|
486 |
|
|
|
487 |
|
|
/******************************************************************/ |
488 |
|
|
/*** PUBLIC ASSIGNMENT FUNCTIONS *******************************/ |
489 |
|
|
/******************************************************************/ |
490 |
|
|
//Copies from one integer to another. Must both be allocated and \ |
491 |
|
|
//not be the same variable. |
492 |
|
|
DECMOD_GMP_INTS |
493 |
|
|
void GMP_INTS_mpz_copy( GMP_INTS_mpz_struct *dst, |
494 |
|
|
const GMP_INTS_mpz_struct *src); |
495 |
|
|
|
496 |
|
|
//Assigns the integer to be the value of an unsigned long. |
497 |
|
|
DECMOD_GMP_INTS |
498 |
|
|
void GMP_INTS_mpz_set_ui (GMP_INTS_mpz_struct *dest, |
499 |
|
|
unsigned long int val); |
500 |
|
|
|
501 |
|
|
//Assigns the integer to be the value of a signed long. |
502 |
|
|
DECMOD_GMP_INTS |
503 |
|
|
void GMP_INTS_mpz_set_si (GMP_INTS_mpz_struct *dest, |
504 |
|
|
signed long int val); |
505 |
|
|
//Assigns the integer to be the value of a simple string |
506 |
|
|
//(simple = no E notation). Only form handled is |
507 |
|
|
// [-]digits. |
508 |
|
|
//Other forms will not cause catastrophic failure but might |
509 |
|
|
//not behave as expected. |
510 |
|
|
DECMOD_GMP_INTS |
511 |
|
|
void GMP_INTS_mpz_set_simple_char_str(GMP_INTS_mpz_struct *z, |
512 |
|
|
const char *s); |
513 |
|
|
//Assigns an arbitary integer to be a number with E notation. |
514 |
|
|
//*failure set non-zero if can't parse or set. Number must |
515 |
|
|
//be pure integer--no lost precison when scientific notation |
516 |
|
|
//is processed. |
517 |
|
|
void GMP_INTS_mpz_set_sci_not_num(GMP_INTS_mpz_struct *z, |
518 |
|
|
int *failure, |
519 |
|
|
const char *s); |
520 |
|
|
|
521 |
|
|
//Attempts to parse an integer using the following three |
522 |
|
|
//formats: a)simple integer, b)simple integer with commas, |
523 |
|
|
//c)integer in scientific notation. Returns the value of |
524 |
|
|
//the integer if parse successful, or 0 and a failure flag |
525 |
|
|
//otherwise. |
526 |
|
|
void GMP_INTS_mpz_set_general_int(GMP_INTS_mpz_struct *z, |
527 |
|
|
int *failure, |
528 |
|
|
const char *s); |
529 |
|
|
|
530 |
|
|
//Attempts to parse an integer as either a simple integer, |
531 |
|
|
//an integer with commas, or a number in scientific notation |
532 |
|
|
//into a UINT32. If the number cannot be parsed into that, |
533 |
|
|
//the result is zero and failure is true. |
534 |
|
|
void GMP_INTS_mpz_parse_into_uint32(unsigned *result, |
535 |
|
|
int *failure, |
536 |
|
|
char *s); |
537 |
|
|
|
538 |
|
|
//Swaps a and b. What this does is a swap of the area |
539 |
|
|
//pointed to (i.e. the control block). Pointers held in |
540 |
|
|
//these blocks are therefore automatically swapped. |
541 |
|
|
DECMOD_GMP_INTS |
542 |
|
|
void GMP_INTS_mpz_swap(GMP_INTS_mpz_struct *a, |
543 |
|
|
GMP_INTS_mpz_struct *b); |
544 |
|
|
|
545 |
|
|
/****************************************************************/ |
546 |
|
|
/*** PUBLIC INTEGER ARITHMETIC FUNCTIONS ********************/ |
547 |
|
|
/****************************************************************/ |
548 |
|
|
//Adds two arbitrary integers to produce an arbitrary result. |
549 |
|
|
//The result space must be initialized already. |
550 |
|
|
DECMOD_GMP_INTS |
551 |
|
|
void GMP_INTS_mpz_add ( GMP_INTS_mpz_struct *w, |
552 |
|
|
const GMP_INTS_mpz_struct *u, |
553 |
|
|
const GMP_INTS_mpz_struct *v); |
554 |
|
|
|
555 |
|
|
//Adds the integer v to u and produces w. u and w must be |
556 |
|
|
//be created already. |
557 |
|
|
void GMP_INTS_mpz_add_ui ( GMP_INTS_mpz_struct *w, |
558 |
|
|
const GMP_INTS_mpz_struct *u, |
559 |
|
|
unsigned long int v); |
560 |
|
|
|
561 |
|
|
//Subtracts two aribtrary integers to produce an arbitrary |
562 |
|
|
//result. The result space must be initialized already. |
563 |
|
|
DECMOD_GMP_INTS |
564 |
|
|
void GMP_INTS_mpz_sub ( GMP_INTS_mpz_struct *w, |
565 |
|
|
const GMP_INTS_mpz_struct *u, |
566 |
|
|
const GMP_INTS_mpz_struct *v); |
567 |
|
|
|
568 |
|
|
//Subtracts the integer v from u to produce w. u and w must |
569 |
|
|
//be created already. |
570 |
|
|
void GMP_INTS_mpz_sub_ui ( GMP_INTS_mpz_struct *w, |
571 |
|
|
const GMP_INTS_mpz_struct *u, |
572 |
|
|
unsigned long int v); |
573 |
|
|
|
574 |
|
|
//Multiplies two arbitrary integers to produce an arbitrary |
575 |
|
|
//result. The result space must be initialized already. |
576 |
|
|
DECMOD_GMP_INTS |
577 |
|
|
void GMP_INTS_mpz_mul ( GMP_INTS_mpz_struct *w, |
578 |
|
|
const GMP_INTS_mpz_struct *u, |
579 |
|
|
const GMP_INTS_mpz_struct *v); |
580 |
|
|
|
581 |
|
|
//Multiplies the arbitrary integer by a C-native signed |
582 |
|
|
//long. |
583 |
|
|
DECMOD_GMP_INTS |
584 |
|
|
void GMP_INTS_mpz_mul_si ( GMP_INTS_mpz_struct *w, |
585 |
|
|
const GMP_INTS_mpz_struct *u, |
586 |
|
|
long int v); |
587 |
|
|
//Multiplies the arbitrary integer by a C-native unsigned |
588 |
|
|
//long. |
589 |
|
|
DECMOD_GMP_INTS |
590 |
|
|
void GMP_INTS_mpz_mul_ui ( GMP_INTS_mpz_struct *w, |
591 |
|
|
const GMP_INTS_mpz_struct *u, |
592 |
|
|
unsigned long int v); |
593 |
|
|
|
594 |
|
|
//Divides integers. |
595 |
|
|
DECMOD_GMP_INTS |
596 |
|
|
void GMP_INTS_mpz_tdiv_qr ( GMP_INTS_mpz_struct *quot, |
597 |
|
|
GMP_INTS_mpz_struct *rem, |
598 |
|
|
const GMP_INTS_mpz_struct *num, |
599 |
|
|
const GMP_INTS_mpz_struct *den); |
600 |
|
|
|
601 |
|
|
//Calculates the factorial. All values <=1 result in a |
602 |
|
|
//value of 1. |
603 |
|
|
DECMOD_GMP_INTS |
604 |
|
|
void GMP_INTS_mpz_fac_ui(GMP_INTS_mpz_struct *result, |
605 |
|
|
unsigned long int n); |
606 |
|
|
|
607 |
|
|
//Exponentiates a base to an exponent. 0^0=1, N^0=1. The algorithm |
608 |
|
|
//used is successive squaring and multiplying. Not the MOST efficient, |
609 |
|
|
//but OK. The result and the base must be different variables. |
610 |
|
|
DECMOD_GMP_INTS |
611 |
|
|
void GMP_INTS_mpz_pow_ui( GMP_INTS_mpz_struct *result, |
612 |
|
|
const GMP_INTS_mpz_struct *base, |
613 |
|
|
unsigned exponent); |
614 |
|
|
|
615 |
|
|
//Takes the absolute value of the arbitrary integer passed. |
616 |
|
|
DECMOD_GMP_INTS |
617 |
|
|
void GMP_INTS_mpz_abs(GMP_INTS_mpz_struct *arg); |
618 |
|
|
|
619 |
|
|
//Calculates the gcd() of the two arguments. If either argument is zero, the |
620 |
|
|
//result is automatically 1. If either argument is negative, its absolute |
621 |
|
|
//value is used. The two input pointers may not be the same, because doing |
622 |
|
|
//that is senseless--it would become a copy operation, because gcd(x,x) = x. |
623 |
|
|
//However, the result may be the same as either of the two inputs. |
624 |
|
|
DECMOD_GMP_INTS |
625 |
|
|
void GMP_INTS_mpz_gcd(GMP_INTS_mpz_struct *result, |
626 |
|
|
const GMP_INTS_mpz_struct *arg1, |
627 |
|
|
const GMP_INTS_mpz_struct *arg2); |
628 |
|
|
|
629 |
|
|
|
630 |
|
|
/******************************************************************/ |
631 |
|
|
/*** PUBLIC CONVERSION AND OUTPUT FUNCTIONS ********************/ |
632 |
|
|
/******************************************************************/ |
633 |
|
|
|
634 |
|
|
//Get an upper bound on the number of characters required for |
635 |
|
|
//representing an integer, including minus sign and commas, |
636 |
|
|
//Terminating zero, etc. This is just a little wasteful, but |
637 |
|
|
//will always reserve enough memory. |
638 |
|
|
DECMOD_GMP_INTS |
639 |
|
|
int GMP_INTS_mpz_size_in_base_10(const GMP_INTS_mpz_struct *arg); |
640 |
|
|
|
641 |
|
|
//Convert from integer to string. Commas must be |
642 |
|
|
//added separately, and there is enough space reserved for |
643 |
|
|
//them. This function is only warrantied not to overflow |
644 |
|
|
//a buffer allocated using the function above as a sizing |
645 |
|
|
//guide. |
646 |
|
|
DECMOD_GMP_INTS |
647 |
|
|
void GMP_INTS_mpz_to_string(char *out, |
648 |
|
|
const GMP_INTS_mpz_struct *in); |
649 |
|
|
|
650 |
|
|
//Prints the integer passed to the stream in a long-hand |
651 |
|
|
//format. |
652 |
|
|
DECMOD_GMP_INTS |
653 |
|
|
void GMP_INTS_mpz_long_int_format_to_stream(FILE *s, |
654 |
|
|
const GMP_INTS_mpz_struct *i, |
655 |
|
|
const char *desc); |
656 |
|
|
|
657 |
|
|
//Prints the integer raw to a stream--just digits, no extra chars. |
658 |
|
|
DECMOD_GMP_INTS |
659 |
|
|
void GMP_INTS_mpz_arb_int_raw_to_stream(FILE *s, |
660 |
|
|
const GMP_INTS_mpz_struct *i); |
661 |
|
|
|
662 |
|
|
/******************************************************************/ |
663 |
|
|
/*** COMPARISON AND SIZING FUNCTIONS ***************************/ |
664 |
|
|
/******************************************************************/ |
665 |
|
|
//Returns 1 if arbitrary integer will fit in an unsigned integer, |
666 |
|
|
//or 0 otherwise. |
667 |
|
|
DECMOD_GMP_INTS |
668 |
|
|
int GMP_INTS_mpz_fits_uint_p (const GMP_INTS_mpz_struct *src); |
669 |
|
|
|
670 |
|
|
//Returns 1 if arbitrary integer will fit in a signed integer, |
671 |
|
|
//or 0 otherwise. |
672 |
|
|
DECMOD_GMP_INTS |
673 |
|
|
int GMP_INTS_mpz_fits_sint_p (const GMP_INTS_mpz_struct *src); |
674 |
|
|
|
675 |
|
|
//Retrieves an unsigned version of limb zero from the number, |
676 |
|
|
//or will return zero if the number is zero. This is the |
677 |
|
|
//officially sanctioned way to get the value if it fits in |
678 |
|
|
//an unsigned. |
679 |
|
|
DECMOD_GMP_INTS |
680 |
|
|
unsigned GMP_INTS_mpz_get_limb_zero(const GMP_INTS_mpz_struct *src); |
681 |
|
|
|
682 |
|
|
//Returnes neg value if u<v, 0 if u==v, and 1 if u>v. |
683 |
|
|
DECMOD_GMP_INTS |
684 |
|
|
int GMP_INTS_mpz_cmp (const GMP_INTS_mpz_struct *u, |
685 |
|
|
const GMP_INTS_mpz_struct *v); |
686 |
|
|
|
687 |
|
|
//Compares an arbitrary integer to an unsigned long |
688 |
|
|
//and returns relative ordering, <0 if u < v, 0 if u==v, |
689 |
|
|
//and >0 if u > v. |
690 |
|
|
DECMOD_GMP_INTS |
691 |
|
|
int GMP_INTS_mpz_cmp_ui (const GMP_INTS_mpz_struct *u, |
692 |
|
|
unsigned long int v_digit); |
693 |
|
|
//Compares arbitrary integer to a signed long |
694 |
|
|
//and returns relative ordering, <0 if u<v, 0 if u==v, |
695 |
|
|
//and >0 if u>v. |
696 |
|
|
DECMOD_GMP_INTS |
697 |
|
|
int GMP_INTS_mpz_cmp_si (const GMP_INTS_mpz_struct *u, |
698 |
|
|
signed long int v_digit); |
699 |
|
|
|
700 |
|
|
//Compares the absolute value of two arbitrary integers. |
701 |
|
|
DECMOD_GMP_INTS |
702 |
|
|
int GMP_INTS_mpz_cmpabs (const GMP_INTS_mpz_struct *u, |
703 |
|
|
const GMP_INTS_mpz_struct *v); |
704 |
|
|
//Compares the absolute value of an arbitrary integer and |
705 |
|
|
//an unsigned long. |
706 |
|
|
DECMOD_GMP_INTS |
707 |
|
|
int GMP_INTS_mpz_cmpabs_ui(const GMP_INTS_mpz_struct *u, |
708 |
|
|
unsigned long int v_digit); |
709 |
|
|
|
710 |
|
|
/****************************************************************/ |
711 |
|
|
/*** VERSION CONTROL REPORTING FUNCTIONS ********************/ |
712 |
|
|
/****************************************************************/ |
713 |
|
|
DECMOD_GMP_INTS const char *GMP_INTS_cvcinfo(void); |
714 |
|
|
DECMOD_GMP_INTS const char *GMP_INTS_hvcinfo(void); |
715 |
|
|
|
716 |
|
|
/* Preprocessor string to allow the H-file version to be |
717 |
|
|
** compiled into the C-file. |
718 |
|
|
*/ |
719 |
|
|
#define GMP_INTS_H_VERSION ("$Header$") |
720 |
|
|
|
721 |
|
|
#endif /* GMP_INTS_H_INCLUDED */ |
722 |
|
|
|
723 |
|
|
// End of gmp_ints.h. |