1/* mini-gmp, a minimalistic implementation of a GNU GMP subset. 2 3Copyright 2011-2015, 2017, 2019-2020 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of either: 9 10 * the GNU Lesser General Public License as published by the Free 11 Software Foundation; either version 3 of the License, or (at your 12 option) any later version. 13 14or 15 16 * the GNU General Public License as published by the Free Software 17 Foundation; either version 2 of the License, or (at your option) any 18 later version. 19 20or both in parallel, as here. 21 22The GNU MP Library is distributed in the hope that it will be useful, but 23WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25for more details. 26 27You should have received copies of the GNU General Public License and the 28GNU Lesser General Public License along with the GNU MP Library. If not, 29see https://www.gnu.org/licenses/. */ 30 31/* About mini-gmp: This is a minimal implementation of a subset of the 32 GMP interface. It is intended for inclusion into applications which 33 have modest bignums needs, as a fallback when the real GMP library 34 is not installed. 35 36 This file defines the public interface. */ 37 38#ifndef __MINI_GMP_H__ 39#define __MINI_GMP_H__ 40 41/* For size_t */ 42#include <stddef.h> 43 44#if defined (__cplusplus) 45extern "C" { 46#endif 47 48void mp_set_memory_functions (void *(*) (size_t), 49 void *(*) (void *, size_t, size_t), 50 void (*) (void *, size_t)); 51 52void mp_get_memory_functions (void *(**) (size_t), 53 void *(**) (void *, size_t, size_t), 54 void (**) (void *, size_t)); 55 56#ifndef MINI_GMP_LIMB_TYPE 57#define MINI_GMP_LIMB_TYPE long 58#endif 59 60typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t; 61typedef long mp_size_t; 62typedef unsigned long mp_bitcnt_t; 63 64typedef mp_limb_t *mp_ptr; 65typedef const mp_limb_t *mp_srcptr; 66 67typedef struct 68{ 69 int _mp_alloc; /* Number of *limbs* allocated and pointed 70 to by the _mp_d field. */ 71 int _mp_size; /* abs(_mp_size) is the number of limbs the 72 last field points to. If _mp_size is 73 negative this is a negative number. */ 74 mp_limb_t *_mp_d; /* Pointer to the limbs. */ 75} __mpz_struct; 76 77typedef __mpz_struct mpz_t[1]; 78 79typedef __mpz_struct *mpz_ptr; 80typedef const __mpz_struct *mpz_srcptr; 81 82extern const int mp_bits_per_limb; 83 84void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t); 85void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t); 86void mpn_zero (mp_ptr, mp_size_t); 87 88int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t); 89int mpn_zero_p (mp_srcptr, mp_size_t); 90 91mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 92mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 93mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 94 95mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 96mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 97mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 98 99mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 100mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 101mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 102 103mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 104void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 105void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t); 106int mpn_perfect_square_p (mp_srcptr, mp_size_t); 107mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t); 108 109mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); 110mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); 111 112mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t); 113mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t); 114 115void mpn_com (mp_ptr, mp_srcptr, mp_size_t); 116mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t); 117 118mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t); 119 120mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t); 121#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0) 122 123size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); 124mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int); 125 126void mpz_init (mpz_t); 127void mpz_init2 (mpz_t, mp_bitcnt_t); 128void mpz_clear (mpz_t); 129 130#define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0]) 131#define mpz_even_p(z) (! mpz_odd_p (z)) 132 133int mpz_sgn (const mpz_t); 134int mpz_cmp_si (const mpz_t, long); 135int mpz_cmp_ui (const mpz_t, unsigned long); 136int mpz_cmp (const mpz_t, const mpz_t); 137int mpz_cmpabs_ui (const mpz_t, unsigned long); 138int mpz_cmpabs (const mpz_t, const mpz_t); 139int mpz_cmp_d (const mpz_t, double); 140int mpz_cmpabs_d (const mpz_t, double); 141 142void mpz_abs (mpz_t, const mpz_t); 143void mpz_neg (mpz_t, const mpz_t); 144void mpz_swap (mpz_t, mpz_t); 145 146void mpz_add_ui (mpz_t, const mpz_t, unsigned long); 147void mpz_add (mpz_t, const mpz_t, const mpz_t); 148void mpz_sub_ui (mpz_t, const mpz_t, unsigned long); 149void mpz_ui_sub (mpz_t, unsigned long, const mpz_t); 150void mpz_sub (mpz_t, const mpz_t, const mpz_t); 151 152void mpz_mul_si (mpz_t, const mpz_t, long int); 153void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int); 154void mpz_mul (mpz_t, const mpz_t, const mpz_t); 155void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 156void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int); 157void mpz_addmul (mpz_t, const mpz_t, const mpz_t); 158void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int); 159void mpz_submul (mpz_t, const mpz_t, const mpz_t); 160 161void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); 162void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); 163void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); 164void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t); 165void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t); 166void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t); 167void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t); 168void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t); 169void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t); 170 171void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 172void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 173void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 174void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 175void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 176void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); 177 178void mpz_mod (mpz_t, const mpz_t, const mpz_t); 179 180void mpz_divexact (mpz_t, const mpz_t, const mpz_t); 181 182int mpz_divisible_p (const mpz_t, const mpz_t); 183int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t); 184 185unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); 186unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); 187unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); 188unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long); 189unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long); 190unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long); 191unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long); 192unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long); 193unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long); 194unsigned long mpz_cdiv_ui (const mpz_t, unsigned long); 195unsigned long mpz_fdiv_ui (const mpz_t, unsigned long); 196unsigned long mpz_tdiv_ui (const mpz_t, unsigned long); 197 198unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long); 199 200void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long); 201 202int mpz_divisible_ui_p (const mpz_t, unsigned long); 203 204unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long); 205void mpz_gcd (mpz_t, const mpz_t, const mpz_t); 206void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t); 207void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long); 208void mpz_lcm (mpz_t, const mpz_t, const mpz_t); 209int mpz_invert (mpz_t, const mpz_t, const mpz_t); 210 211void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t); 212void mpz_sqrt (mpz_t, const mpz_t); 213int mpz_perfect_square_p (const mpz_t); 214 215void mpz_pow_ui (mpz_t, const mpz_t, unsigned long); 216void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long); 217void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t); 218void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t); 219 220void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long); 221int mpz_root (mpz_t, const mpz_t, unsigned long); 222 223void mpz_fac_ui (mpz_t, unsigned long); 224void mpz_2fac_ui (mpz_t, unsigned long); 225void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long); 226void mpz_bin_uiui (mpz_t, unsigned long, unsigned long); 227 228int mpz_probab_prime_p (const mpz_t, int); 229 230int mpz_tstbit (const mpz_t, mp_bitcnt_t); 231void mpz_setbit (mpz_t, mp_bitcnt_t); 232void mpz_clrbit (mpz_t, mp_bitcnt_t); 233void mpz_combit (mpz_t, mp_bitcnt_t); 234 235void mpz_com (mpz_t, const mpz_t); 236void mpz_and (mpz_t, const mpz_t, const mpz_t); 237void mpz_ior (mpz_t, const mpz_t, const mpz_t); 238void mpz_xor (mpz_t, const mpz_t, const mpz_t); 239 240mp_bitcnt_t mpz_popcount (const mpz_t); 241mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t); 242mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t); 243mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t); 244 245int mpz_fits_slong_p (const mpz_t); 246int mpz_fits_ulong_p (const mpz_t); 247long int mpz_get_si (const mpz_t); 248unsigned long int mpz_get_ui (const mpz_t); 249double mpz_get_d (const mpz_t); 250size_t mpz_size (const mpz_t); 251mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t); 252 253void mpz_realloc2 (mpz_t, mp_bitcnt_t); 254mp_srcptr mpz_limbs_read (mpz_srcptr); 255mp_ptr mpz_limbs_modify (mpz_t, mp_size_t); 256mp_ptr mpz_limbs_write (mpz_t, mp_size_t); 257void mpz_limbs_finish (mpz_t, mp_size_t); 258mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t); 259 260#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }} 261 262void mpz_set_si (mpz_t, signed long int); 263void mpz_set_ui (mpz_t, unsigned long int); 264void mpz_set (mpz_t, const mpz_t); 265void mpz_set_d (mpz_t, double); 266 267void mpz_init_set_si (mpz_t, signed long int); 268void mpz_init_set_ui (mpz_t, unsigned long int); 269void mpz_init_set (mpz_t, const mpz_t); 270void mpz_init_set_d (mpz_t, double); 271 272size_t mpz_sizeinbase (const mpz_t, int); 273char *mpz_get_str (char *, int, const mpz_t); 274int mpz_set_str (mpz_t, const char *, int); 275int mpz_init_set_str (mpz_t, const char *, int); 276 277/* This long list taken from gmp.h. */ 278/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, 279 <iostream> defines EOF but not FILE. */ 280#if defined (FILE) \ 281 || defined (H_STDIO) \ 282 || defined (_H_STDIO) /* AIX */ \ 283 || defined (_STDIO_H) /* glibc, Sun, SCO */ \ 284 || defined (_STDIO_H_) /* BSD, OSF */ \ 285 || defined (__STDIO_H) /* Borland */ \ 286 || defined (__STDIO_H__) /* IRIX */ \ 287 || defined (_STDIO_INCLUDED) /* HPUX */ \ 288 || defined (__dj_include_stdio_h_) /* DJGPP */ \ 289 || defined (_FILE_DEFINED) /* Microsoft */ \ 290 || defined (__STDIO__) /* Apple MPW MrC */ \ 291 || defined (_MSL_STDIO_H) /* Metrowerks */ \ 292 || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ 293 || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \ 294 || defined (__STDIO_LOADED) /* VMS */ \ 295 || defined (__DEFINED_FILE) /* musl */ 296size_t mpz_out_str (FILE *, int, const mpz_t); 297#endif 298 299void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *); 300void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t); 301 302#if defined (__cplusplus) 303} 304#endif 305#endif /* __MINI_GMP_H__ */ 306