]>
Commit | Line | Data |
---|---|---|
28f540f4 RM |
1 | /* gmp.h -- Definitions for GNU multiple precision functions. |
2 | ||
dff8da6b | 3 | Copyright (C) 1991-2024 Free Software Foundation, Inc. |
28f540f4 RM |
4 | |
5 | This file is part of the GNU MP Library. | |
6 | ||
7 | The GNU MP Library is free software; you can redistribute it and/or modify | |
cc7375ce RM |
8 | it under the terms of the GNU Lesser General Public License as published by |
9 | the Free Software Foundation; either version 2.1 of the License, or (at your | |
28f540f4 RM |
10 | option) any later version. |
11 | ||
12 | The GNU MP Library is distributed in the hope that it will be useful, but | |
13 | WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
cc7375ce | 14 | or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
28f540f4 RM |
15 | License for more details. |
16 | ||
cc7375ce | 17 | You should have received a copy of the GNU Lesser General Public License |
59ba27a6 | 18 | along with the GNU MP Library; see the file COPYING.LIB. If not, see |
5a82c748 | 19 | <https://www.gnu.org/licenses/>. */ |
28f540f4 RM |
20 | |
21 | #ifndef __GMP_H__ | |
22 | ||
b037a293 UD |
23 | #include <features.h> |
24 | ||
28f540f4 | 25 | #ifndef __GNU_MP__ |
6b628d36 | 26 | #define __GNU_MP__ 2 |
28f540f4 RM |
27 | #define __need_size_t |
28 | #include <stddef.h> | |
ba848785 | 29 | #undef __need_size_t |
28f540f4 | 30 | |
6b628d36 | 31 | #if defined (__STDC__) || defined (__cplusplus) |
28f540f4 RM |
32 | #define __gmp_const const |
33 | #else | |
34 | #define __gmp_const | |
35 | #endif | |
36 | ||
8f5ca04b | 37 | #if defined (__GNUC__) |
6b628d36 | 38 | #define __gmp_inline __inline__ |
28f540f4 RM |
39 | #else |
40 | #define __gmp_inline | |
41 | #endif | |
42 | ||
6b628d36 RM |
43 | #ifndef _EXTERN_INLINE |
44 | #ifdef __GNUC__ | |
b037a293 | 45 | #define _EXTERN_INLINE __extern_inline |
6b628d36 RM |
46 | #else |
47 | #define _EXTERN_INLINE static | |
48 | #endif | |
49 | #endif | |
50 | ||
8d291eab AZ |
51 | #ifdef _LIBC |
52 | #define _ATTRIBUTE_HIDDEN attribute_hidden | |
53 | #else | |
54 | #define _ATTRIBUTE_HIDDEN | |
55 | #endif | |
56 | ||
28f540f4 | 57 | #ifdef _SHORT_LIMB |
b928942e RM |
58 | typedef unsigned int mp_limb_t; |
59 | typedef int mp_limb_signed_t; | |
28f540f4 | 60 | #else |
ba848785 | 61 | #ifdef _LONG_LONG_LIMB |
b928942e RM |
62 | typedef unsigned long long int mp_limb_t; |
63 | typedef long long int mp_limb_signed_t; | |
8f5ca04b | 64 | #else |
b928942e RM |
65 | typedef unsigned long int mp_limb_t; |
66 | typedef long int mp_limb_signed_t; | |
28f540f4 | 67 | #endif |
8f5ca04b | 68 | #endif |
28f540f4 | 69 | |
b928942e RM |
70 | typedef mp_limb_t * mp_ptr; |
71 | typedef __gmp_const mp_limb_t * mp_srcptr; | |
6b628d36 | 72 | typedef long int mp_size_t; |
28f540f4 RM |
73 | typedef long int mp_exp_t; |
74 | ||
75 | #ifndef __MP_SMALL__ | |
76 | typedef struct | |
77 | { | |
6b628d36 | 78 | int _mp_alloc; /* Number of *limbs* allocated and pointed |
28f540f4 | 79 | to by the D field. */ |
6b628d36 | 80 | int _mp_size; /* abs(SIZE) is the number of limbs |
28f540f4 RM |
81 | the last field points to. If SIZE |
82 | is negative this is a negative | |
83 | number. */ | |
b928942e | 84 | mp_limb_t *_mp_d; /* Pointer to the limbs. */ |
28f540f4 RM |
85 | } __mpz_struct; |
86 | #else | |
87 | typedef struct | |
88 | { | |
6b628d36 | 89 | short int _mp_alloc; /* Number of *limbs* allocated and pointed |
28f540f4 | 90 | to by the D field. */ |
6b628d36 | 91 | short int _mp_size; /* abs(SIZE) is the number of limbs |
28f540f4 RM |
92 | the last field points to. If SIZE |
93 | is negative this is a negative | |
94 | number. */ | |
b928942e | 95 | mp_limb_t *_mp_d; /* Pointer to the limbs. */ |
28f540f4 RM |
96 | } __mpz_struct; |
97 | #endif | |
98 | #endif /* __GNU_MP__ */ | |
99 | ||
100 | /* User-visible types. */ | |
101 | typedef __mpz_struct MP_INT; | |
102 | typedef __mpz_struct mpz_t[1]; | |
103 | ||
104 | /* Structure for rational numbers. Zero is represented as 0/any, i.e. | |
105 | the denominator is ignored. Negative numbers have the sign in | |
106 | the numerator. */ | |
107 | typedef struct | |
108 | { | |
6b628d36 RM |
109 | __mpz_struct _mp_num; |
110 | __mpz_struct _mp_den; | |
28f540f4 | 111 | #if 0 |
6b628d36 | 112 | int _mp_num_alloc; /* Number of limbs allocated |
28f540f4 | 113 | for the numerator. */ |
6b628d36 | 114 | int _mp_num_size; /* The absolute value of this field is the |
28f540f4 RM |
115 | length of the numerator; the sign is the |
116 | sign of the entire rational number. */ | |
6b628d36 RM |
117 | mp_ptr _mp_num; /* Pointer to the numerator limbs. */ |
118 | int _mp_den_alloc; /* Number of limbs allocated | |
28f540f4 | 119 | for the denominator. */ |
6b628d36 | 120 | int _mp_den_size; /* Length of the denominator. (This field |
28f540f4 | 121 | should always be positive.) */ |
6b628d36 | 122 | mp_ptr _mp_den; /* Pointer to the denominator limbs. */ |
28f540f4 RM |
123 | #endif |
124 | } __mpq_struct; | |
125 | ||
126 | typedef __mpq_struct MP_RAT; | |
127 | typedef __mpq_struct mpq_t[1]; | |
128 | ||
129 | typedef struct | |
130 | { | |
b928942e | 131 | int _mp_prec; /* Max precision, in number of `mp_limb_t's. |
28f540f4 | 132 | Set by mpf_init and modified by |
ba848785 RM |
133 | mpf_set_prec. The area pointed to |
134 | by the `d' field contains `prec' + 1 | |
135 | limbs. */ | |
6b628d36 | 136 | int _mp_size; /* abs(SIZE) is the number of limbs |
28f540f4 RM |
137 | the last field points to. If SIZE |
138 | is negative this is a negative | |
139 | number. */ | |
b928942e RM |
140 | mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ |
141 | mp_limb_t *_mp_d; /* Pointer to the limbs. */ | |
28f540f4 RM |
142 | } __mpf_struct; |
143 | ||
144 | /* typedef __mpf_struct MP_FLOAT; */ | |
145 | typedef __mpf_struct mpf_t[1]; | |
146 | ||
147 | /* Types for function declarations in gmp files. */ | |
ba848785 | 148 | /* ??? Should not pollute user name space with these ??? */ |
28f540f4 RM |
149 | typedef __gmp_const __mpz_struct *mpz_srcptr; |
150 | typedef __mpz_struct *mpz_ptr; | |
151 | typedef __gmp_const __mpf_struct *mpf_srcptr; | |
152 | typedef __mpf_struct *mpf_ptr; | |
153 | typedef __gmp_const __mpq_struct *mpq_srcptr; | |
154 | typedef __mpq_struct *mpq_ptr; | |
155 | ||
6b628d36 RM |
156 | #ifndef _PROTO |
157 | #if defined (__STDC__) || defined (__cplusplus) | |
28f540f4 RM |
158 | #define _PROTO(x) x |
159 | #else | |
160 | #define _PROTO(x) () | |
161 | #endif | |
6b628d36 RM |
162 | #endif |
163 | ||
164 | #ifndef __MPN | |
b928942e | 165 | #if defined (__STDC__) || defined (__cplusplus) |
6b628d36 | 166 | #define __MPN(x) __mpn_##x |
b928942e RM |
167 | #else |
168 | #define __MPN(x) __mpn_/**/x | |
169 | #endif | |
6b628d36 | 170 | #endif |
28f540f4 | 171 | |
8f5ca04b RM |
172 | #if defined (FILE) || defined (_STDIO_H_) || defined (__STDIO_H__) || defined (H_STDIO) |
173 | #define _GMP_H_HAVE_FILE 1 | |
174 | #endif | |
175 | ||
6b628d36 RM |
176 | void mp_set_memory_functions _PROTO ((void *(*) (size_t), |
177 | void *(*) (void *, size_t, size_t), | |
178 | void (*) (void *, size_t))); | |
b928942e | 179 | extern const int mp_bits_per_limb; |
28f540f4 RM |
180 | |
181 | /**************** Integer (i.e. Z) routines. ****************/ | |
182 | ||
6b628d36 RM |
183 | #if defined (__cplusplus) |
184 | extern "C" { | |
185 | #endif | |
28f540f4 RM |
186 | void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t)); |
187 | ||
188 | void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr)); | |
189 | void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
190 | void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
191 | void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
6b628d36 RM |
192 | void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t)); |
193 | void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
194 | unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
195 | void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
196 | unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); | |
197 | void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
198 | unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
199 | unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); | |
28f540f4 RM |
200 | void mpz_clear _PROTO ((mpz_ptr)); |
201 | void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int)); | |
202 | int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr)); | |
203 | int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int)); | |
204 | int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int)); | |
205 | void mpz_com _PROTO ((mpz_ptr, mpz_srcptr)); | |
6b628d36 | 206 | void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
28f540f4 | 207 | void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int)); |
6b628d36 RM |
208 | void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
209 | void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
210 | unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
211 | void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
212 | unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); | |
213 | void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
214 | void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
215 | unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
216 | unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); | |
28f540f4 RM |
217 | void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
218 | unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
219 | void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
220 | /* signed */ long int mpz_get_si _PROTO ((mpz_srcptr)); | |
221 | char *mpz_get_str _PROTO ((char *, int, mpz_srcptr)); | |
222 | unsigned long int mpz_get_ui _PROTO ((mpz_srcptr)); | |
b928942e RM |
223 | mp_limb_t mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t)); |
224 | unsigned long int mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr)); | |
28f540f4 | 225 | void mpz_init _PROTO ((mpz_ptr)); |
8f5ca04b | 226 | #ifdef _GMP_H_HAVE_FILE |
6b628d36 RM |
227 | size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *)); |
228 | size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *)); | |
229 | size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int)); | |
28f540f4 | 230 | #endif |
28f540f4 | 231 | void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr)); |
b928942e | 232 | void mpz_init_set_d _PROTO ((mpz_ptr, double)); |
28f540f4 RM |
233 | void mpz_init_set_si _PROTO ((mpz_ptr, signed long int)); |
234 | int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int)); | |
235 | void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int)); | |
6b628d36 RM |
236 | int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
237 | void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
238 | int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr)); | |
239 | int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr)); | |
240 | void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
28f540f4 RM |
241 | void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
242 | void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
243 | void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
244 | void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr)); | |
8f5ca04b | 245 | #ifdef _GMP_H_HAVE_FILE |
6b628d36 RM |
246 | size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr)); |
247 | size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr)); | |
248 | size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr)); | |
28f540f4 RM |
249 | #endif |
250 | int mpz_perfect_square_p _PROTO ((mpz_srcptr)); | |
b928942e | 251 | unsigned long int mpz_popcount _PROTO ((mpz_srcptr)); |
28f540f4 RM |
252 | void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); |
253 | void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); | |
254 | void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); | |
255 | int mpz_probab_prime_p _PROTO ((mpz_srcptr, int)); | |
256 | void mpz_random _PROTO ((mpz_ptr, mp_size_t)); | |
257 | void mpz_random2 _PROTO ((mpz_ptr, mp_size_t)); | |
b928942e RM |
258 | unsigned long int mpz_scan0 _PROTO ((mpz_srcptr, unsigned long int)); |
259 | unsigned long int mpz_scan1 _PROTO ((mpz_srcptr, unsigned long int)); | |
28f540f4 | 260 | void mpz_set _PROTO ((mpz_ptr, mpz_srcptr)); |
6b628d36 | 261 | void mpz_set_d _PROTO ((mpz_ptr, double)); |
28f540f4 RM |
262 | void mpz_set_si _PROTO ((mpz_ptr, signed long int)); |
263 | int mpz_set_str _PROTO ((mpz_ptr, const char *, int)); | |
264 | void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int)); | |
6b628d36 | 265 | void mpz_setbit _PROTO ((mpz_ptr, unsigned long int)); |
28f540f4 RM |
266 | size_t mpz_size _PROTO ((mpz_srcptr)); |
267 | size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int)); | |
268 | void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr)); | |
269 | void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); | |
270 | void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
271 | void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
6b628d36 RM |
272 | void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); |
273 | void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
274 | void mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
275 | void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
276 | void mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); | |
277 | void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); | |
278 | void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
279 | void mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); | |
28f540f4 RM |
280 | void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int)); |
281 | ||
28f540f4 RM |
282 | /**************** Rational (i.e. Q) routines. ****************/ |
283 | ||
284 | void mpq_init _PROTO ((mpq_ptr)); | |
285 | void mpq_clear _PROTO ((mpq_ptr)); | |
286 | void mpq_set _PROTO ((mpq_ptr, mpq_srcptr)); | |
287 | void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int)); | |
288 | void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int)); | |
289 | void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); | |
290 | void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); | |
291 | void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); | |
292 | void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); | |
293 | void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr)); | |
294 | int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr)); | |
6b628d36 | 295 | int mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int)); |
28f540f4 RM |
296 | void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr)); |
297 | void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr)); | |
298 | void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr)); | |
299 | void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr)); | |
300 | void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr)); | |
6b628d36 RM |
301 | double mpq_get_d _PROTO ((mpq_srcptr)); |
302 | void mpq_canonicalize _PROTO ((mpq_ptr)); | |
28f540f4 RM |
303 | |
304 | /**************** Float (i.e. F) routines. ****************/ | |
305 | ||
306 | void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr)); | |
307 | void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); | |
308 | void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
309 | void mpf_clear _PROTO ((mpf_ptr)); | |
310 | int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr)); | |
6b628d36 | 311 | int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int)); |
28f540f4 RM |
312 | int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int)); |
313 | void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); | |
314 | void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
315 | void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
316 | void mpf_dump _PROTO ((mpf_srcptr)); | |
b928942e RM |
317 | int mpf_eq _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)); |
318 | unsigned long int mpf_get_prec _PROTO ((mpf_srcptr)); | |
28f540f4 RM |
319 | char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); |
320 | void mpf_init _PROTO ((mpf_ptr)); | |
b928942e | 321 | void mpf_init2 _PROTO ((mpf_ptr, unsigned long int)); |
8f5ca04b | 322 | #ifdef _GMP_H_HAVE_FILE |
6b628d36 | 323 | size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int)); |
28f540f4 RM |
324 | #endif |
325 | void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr)); | |
326 | void mpf_init_set_d _PROTO ((mpf_ptr, double)); | |
6b628d36 | 327 | void mpf_init_set_si _PROTO ((mpf_ptr, signed long int)); |
28f540f4 RM |
328 | int mpf_init_set_str _PROTO ((mpf_ptr, char *, int)); |
329 | void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int)); | |
330 | void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); | |
331 | void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
332 | void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
333 | void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr)); | |
8f5ca04b | 334 | #ifdef _GMP_H_HAVE_FILE |
6b628d36 | 335 | size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr)); |
28f540f4 | 336 | #endif |
b928942e RM |
337 | void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); |
338 | void mpf_reldiff _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); | |
28f540f4 RM |
339 | void mpf_set _PROTO ((mpf_ptr, mpf_srcptr)); |
340 | void mpf_set_d _PROTO ((mpf_ptr, double)); | |
b928942e RM |
341 | void mpf_set_default_prec _PROTO ((unsigned long int)); |
342 | void mpf_set_prec _PROTO ((mpf_ptr, unsigned long int)); | |
343 | void mpf_set_prec_raw _PROTO ((mpf_ptr, unsigned long int)); | |
6b628d36 | 344 | void mpf_set_si _PROTO ((mpf_ptr, signed long int)); |
28f540f4 RM |
345 | int mpf_set_str _PROTO ((mpf_ptr, const char *, int)); |
346 | void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int)); | |
347 | size_t mpf_size _PROTO ((mpf_srcptr)); | |
348 | void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr)); | |
349 | void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int)); | |
350 | void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); | |
351 | void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); | |
352 | void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); | |
6b628d36 RM |
353 | void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); |
354 | #if defined (__cplusplus) | |
355 | } | |
356 | #endif | |
28f540f4 RM |
357 | /************ Low level positive-integer (i.e. N) routines. ************/ |
358 | ||
359 | /* This is ugly, but we need to make usr calls reach the prefixed function. */ | |
6b628d36 RM |
360 | #define mpn_add __MPN(add) |
361 | #define mpn_add_1 __MPN(add_1) | |
362 | #define mpn_add_n __MPN(add_n) | |
363 | #define mpn_addmul_1 __MPN(addmul_1) | |
364 | #define mpn_bdivmod __MPN(bdivmod) | |
365 | #define mpn_cmp __MPN(cmp) | |
366 | #define mpn_divmod_1 __MPN(divmod_1) | |
367 | #define mpn_divrem __MPN(divrem) | |
368 | #define mpn_divrem_1 __MPN(divrem_1) | |
369 | #define mpn_dump __MPN(dump) | |
370 | #define mpn_gcd __MPN(gcd) | |
371 | #define mpn_gcd_1 __MPN(gcd_1) | |
372 | #define mpn_gcdext __MPN(gcdext) | |
373 | #define mpn_get_str __MPN(get_str) | |
374 | #define mpn_hamdist __MPN(hamdist) | |
375 | #define mpn_lshift __MPN(lshift) | |
376 | #define mpn_mod_1 __MPN(mod_1) | |
377 | #define mpn_mul __MPN(mul) | |
378 | #define mpn_mul_1 __MPN(mul_1) | |
379 | #define mpn_mul_n __MPN(mul_n) | |
380 | #define mpn_perfect_square_p __MPN(perfect_square_p) | |
381 | #define mpn_popcount __MPN(popcount) | |
382 | #define mpn_preinv_mod_1 __MPN(preinv_mod_1) | |
383 | #define mpn_random2 __MPN(random2) | |
384 | #define mpn_rshift __MPN(rshift) | |
385 | #define mpn_scan0 __MPN(scan0) | |
386 | #define mpn_scan1 __MPN(scan1) | |
387 | #define mpn_set_str __MPN(set_str) | |
388 | #define mpn_sqrtrem __MPN(sqrtrem) | |
389 | #define mpn_sub __MPN(sub) | |
390 | #define mpn_sub_1 __MPN(sub_1) | |
391 | #define mpn_sub_n __MPN(sub_n) | |
392 | #define mpn_submul_1 __MPN(submul_1) | |
393 | #define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv) | |
394 | ||
395 | #if defined (__cplusplus) | |
396 | extern "C" { | |
397 | #endif | |
8d291eab AZ |
398 | mp_limb_t mpn_add _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)) _ATTRIBUTE_HIDDEN; |
399 | mp_limb_t mpn_add_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
400 | mp_limb_t mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
401 | mp_limb_t mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
402 | mp_limb_t mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int)) _ATTRIBUTE_HIDDEN; | |
403 | int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
404 | mp_limb_t mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
728ada50 | 405 | mp_limb_t mpn_divrem _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; |
8d291eab AZ |
406 | mp_limb_t mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; |
407 | void mpn_dump _PROTO ((mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
408 | mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
409 | mp_limb_t mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
410 | mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
411 | size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
412 | unsigned long int mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
413 | mp_limb_t mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)) _ATTRIBUTE_HIDDEN; | |
414 | mp_limb_t mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
415 | mp_limb_t mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
416 | mp_limb_t mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
417 | void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
418 | int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
419 | unsigned long int mpn_popcount _PROTO ((mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
420 | mp_limb_t mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
421 | void mpn_random2 _PROTO ((mp_ptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
422 | mp_limb_t mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)) _ATTRIBUTE_HIDDEN; | |
423 | unsigned long int mpn_scan0 _PROTO ((mp_srcptr, unsigned long int)) _ATTRIBUTE_HIDDEN; | |
424 | unsigned long int mpn_scan1 _PROTO ((mp_srcptr, unsigned long int)) _ATTRIBUTE_HIDDEN; | |
425 | mp_size_t mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int)) _ATTRIBUTE_HIDDEN; | |
426 | mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
427 | mp_limb_t mpn_sub _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)) _ATTRIBUTE_HIDDEN; | |
428 | mp_limb_t mpn_sub_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
429 | mp_limb_t mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)) _ATTRIBUTE_HIDDEN; | |
430 | mp_limb_t mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) _ATTRIBUTE_HIDDEN; | |
6b628d36 RM |
431 | #if defined (__cplusplus) |
432 | } | |
433 | #endif | |
434 | ||
435 | #if defined (__GNUC__) || defined (_FORCE_INLINES) | |
b928942e | 436 | _EXTERN_INLINE mp_limb_t |
6b628d36 RM |
437 | #if defined (__STDC__) || defined (__cplusplus) |
438 | mpn_add_1 (register mp_ptr res_ptr, | |
439 | register mp_srcptr s1_ptr, | |
440 | register mp_size_t s1_size, | |
b928942e | 441 | register mp_limb_t s2_limb) |
28f540f4 | 442 | #else |
6b628d36 | 443 | mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb) |
28f540f4 RM |
444 | register mp_ptr res_ptr; |
445 | register mp_srcptr s1_ptr; | |
446 | register mp_size_t s1_size; | |
b928942e | 447 | register mp_limb_t s2_limb; |
28f540f4 RM |
448 | #endif |
449 | { | |
b928942e | 450 | register mp_limb_t x; |
28f540f4 RM |
451 | |
452 | x = *s1_ptr++; | |
453 | s2_limb = x + s2_limb; | |
454 | *res_ptr++ = s2_limb; | |
455 | if (s2_limb < x) | |
456 | { | |
457 | while (--s1_size != 0) | |
458 | { | |
459 | x = *s1_ptr++ + 1; | |
460 | *res_ptr++ = x; | |
461 | if (x != 0) | |
462 | goto fin; | |
463 | } | |
464 | ||
465 | return 1; | |
466 | } | |
467 | ||
468 | fin: | |
469 | if (res_ptr != s1_ptr) | |
470 | { | |
471 | mp_size_t i; | |
472 | for (i = 0; i < s1_size - 1; i++) | |
473 | res_ptr[i] = s1_ptr[i]; | |
474 | } | |
475 | return 0; | |
476 | } | |
477 | ||
b928942e | 478 | _EXTERN_INLINE mp_limb_t |
6b628d36 RM |
479 | #if defined (__STDC__) || defined (__cplusplus) |
480 | mpn_add (register mp_ptr res_ptr, | |
481 | register mp_srcptr s1_ptr, | |
482 | register mp_size_t s1_size, | |
483 | register mp_srcptr s2_ptr, | |
484 | register mp_size_t s2_size) | |
28f540f4 | 485 | #else |
6b628d36 | 486 | mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) |
28f540f4 RM |
487 | register mp_ptr res_ptr; |
488 | register mp_srcptr s1_ptr; | |
489 | register mp_size_t s1_size; | |
490 | register mp_srcptr s2_ptr; | |
491 | register mp_size_t s2_size; | |
492 | #endif | |
493 | { | |
b928942e | 494 | mp_limb_t cy_limb = 0; |
28f540f4 RM |
495 | |
496 | if (s2_size != 0) | |
6b628d36 | 497 | cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size); |
28f540f4 RM |
498 | |
499 | if (s1_size - s2_size != 0) | |
6b628d36 RM |
500 | cy_limb = mpn_add_1 (res_ptr + s2_size, |
501 | s1_ptr + s2_size, | |
502 | s1_size - s2_size, | |
503 | cy_limb); | |
28f540f4 RM |
504 | return cy_limb; |
505 | } | |
506 | ||
b928942e | 507 | _EXTERN_INLINE mp_limb_t |
6b628d36 RM |
508 | #if defined (__STDC__) || defined (__cplusplus) |
509 | mpn_sub_1 (register mp_ptr res_ptr, | |
510 | register mp_srcptr s1_ptr, | |
511 | register mp_size_t s1_size, | |
b928942e | 512 | register mp_limb_t s2_limb) |
28f540f4 | 513 | #else |
6b628d36 | 514 | mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb) |
28f540f4 RM |
515 | register mp_ptr res_ptr; |
516 | register mp_srcptr s1_ptr; | |
517 | register mp_size_t s1_size; | |
b928942e | 518 | register mp_limb_t s2_limb; |
28f540f4 RM |
519 | #endif |
520 | { | |
b928942e | 521 | register mp_limb_t x; |
28f540f4 RM |
522 | |
523 | x = *s1_ptr++; | |
524 | s2_limb = x - s2_limb; | |
525 | *res_ptr++ = s2_limb; | |
526 | if (s2_limb > x) | |
527 | { | |
528 | while (--s1_size != 0) | |
529 | { | |
530 | x = *s1_ptr++; | |
531 | *res_ptr++ = x - 1; | |
532 | if (x != 0) | |
533 | goto fin; | |
534 | } | |
535 | ||
536 | return 1; | |
537 | } | |
538 | ||
539 | fin: | |
540 | if (res_ptr != s1_ptr) | |
541 | { | |
542 | mp_size_t i; | |
543 | for (i = 0; i < s1_size - 1; i++) | |
544 | res_ptr[i] = s1_ptr[i]; | |
545 | } | |
546 | return 0; | |
547 | } | |
548 | ||
b928942e | 549 | _EXTERN_INLINE mp_limb_t |
6b628d36 RM |
550 | #if defined (__STDC__) || defined (__cplusplus) |
551 | mpn_sub (register mp_ptr res_ptr, | |
552 | register mp_srcptr s1_ptr, | |
553 | register mp_size_t s1_size, | |
554 | register mp_srcptr s2_ptr, | |
555 | register mp_size_t s2_size) | |
28f540f4 | 556 | #else |
6b628d36 | 557 | mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) |
28f540f4 RM |
558 | register mp_ptr res_ptr; |
559 | register mp_srcptr s1_ptr; | |
560 | register mp_size_t s1_size; | |
561 | register mp_srcptr s2_ptr; | |
562 | register mp_size_t s2_size; | |
563 | #endif | |
564 | { | |
b928942e | 565 | mp_limb_t cy_limb = 0; |
28f540f4 RM |
566 | |
567 | if (s2_size != 0) | |
6b628d36 | 568 | cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size); |
28f540f4 RM |
569 | |
570 | if (s1_size - s2_size != 0) | |
6b628d36 RM |
571 | cy_limb = mpn_sub_1 (res_ptr + s2_size, |
572 | s1_ptr + s2_size, | |
573 | s1_size - s2_size, | |
574 | cy_limb); | |
28f540f4 RM |
575 | return cy_limb; |
576 | } | |
6b628d36 | 577 | #endif /* __GNUC__ */ |
28f540f4 | 578 | |
6b628d36 | 579 | /* Allow faster testing for negative, zero, and positive. */ |
b928942e RM |
580 | #define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) |
581 | #define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) | |
582 | #define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) | |
6b628d36 RM |
583 | |
584 | /* Allow direct user access to numerator and denominator of a mpq_t object. */ | |
585 | #define mpq_numref(Q) (&((Q)->_mp_num)) | |
586 | #define mpq_denref(Q) (&((Q)->_mp_den)) | |
587 | ||
588 | /* When using GCC, optimize certain common comparisons. */ | |
589 | #if defined (__GNUC__) | |
590 | #define mpz_cmp_ui(Z,UI) \ | |
591 | (__builtin_constant_p (UI) && (UI) == 0 \ | |
b928942e | 592 | ? mpz_sgn (Z) : mpz_cmp_ui (Z,UI)) |
6b628d36 | 593 | #define mpz_cmp_si(Z,UI) \ |
b928942e | 594 | (__builtin_constant_p (UI) && (UI) == 0 ? mpz_sgn (Z) \ |
6b628d36 RM |
595 | : __builtin_constant_p (UI) && (UI) > 0 ? mpz_cmp_ui (Z,UI) \ |
596 | : mpz_cmp_si (Z,UI)) | |
597 | #define mpq_cmp_ui(Q,NUI,DUI) \ | |
598 | (__builtin_constant_p (NUI) && (NUI) == 0 \ | |
b928942e | 599 | ? mpq_sgn (Q) : mpq_cmp_ui (Q,NUI,DUI)) |
28f540f4 | 600 | #endif |
28f540f4 | 601 | |
6b628d36 RM |
602 | #define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize) |
603 | #if 0 | |
604 | #define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb) | |
605 | #endif | |
28f540f4 | 606 | |
6b628d36 | 607 | /* Compatibility with GMP 1. */ |
28f540f4 RM |
608 | #define mpz_mdiv mpz_fdiv_q |
609 | #define mpz_mdivmod mpz_fdiv_qr | |
610 | #define mpz_mmod mpz_fdiv_r | |
611 | #define mpz_mdiv_ui mpz_fdiv_q_ui | |
612 | #define mpz_mdivmod_ui(q,r,n,d) \ | |
613 | ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) | |
614 | #define mpz_mmod_ui(r,n,d) \ | |
615 | ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) | |
28f540f4 RM |
616 | |
617 | /* Useful synonyms, but not quite compatible with GMP 1. */ | |
618 | #define mpz_div mpz_fdiv_q | |
619 | #define mpz_divmod mpz_fdiv_qr | |
28f540f4 RM |
620 | #define mpz_div_ui mpz_fdiv_q_ui |
621 | #define mpz_divmod_ui mpz_fdiv_qr_ui | |
622 | #define mpz_mod_ui mpz_fdiv_r_ui | |
6b628d36 RM |
623 | #define mpz_div_2exp mpz_fdiv_q_2exp |
624 | #define mpz_mod_2exp mpz_fdiv_r_2exp | |
28f540f4 | 625 | |
28f540f4 | 626 | #define __GNU_MP_VERSION 2 |
b928942e | 627 | #define __GNU_MP_VERSION_MINOR 0 |
28f540f4 RM |
628 | #define __GMP_H__ |
629 | #endif /* __GMP_H__ */ |