Blame mini-gmp/mini-gmp.h

Packit 5c3484
/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
Packit 5c3484
Packit 5c3484
Copyright 2011-2015 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library.
Packit 5c3484
Packit 5c3484
The GNU MP Library is free software; you can redistribute it and/or modify
Packit 5c3484
it under the terms of either:
Packit 5c3484
Packit 5c3484
  * the GNU Lesser General Public License as published by the Free
Packit 5c3484
    Software Foundation; either version 3 of the License, or (at your
Packit 5c3484
    option) any later version.
Packit 5c3484
Packit 5c3484
or
Packit 5c3484
Packit 5c3484
  * the GNU General Public License as published by the Free Software
Packit 5c3484
    Foundation; either version 2 of the License, or (at your option) any
Packit 5c3484
    later version.
Packit 5c3484
Packit 5c3484
or both in parallel, as here.
Packit 5c3484
Packit 5c3484
The GNU MP Library is distributed in the hope that it will be useful, but
Packit 5c3484
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 5c3484
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 5c3484
for more details.
Packit 5c3484
Packit 5c3484
You should have received copies of the GNU General Public License and the
Packit 5c3484
GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 5c3484
see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
/* About mini-gmp: This is a minimal implementation of a subset of the
Packit 5c3484
   GMP interface. It is intended for inclusion into applications which
Packit 5c3484
   have modest bignums needs, as a fallback when the real GMP library
Packit 5c3484
   is not installed.
Packit 5c3484
Packit 5c3484
   This file defines the public interface. */
Packit 5c3484
Packit 5c3484
#ifndef __MINI_GMP_H__
Packit 5c3484
#define __MINI_GMP_H__
Packit 5c3484
Packit 5c3484
/* For size_t */
Packit 5c3484
#include <stddef.h>
Packit 5c3484
Packit 5c3484
#if defined (__cplusplus)
Packit 5c3484
extern "C" {
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
void mp_set_memory_functions (void *(*) (size_t),
Packit 5c3484
			      void *(*) (void *, size_t, size_t),
Packit 5c3484
			      void (*) (void *, size_t));
Packit 5c3484
Packit 5c3484
void mp_get_memory_functions (void *(**) (size_t),
Packit 5c3484
			      void *(**) (void *, size_t, size_t),
Packit 5c3484
			      void (**) (void *, size_t));
Packit 5c3484
Packit 5c3484
typedef unsigned long mp_limb_t;
Packit 5c3484
typedef long mp_size_t;
Packit 5c3484
typedef unsigned long mp_bitcnt_t;
Packit 5c3484
Packit 5c3484
typedef mp_limb_t *mp_ptr;
Packit 5c3484
typedef const mp_limb_t *mp_srcptr;
Packit 5c3484
Packit 5c3484
typedef struct
Packit 5c3484
{
Packit 5c3484
  int _mp_alloc;		/* Number of *limbs* allocated and pointed
Packit 5c3484
				   to by the _mp_d field.  */
Packit 5c3484
  int _mp_size;			/* abs(_mp_size) is the number of limbs the
Packit 5c3484
				   last field points to.  If _mp_size is
Packit 5c3484
				   negative this is a negative number.  */
Packit 5c3484
  mp_limb_t *_mp_d;		/* Pointer to the limbs.  */
Packit 5c3484
} __mpz_struct;
Packit 5c3484
Packit 5c3484
typedef __mpz_struct mpz_t[1];
Packit 5c3484
Packit 5c3484
typedef __mpz_struct *mpz_ptr;
Packit 5c3484
typedef const __mpz_struct *mpz_srcptr;
Packit 5c3484
Packit 5c3484
extern const int mp_bits_per_limb;
Packit 5c3484
Packit 5c3484
void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
void mpn_zero (mp_ptr, mp_size_t);
Packit 5c3484
Packit 5c3484
int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t);
Packit 5c3484
int mpn_zero_p (mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
Packit 5c3484
mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
Packit 5c3484
mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
Packit 5c3484
mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
Packit 5c3484
mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
Packit 5c3484
mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
Packit 5c3484
mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
Packit 5c3484
void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
Packit 5c3484
void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
int mpn_perfect_square_p (mp_srcptr, mp_size_t);
Packit 5c3484
mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
Packit 5c3484
mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
Packit 5c3484
Packit 5c3484
mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t);
Packit 5c3484
mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t);
Packit 5c3484
Packit 5c3484
void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t);
Packit 5c3484
#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
Packit 5c3484
Packit 5c3484
size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
Packit 5c3484
mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
Packit 5c3484
Packit 5c3484
void mpz_init (mpz_t);
Packit 5c3484
void mpz_init2 (mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_clear (mpz_t);
Packit 5c3484
Packit 5c3484
#define mpz_odd_p(z)   (((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
Packit 5c3484
#define mpz_even_p(z)  (! mpz_odd_p (z))
Packit 5c3484
Packit 5c3484
int mpz_sgn (const mpz_t);
Packit 5c3484
int mpz_cmp_si (const mpz_t, long);
Packit 5c3484
int mpz_cmp_ui (const mpz_t, unsigned long);
Packit 5c3484
int mpz_cmp (const mpz_t, const mpz_t);
Packit 5c3484
int mpz_cmpabs_ui (const mpz_t, unsigned long);
Packit 5c3484
int mpz_cmpabs (const mpz_t, const mpz_t);
Packit 5c3484
int mpz_cmp_d (const mpz_t, double);
Packit 5c3484
int mpz_cmpabs_d (const mpz_t, double);
Packit 5c3484
Packit 5c3484
void mpz_abs (mpz_t, const mpz_t);
Packit 5c3484
void mpz_neg (mpz_t, const mpz_t);
Packit 5c3484
void mpz_swap (mpz_t, mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_add_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
void mpz_add (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_sub_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
void mpz_ui_sub (mpz_t, unsigned long, const mpz_t);
Packit 5c3484
void mpz_sub (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_mul_si (mpz_t, const mpz_t, long int);
Packit 5c3484
void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int);
Packit 5c3484
void mpz_mul (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int);
Packit 5c3484
void mpz_addmul (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int);
Packit 5c3484
void mpz_submul (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
Packit 5c3484
Packit 5c3484
void mpz_mod (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_divexact (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
int mpz_divisible_p (const mpz_t, const mpz_t);
Packit 5c3484
int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_cdiv_ui (const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_fdiv_ui (const mpz_t, unsigned long);
Packit 5c3484
unsigned long mpz_tdiv_ui (const mpz_t, unsigned long);
Packit 5c3484
Packit 5c3484
unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
Packit 5c3484
void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
Packit 5c3484
int mpz_divisible_ui_p (const mpz_t, unsigned long);
Packit 5c3484
Packit 5c3484
unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
void mpz_gcd (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
void mpz_lcm (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
int mpz_invert (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t);
Packit 5c3484
void mpz_sqrt (mpz_t, const mpz_t);
Packit 5c3484
int mpz_perfect_square_p (const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_pow_ui (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long);
Packit 5c3484
void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t);
Packit 5c3484
Packit 5c3484
void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long);
Packit 5c3484
int mpz_root (mpz_t, const mpz_t, unsigned long);
Packit 5c3484
Packit 5c3484
void mpz_fac_ui (mpz_t, unsigned long);
Packit 5c3484
void mpz_bin_uiui (mpz_t, unsigned long, unsigned long);
Packit 5c3484
Packit 5c3484
int mpz_probab_prime_p (const mpz_t, int);
Packit 5c3484
Packit 5c3484
int mpz_tstbit (const mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_setbit (mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_clrbit (mpz_t, mp_bitcnt_t);
Packit 5c3484
void mpz_combit (mpz_t, mp_bitcnt_t);
Packit 5c3484
Packit 5c3484
void mpz_com (mpz_t, const mpz_t);
Packit 5c3484
void mpz_and (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_ior (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
void mpz_xor (mpz_t, const mpz_t, const mpz_t);
Packit 5c3484
Packit 5c3484
mp_bitcnt_t mpz_popcount (const mpz_t);
Packit 5c3484
mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t);
Packit 5c3484
mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t);
Packit 5c3484
mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
Packit 5c3484
Packit 5c3484
int mpz_fits_slong_p (const mpz_t);
Packit 5c3484
int mpz_fits_ulong_p (const mpz_t);
Packit 5c3484
long int mpz_get_si (const mpz_t);
Packit 5c3484
unsigned long int mpz_get_ui (const mpz_t);
Packit 5c3484
double mpz_get_d (const mpz_t);
Packit 5c3484
size_t mpz_size (const mpz_t);
Packit 5c3484
mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t);
Packit 5c3484
Packit 5c3484
void mpz_realloc2 (mpz_t, mp_bitcnt_t);
Packit 5c3484
mp_srcptr mpz_limbs_read (mpz_srcptr);
Packit 5c3484
mp_ptr mpz_limbs_modify (mpz_t, mp_size_t);
Packit 5c3484
mp_ptr mpz_limbs_write (mpz_t, mp_size_t);
Packit 5c3484
void mpz_limbs_finish (mpz_t, mp_size_t);
Packit 5c3484
mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t);
Packit 5c3484
Packit 5c3484
#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
Packit 5c3484
Packit 5c3484
void mpz_set_si (mpz_t, signed long int);
Packit 5c3484
void mpz_set_ui (mpz_t, unsigned long int);
Packit 5c3484
void mpz_set (mpz_t, const mpz_t);
Packit 5c3484
void mpz_set_d (mpz_t, double);
Packit 5c3484
Packit 5c3484
void mpz_init_set_si (mpz_t, signed long int);
Packit 5c3484
void mpz_init_set_ui (mpz_t, unsigned long int);
Packit 5c3484
void mpz_init_set (mpz_t, const mpz_t);
Packit 5c3484
void mpz_init_set_d (mpz_t, double);
Packit 5c3484
Packit 5c3484
size_t mpz_sizeinbase (const mpz_t, int);
Packit 5c3484
char *mpz_get_str (char *, int, const mpz_t);
Packit 5c3484
int mpz_set_str (mpz_t, const char *, int);
Packit 5c3484
int mpz_init_set_str (mpz_t, const char *, int);
Packit 5c3484
Packit 5c3484
/* This long list taken from gmp.h. */
Packit 5c3484
/* For reference, "defined(EOF)" cannot be used here.  In g++ 2.95.4,
Packit 5c3484
   <iostream> defines EOF but not FILE.  */
Packit 5c3484
#if defined (FILE)                                              \
Packit 5c3484
  || defined (H_STDIO)                                          \
Packit 5c3484
  || defined (_H_STDIO)               /* AIX */                 \
Packit 5c3484
  || defined (_STDIO_H)               /* glibc, Sun, SCO */     \
Packit 5c3484
  || defined (_STDIO_H_)              /* BSD, OSF */            \
Packit 5c3484
  || defined (__STDIO_H)              /* Borland */             \
Packit 5c3484
  || defined (__STDIO_H__)            /* IRIX */                \
Packit 5c3484
  || defined (_STDIO_INCLUDED)        /* HPUX */                \
Packit 5c3484
  || defined (__dj_include_stdio_h_)  /* DJGPP */               \
Packit 5c3484
  || defined (_FILE_DEFINED)          /* Microsoft */           \
Packit 5c3484
  || defined (__STDIO__)              /* Apple MPW MrC */       \
Packit 5c3484
  || defined (_MSL_STDIO_H)           /* Metrowerks */          \
Packit 5c3484
  || defined (_STDIO_H_INCLUDED)      /* QNX4 */		\
Packit 5c3484
  || defined (_ISO_STDIO_ISO_H)       /* Sun C++ */		\
Packit 5c3484
  || defined (__STDIO_LOADED)         /* VMS */
Packit 5c3484
size_t mpz_out_str (FILE *, int, const mpz_t);
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *);
Packit 5c3484
void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t);
Packit 5c3484
Packit 5c3484
#if defined (__cplusplus)
Packit 5c3484
}
Packit 5c3484
#endif
Packit 5c3484
#endif /* __MINI_GMP_H__ */