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