ti83-sdk/tool/rabbitsign-src/mpz.h

124 lines
3.4 KiB
C

/*
* RabbitSign - Tools for signing TI graphing calculator software
* Copyright (C) 2009 Benjamin Moody
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RABBITSIGN_MPZ_H__
#define __RABBITSIGN_MPZ_H__
#ifdef __cplusplus
extern "C" {
#endif
#if (SIZEOF_INT != 0) && (SIZEOF_LONG >= 2 * SIZEOF_INT)
typedef unsigned int limb_t;
typedef unsigned long double_limb_t;
typedef signed long signed_double_limb_t;
#else
# if (SIZEOF_SHORT != 0) && (SIZEOF_INT >= 2 * SIZEOF_SHORT)
typedef unsigned short limb_t;
typedef unsigned int double_limb_t;
typedef signed int signed_double_limb_t;
# else
typedef unsigned short limb_t;
typedef unsigned long double_limb_t;
typedef signed long signed_double_limb_t;
# endif
#endif
#define LIMB_BITS (sizeof(limb_t)*8)
#define LIMB_BYTES (sizeof(limb_t))
#define LIMB_MASK ((((double_limb_t) 1) << LIMB_BITS) - 1)
struct _mpz {
size_t size;
size_t size_alloc;
limb_t* m;
int sign;
};
typedef struct _mpz mpz_t[1];
#undef __P
#ifdef PROTOTYPES
# define __P(x) x
#else
# define __P(x) ()
#endif
void mpz_init __P((mpz_t x));
void mpz_clear __P((mpz_t x));
/* Set */
void mpz_set __P((mpz_t dest, const mpz_t src));
void mpz_set_ui __P((mpz_t dest, unsigned int a));
unsigned int mpz_get_ui __P((const mpz_t a));
/* Import/export: assume order=-1, size=1, endian=0, nails=0 */
void mpz_import __P((mpz_t dest, size_t count, int order, int size,
int endian, size_t nails, const void* op));
void mpz_export __P((void* dest, size_t* count, int order, int size,
int endian, size_t nails, const mpz_t op));
/* Check sign */
int mpz_sgn __P((const mpz_t a));
/* Compare */
int mpz_cmp __P((const mpz_t a, const mpz_t b));
int mpz_cmp_ui __P((const mpz_t a, unsigned int b));
/* Add */
void mpz_add __P((mpz_t dest, const mpz_t a, const mpz_t b));
void mpz_add_ui __P((mpz_t dest, const mpz_t a, unsigned int b));
/* Subtract */
void mpz_sub __P((mpz_t dest, const mpz_t a, const mpz_t b));
void mpz_sub_ui __P((mpz_t dest, const mpz_t a, unsigned int b));
/* Multiply */
void mpz_mul __P((mpz_t dest, const mpz_t a, const mpz_t b));
void mpz_mul_ui __P((mpz_t dest, const mpz_t a, unsigned int b));
/* Divide: requires b <= LIMB_BITS */
void mpz_fdiv_q_2exp __P((mpz_t dest, const mpz_t a, unsigned int b));
/* Modulus */
void mpz_mod __P((mpz_t dest, const mpz_t a, const mpz_t mod));
/* Modular exponent */
void mpz_powm __P((mpz_t dest, const mpz_t base, const mpz_t exp,
const mpz_t mod));
/* Legendre symbol */
int mpz_legendre __P((const mpz_t a, const mpz_t p));
/* Extended GCD */
void mpz_gcdext __P((mpz_t g, mpz_t ai, mpz_t bi,
const mpz_t a, const mpz_t b));
/* Output */
int rs_snprintf __P((char* buf, size_t size, const char* fmt, ...));
#ifdef va_start
int rs_vsnprintf __P((char* buf, size_t size, const char* fmt, va_list ap));
#endif
#ifdef __cplusplus
}
#endif
#endif