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