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