root/lib/mini-gmp.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


     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__ */

/* [<][>][^][v][top][bottom][index][help] */