#include "imath.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
const mp_result MP_OK = …;
const mp_result MP_FALSE = …;
const mp_result MP_TRUE = …;
const mp_result MP_MEMORY = …;
const mp_result MP_RANGE = …;
const mp_result MP_UNDEF = …;
const mp_result MP_TRUNC = …;
const mp_result MP_BADARG = …;
const mp_result MP_MINERR = …;
const mp_sign MP_NEG = …;
const mp_sign MP_ZPOS = …;
static const char *s_unknown_err = …;
static const char *s_error_msg[] = …;
static const double s_log2[] = …;
#define MP_VALUE_DIGITS(V) …
static inline mp_size s_round_prec(mp_size P) { … }
static inline void ZERO(mp_digit *P, mp_size S) { … }
static inline void COPY(mp_digit *P, mp_digit *Q, mp_size S) { … }
static inline void REV(unsigned char *A, int N) { … }
static inline void CLAMP(mp_int z_) { … }
static inline int MIN(int A, int B) { … }
static inline mp_size MAX(mp_size A, mp_size B) { … }
#define SWAP(T, A, B) …
#define DECLARE_TEMP(N) …
#define CLEANUP_TEMP() …
#define TEMP(K) …
#define REQUIRE(E) …
static inline int CMPZ(mp_int Z) { … }
static inline mp_word UPPER_HALF(mp_word W) { … }
static inline mp_digit LOWER_HALF(mp_word W) { … }
static inline bool HIGH_BIT_SET(mp_word W) { … }
static inline bool ADD_WILL_OVERFLOW(mp_word W, mp_word V) { … }
static mp_size default_precision = …;
void mp_int_default_precision(mp_size size) { … }
static mp_size multiply_threshold = …;
void mp_int_multiply_threshold(mp_size thresh) { … }
static mp_digit *s_alloc(mp_size num);
static void s_free(void *ptr);
static bool s_pad(mp_int z, mp_size min);
static inline mp_result GROW(mp_int Z, mp_size N) { … }
static void s_fake(mp_int z, mp_small value, mp_digit vbuf[]);
static void s_ufake(mp_int z, mp_usmall value, mp_digit vbuf[]);
static int s_cdig(mp_digit *da, mp_digit *db, mp_size len);
static int s_uvpack(mp_usmall v, mp_digit t[]);
static int s_ucmp(mp_int a, mp_int b);
static int s_vcmp(mp_int a, mp_small v);
static int s_uvcmp(mp_int a, mp_usmall uv);
static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b);
static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b);
static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b);
static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b);
static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a);
static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a);
static void s_dadd(mp_int a, mp_digit b);
static void s_dmul(mp_int a, mp_digit b);
static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, mp_size size_a);
static mp_digit s_ddiv(mp_int a, mp_digit b);
static void s_qdiv(mp_int z, mp_size p2);
static void s_qmod(mp_int z, mp_size p2);
static int s_qmul(mp_int z, mp_size p2);
static int s_qsub(mp_int z, mp_size p2);
static int s_dp2k(mp_int z);
static int s_isp2(mp_int z);
static int s_2expt(mp_int z, mp_small k);
static int s_norm(mp_int a, mp_int b);
static mp_result s_brmu(mp_int z, mp_int m);
static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2);
static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c);
static mp_result s_udiv_knuth(mp_int a, mp_int b);
static int s_outlen(mp_int z, mp_size r);
static mp_size s_inlen(int len, mp_size r);
static int s_ch2val(char c, int r);
static char s_val2ch(int v, int caps);
static void s_2comp(unsigned char *buf, int len);
static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad);
static inline void UMUL(mp_int X, mp_int Y, mp_int Z) { … }
static inline void USQR(mp_int X, mp_int Z) { … }
mp_result mp_int_init(mp_int z) { … }
mp_int mp_int_alloc(void) { … }
mp_result mp_int_init_size(mp_int z, mp_size prec) { … }
mp_result mp_int_init_copy(mp_int z, mp_int old) { … }
mp_result mp_int_init_value(mp_int z, mp_small value) { … }
mp_result mp_int_init_uvalue(mp_int z, mp_usmall uvalue) { … }
mp_result mp_int_set_value(mp_int z, mp_small value) { … }
mp_result mp_int_set_uvalue(mp_int z, mp_usmall uvalue) { … }
void mp_int_clear(mp_int z) { … }
void mp_int_free(mp_int z) { … }
mp_result mp_int_copy(mp_int a, mp_int c) { … }
void mp_int_swap(mp_int a, mp_int c) { … }
void mp_int_zero(mp_int z) { … }
mp_result mp_int_abs(mp_int a, mp_int c) { … }
mp_result mp_int_neg(mp_int a, mp_int c) { … }
mp_result mp_int_add(mp_int a, mp_int b, mp_int c) { … }
mp_result mp_int_add_value(mp_int a, mp_small value, mp_int c) { … }
mp_result mp_int_sub(mp_int a, mp_int b, mp_int c) { … }
mp_result mp_int_sub_value(mp_int a, mp_small value, mp_int c) { … }
mp_result mp_int_mul(mp_int a, mp_int b, mp_int c) { … }
mp_result mp_int_mul_value(mp_int a, mp_small value, mp_int c) { … }
mp_result mp_int_mul_pow2(mp_int a, mp_small p2, mp_int c) { … }
mp_result mp_int_sqr(mp_int a, mp_int c) { … }
mp_result mp_int_div(mp_int a, mp_int b, mp_int q, mp_int r) { … }
mp_result mp_int_mod(mp_int a, mp_int m, mp_int c) { … }
mp_result mp_int_div_value(mp_int a, mp_small value, mp_int q, mp_small *r) { … }
mp_result mp_int_div_pow2(mp_int a, mp_small p2, mp_int q, mp_int r) { … }
mp_result mp_int_expt(mp_int a, mp_small b, mp_int c) { … }
mp_result mp_int_expt_value(mp_small a, mp_small b, mp_int c) { … }
mp_result mp_int_expt_full(mp_int a, mp_int b, mp_int c) { … }
int mp_int_compare(mp_int a, mp_int b) { … }
int mp_int_compare_unsigned(mp_int a, mp_int b) { … }
int mp_int_compare_zero(mp_int z) { … }
int mp_int_compare_value(mp_int z, mp_small value) { … }
int mp_int_compare_uvalue(mp_int z, mp_usmall uv) { … }
mp_result mp_int_exptmod(mp_int a, mp_int b, mp_int m, mp_int c) { … }
mp_result mp_int_exptmod_evalue(mp_int a, mp_small value, mp_int m, mp_int c) { … }
mp_result mp_int_exptmod_bvalue(mp_small value, mp_int b, mp_int m, mp_int c) { … }
mp_result mp_int_exptmod_known(mp_int a, mp_int b, mp_int m, mp_int mu,
mp_int c) { … }
mp_result mp_int_redux_const(mp_int m, mp_int c) { … }
mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c) { … }
mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c) { … }
mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c, mp_int x, mp_int y) { … }
mp_result mp_int_lcm(mp_int a, mp_int b, mp_int c) { … }
bool mp_int_divisible_value(mp_int a, mp_small v) { … }
int mp_int_is_pow2(mp_int z) { … }
mp_result mp_int_root(mp_int a, mp_small b, mp_int c) { … }
mp_result mp_int_to_int(mp_int z, mp_small *out) { … }
mp_result mp_int_to_uint(mp_int z, mp_usmall *out) { … }
mp_result mp_int_to_string(mp_int z, mp_size radix, char *str, int limit) { … }
mp_result mp_int_string_len(mp_int z, mp_size radix) { … }
mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str) { … }
mp_result mp_int_read_cstring(mp_int z, mp_size radix, const char *str,
char **end) { … }
mp_result mp_int_count_bits(mp_int z) { … }
mp_result mp_int_to_binary(mp_int z, unsigned char *buf, int limit) { … }
mp_result mp_int_read_binary(mp_int z, unsigned char *buf, int len) { … }
mp_result mp_int_binary_len(mp_int z) { … }
mp_result mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit) { … }
mp_result mp_int_read_unsigned(mp_int z, unsigned char *buf, int len) { … }
mp_result mp_int_unsigned_len(mp_int z) { … }
const char *mp_error_string(mp_result res) { … }
#if DEBUG
static const mp_digit fill = (mp_digit)0xdeadbeefabad1dea;
#endif
static mp_digit *s_alloc(mp_size num) { … }
static mp_digit *s_realloc(mp_digit *old, mp_size osize, mp_size nsize) { … }
static void s_free(void *ptr) { … }
static bool s_pad(mp_int z, mp_size min) { … }
static void s_fake(mp_int z, mp_small value, mp_digit vbuf[]) { … }
static void s_ufake(mp_int z, mp_usmall value, mp_digit vbuf[]) { … }
static int s_cdig(mp_digit *da, mp_digit *db, mp_size len) { … }
static int s_uvpack(mp_usmall uv, mp_digit t[]) { … }
static int s_ucmp(mp_int a, mp_int b) { … }
static int s_vcmp(mp_int a, mp_small v) { … }
static int s_uvcmp(mp_int a, mp_usmall uv) { … }
static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b) { … }
static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b) { … }
static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b) { … }
static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a,
mp_size size_b) { … }
static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a) { … }
static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a) { … }
static void s_dadd(mp_int a, mp_digit b) { … }
static void s_dmul(mp_int a, mp_digit b) { … }
static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, mp_size size_a) { … }
static mp_digit s_ddiv(mp_int a, mp_digit b) { … }
static void s_qdiv(mp_int z, mp_size p2) { … }
static void s_qmod(mp_int z, mp_size p2) { … }
static int s_qmul(mp_int z, mp_size p2) { … }
static int s_qsub(mp_int z, mp_size p2) { … }
static int s_dp2k(mp_int z) { … }
static int s_isp2(mp_int z) { … }
static int s_2expt(mp_int z, mp_small k) { … }
static int s_norm(mp_int a, mp_int b) { … }
static mp_result s_brmu(mp_int z, mp_int m) { … }
static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2) { … }
static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) { … }
static mp_result s_udiv_knuth(mp_int u, mp_int v) { … }
static int s_outlen(mp_int z, mp_size r) { … }
static mp_size s_inlen(int len, mp_size r) { … }
static int s_ch2val(char c, int r) { … }
static char s_val2ch(int v, int caps) { … }
static void s_2comp(unsigned char *buf, int len) { … }
static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad) { … }