1 /* mini-gmp, a minimalistic implementation of a GNU GMP subset.
3 Copyright 2011, 2012, 2013 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
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
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
20 /* About mini-gmp: This is a minimal implementation of a subset of the
21 GMP interface. It is intended for inclusion into applications which
22 have modest bignums needs, as a fallback when the real GMP library
25 This file defines the public interface. */
27 #ifndef __MINI_GMP_H__
28 #define __MINI_GMP_H__
33 #if defined (__cplusplus)
37 void mp_set_memory_functions (void *(*) (size_t),
38 void *(*) (void *, size_t, size_t),
39 void (*) (void *, size_t));
41 void mp_get_memory_functions (void *(**) (size_t),
42 void *(**) (void *, size_t, size_t),
43 void (**) (void *, size_t));
45 typedef unsigned long mp_limb_t
;
46 typedef long mp_size_t
;
47 typedef unsigned long mp_bitcnt_t
;
49 typedef mp_limb_t
*mp_ptr
;
50 typedef const mp_limb_t
*mp_srcptr
;
54 int _mp_alloc
; /* Number of *limbs* allocated and pointed
55 to by the _mp_d field. */
56 int _mp_size
; /* abs(_mp_size) is the number of limbs the
57 last field points to. If _mp_size is
58 negative this is a negative number. */
59 mp_limb_t
*_mp_d
; /* Pointer to the limbs. */
62 typedef __mpz_struct mpz_t
[1];
64 typedef __mpz_struct
*mpz_ptr
;
65 typedef const __mpz_struct
*mpz_srcptr
;
67 void mpn_copyi (mp_ptr
, mp_srcptr
, mp_size_t
);
68 void mpn_copyd (mp_ptr
, mp_srcptr
, mp_size_t
);
70 int mpn_cmp (mp_srcptr
, mp_srcptr
, mp_size_t
);
72 mp_limb_t
mpn_add_1 (mp_ptr
, mp_srcptr
, mp_size_t
, mp_limb_t
);
73 mp_limb_t
mpn_add_n (mp_ptr
, mp_srcptr
, mp_srcptr
, mp_size_t
);
74 mp_limb_t
mpn_add (mp_ptr
, mp_srcptr
, mp_size_t
, mp_srcptr
, mp_size_t
);
76 mp_limb_t
mpn_sub_1 (mp_ptr
, mp_srcptr
, mp_size_t
, mp_limb_t
);
77 mp_limb_t
mpn_sub_n (mp_ptr
, mp_srcptr
, mp_srcptr
, mp_size_t
);
78 mp_limb_t
mpn_sub (mp_ptr
, mp_srcptr
, mp_size_t
, mp_srcptr
, mp_size_t
);
80 mp_limb_t
mpn_mul_1 (mp_ptr
, mp_srcptr
, mp_size_t
, mp_limb_t
);
81 mp_limb_t
mpn_addmul_1 (mp_ptr
, mp_srcptr
, mp_size_t
, mp_limb_t
);
82 mp_limb_t
mpn_submul_1 (mp_ptr
, mp_srcptr
, mp_size_t
, mp_limb_t
);
84 mp_limb_t
mpn_mul (mp_ptr
, mp_srcptr
, mp_size_t
, mp_srcptr
, mp_size_t
);
85 void mpn_mul_n (mp_ptr
, mp_srcptr
, mp_srcptr
, mp_size_t
);
86 void mpn_sqr (mp_ptr
, mp_srcptr
, mp_size_t
);
88 mp_limb_t
mpn_lshift (mp_ptr
, mp_srcptr
, mp_size_t
, unsigned int);
89 mp_limb_t
mpn_rshift (mp_ptr
, mp_srcptr
, mp_size_t
, unsigned int);
91 mp_limb_t
mpn_invert_3by2 (mp_limb_t
, mp_limb_t
);
92 #define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
94 size_t mpn_get_str (unsigned char *, int, mp_ptr
, mp_size_t
);
95 mp_size_t
mpn_set_str (mp_ptr
, const unsigned char *, size_t, int);
97 void mpz_init (mpz_t
);
98 void mpz_init2 (mpz_t
, mp_bitcnt_t
);
99 void mpz_clear (mpz_t
);
101 #define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
102 #define mpz_even_p(z) (! mpz_odd_p (z))
104 int mpz_sgn (const mpz_t
);
105 int mpz_cmp_si (const mpz_t
, long);
106 int mpz_cmp_ui (const mpz_t
, unsigned long);
107 int mpz_cmp (const mpz_t
, const mpz_t
);
108 int mpz_cmpabs_ui (const mpz_t
, unsigned long);
109 int mpz_cmpabs (const mpz_t
, const mpz_t
);
110 int mpz_cmp_d (const mpz_t
, double);
111 int mpz_cmpabs_d (const mpz_t
, double);
113 void mpz_abs (mpz_t
, const mpz_t
);
114 void mpz_neg (mpz_t
, const mpz_t
);
115 void mpz_swap (mpz_t
, mpz_t
);
117 void mpz_add_ui (mpz_t
, const mpz_t
, unsigned long);
118 void mpz_add (mpz_t
, const mpz_t
, const mpz_t
);
119 void mpz_sub_ui (mpz_t
, const mpz_t
, unsigned long);
120 void mpz_ui_sub (mpz_t
, unsigned long, const mpz_t
);
121 void mpz_sub (mpz_t
, const mpz_t
, const mpz_t
);
123 void mpz_mul_si (mpz_t
, const mpz_t
, long int);
124 void mpz_mul_ui (mpz_t
, const mpz_t
, unsigned long int);
125 void mpz_mul (mpz_t
, const mpz_t
, const mpz_t
);
126 void mpz_mul_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
128 void mpz_cdiv_qr (mpz_t
, mpz_t
, const mpz_t
, const mpz_t
);
129 void mpz_fdiv_qr (mpz_t
, mpz_t
, const mpz_t
, const mpz_t
);
130 void mpz_tdiv_qr (mpz_t
, mpz_t
, const mpz_t
, const mpz_t
);
131 void mpz_cdiv_q (mpz_t
, const mpz_t
, const mpz_t
);
132 void mpz_fdiv_q (mpz_t
, const mpz_t
, const mpz_t
);
133 void mpz_tdiv_q (mpz_t
, const mpz_t
, const mpz_t
);
134 void mpz_cdiv_r (mpz_t
, const mpz_t
, const mpz_t
);
135 void mpz_fdiv_r (mpz_t
, const mpz_t
, const mpz_t
);
136 void mpz_tdiv_r (mpz_t
, const mpz_t
, const mpz_t
);
138 void mpz_cdiv_q_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
139 void mpz_fdiv_q_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
140 void mpz_tdiv_q_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
141 void mpz_cdiv_r_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
142 void mpz_fdiv_r_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
143 void mpz_tdiv_r_2exp (mpz_t
, const mpz_t
, mp_bitcnt_t
);
145 void mpz_mod (mpz_t
, const mpz_t
, const mpz_t
);
147 void mpz_divexact (mpz_t
, const mpz_t
, const mpz_t
);
149 int mpz_divisible_p (const mpz_t
, const mpz_t
);
151 unsigned long mpz_cdiv_qr_ui (mpz_t
, mpz_t
, const mpz_t
, unsigned long);
152 unsigned long mpz_fdiv_qr_ui (mpz_t
, mpz_t
, const mpz_t
, unsigned long);
153 unsigned long mpz_tdiv_qr_ui (mpz_t
, mpz_t
, const mpz_t
, unsigned long);
154 unsigned long mpz_cdiv_q_ui (mpz_t
, const mpz_t
, unsigned long);
155 unsigned long mpz_fdiv_q_ui (mpz_t
, const mpz_t
, unsigned long);
156 unsigned long mpz_tdiv_q_ui (mpz_t
, const mpz_t
, unsigned long);
157 unsigned long mpz_cdiv_r_ui (mpz_t
, const mpz_t
, unsigned long);
158 unsigned long mpz_fdiv_r_ui (mpz_t
, const mpz_t
, unsigned long);
159 unsigned long mpz_tdiv_r_ui (mpz_t
, const mpz_t
, unsigned long);
160 unsigned long mpz_cdiv_ui (const mpz_t
, unsigned long);
161 unsigned long mpz_fdiv_ui (const mpz_t
, unsigned long);
162 unsigned long mpz_tdiv_ui (const mpz_t
, unsigned long);
164 unsigned long mpz_mod_ui (mpz_t
, const mpz_t
, unsigned long);
166 void mpz_divexact_ui (mpz_t
, const mpz_t
, unsigned long);
168 int mpz_divisible_ui_p (const mpz_t
, unsigned long);
170 unsigned long mpz_gcd_ui (mpz_t
, const mpz_t
, unsigned long);
171 void mpz_gcd (mpz_t
, const mpz_t
, const mpz_t
);
172 void mpz_gcdext (mpz_t
, mpz_t
, mpz_t
, const mpz_t
, const mpz_t
);
173 void mpz_lcm_ui (mpz_t
, const mpz_t
, unsigned long);
174 void mpz_lcm (mpz_t
, const mpz_t
, const mpz_t
);
175 int mpz_invert (mpz_t
, const mpz_t
, const mpz_t
);
177 void mpz_sqrtrem (mpz_t
, mpz_t
, const mpz_t
);
178 void mpz_sqrt (mpz_t
, const mpz_t
);
180 void mpz_pow_ui (mpz_t
, const mpz_t
, unsigned long);
181 void mpz_ui_pow_ui (mpz_t
, unsigned long, unsigned long);
182 void mpz_powm (mpz_t
, const mpz_t
, const mpz_t
, const mpz_t
);
183 void mpz_powm_ui (mpz_t
, const mpz_t
, unsigned long, const mpz_t
);
185 void mpz_rootrem (mpz_t
, mpz_t
, const mpz_t
, unsigned long);
186 int mpz_root (mpz_t
, const mpz_t
, unsigned long);
188 void mpz_fac_ui (mpz_t
, unsigned long);
189 void mpz_bin_uiui (mpz_t
, unsigned long, unsigned long);
191 int mpz_tstbit (const mpz_t
, mp_bitcnt_t
);
192 void mpz_setbit (mpz_t
, mp_bitcnt_t
);
193 void mpz_clrbit (mpz_t
, mp_bitcnt_t
);
194 void mpz_combit (mpz_t
, mp_bitcnt_t
);
196 void mpz_com (mpz_t
, const mpz_t
);
197 void mpz_and (mpz_t
, const mpz_t
, const mpz_t
);
198 void mpz_ior (mpz_t
, const mpz_t
, const mpz_t
);
199 void mpz_xor (mpz_t
, const mpz_t
, const mpz_t
);
201 mp_bitcnt_t
mpz_popcount (const mpz_t
);
202 mp_bitcnt_t
mpz_hamdist (const mpz_t
, const mpz_t
);
203 mp_bitcnt_t
mpz_scan0 (const mpz_t
, mp_bitcnt_t
);
204 mp_bitcnt_t
mpz_scan1 (const mpz_t
, mp_bitcnt_t
);
206 int mpz_fits_slong_p (const mpz_t
);
207 int mpz_fits_ulong_p (const mpz_t
);
208 long int mpz_get_si (const mpz_t
);
209 unsigned long int mpz_get_ui (const mpz_t
);
210 double mpz_get_d (const mpz_t
);
211 size_t mpz_size (const mpz_t
);
212 mp_limb_t
mpz_getlimbn (const mpz_t
, mp_size_t
);
214 void mpz_set_si (mpz_t
, signed long int);
215 void mpz_set_ui (mpz_t
, unsigned long int);
216 void mpz_set (mpz_t
, const mpz_t
);
217 void mpz_set_d (mpz_t
, double);
219 void mpz_init_set_si (mpz_t
, signed long int);
220 void mpz_init_set_ui (mpz_t
, unsigned long int);
221 void mpz_init_set (mpz_t
, const mpz_t
);
222 void mpz_init_set_d (mpz_t
, double);
224 size_t mpz_sizeinbase (const mpz_t
, int);
225 char *mpz_get_str (char *, int, const mpz_t
);
226 int mpz_set_str (mpz_t
, const char *, int);
227 int mpz_init_set_str (mpz_t
, const char *, int);
229 /* This long list taken from gmp.h. */
230 /* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4,
231 <iostream> defines EOF but not FILE. */
233 || defined (H_STDIO) \
234 || defined (_H_STDIO) /* AIX */ \
235 || defined (_STDIO_H) /* glibc, Sun, SCO */ \
236 || defined (_STDIO_H_) /* BSD, OSF */ \
237 || defined (__STDIO_H) /* Borland */ \
238 || defined (__STDIO_H__) /* IRIX */ \
239 || defined (_STDIO_INCLUDED) /* HPUX */ \
240 || defined (__dj_include_stdio_h_) /* DJGPP */ \
241 || defined (_FILE_DEFINED) /* Microsoft */ \
242 || defined (__STDIO__) /* Apple MPW MrC */ \
243 || defined (_MSL_STDIO_H) /* Metrowerks */ \
244 || defined (_STDIO_H_INCLUDED) /* QNX4 */ \
245 || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \
246 || defined (__STDIO_LOADED) /* VMS */
247 size_t mpz_out_str (FILE *, int, const mpz_t
);
250 void mpz_import (mpz_t
, size_t, int, size_t, int, size_t, const void *);
251 void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t
);
253 #if defined (__cplusplus)
256 #endif /* __MINI_GMP_H__ */