From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/bootstrap.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 gmp-6.3.0/bootstrap.c (limited to 'gmp-6.3.0/bootstrap.c') diff --git a/gmp-6.3.0/bootstrap.c b/gmp-6.3.0/bootstrap.c new file mode 100644 index 0000000..07eb416 --- /dev/null +++ b/gmp-6.3.0/bootstrap.c @@ -0,0 +1,133 @@ +/* Functions needed for bootstrapping the gmp build, based on mini-gmp. + +Copyright 2001, 2002, 2004, 2011, 2012, 2015 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library 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 copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + + +#define MINI_GMP_DONT_USE_FLOAT_H 1 +#include "mini-gmp/mini-gmp.c" + +#define MIN(l,o) ((l) < (o) ? (l) : (o)) +#define PTR(x) ((x)->_mp_d) +#define SIZ(x) ((x)->_mp_size) + +#define xmalloc gmp_default_alloc + +int +isprime (unsigned long int t) +{ + unsigned long int q, r, d; + + if (t < 32) + return (0xa08a28acUL >> t) & 1; + if ((t & 1) == 0) + return 0; + + if (t % 3 == 0) + return 0; + if (t % 5 == 0) + return 0; + if (t % 7 == 0) + return 0; + + for (d = 11;;) + { + q = t / d; + r = t - q * d; + if (q < d) + return 1; + if (r == 0) + break; + d += 2; + q = t / d; + r = t - q * d; + if (q < d) + return 1; + if (r == 0) + break; + d += 4; + } + return 0; +} + +int +log2_ceil (int n) +{ + int e; + assert (n >= 1); + for (e = 0; ; e++) + if ((1 << e) >= n) + break; + return e; +} + +/* Set inv to the inverse of d, in the style of invert_limb, ie. for + udiv_qrnnd_preinv. */ +void +mpz_preinv_invert (mpz_t inv, const mpz_t d, int numb_bits) +{ + mpz_t t; + int norm; + assert (SIZ(d) > 0); + + norm = numb_bits - mpz_sizeinbase (d, 2); + assert (norm >= 0); + mpz_init (t); + mpz_setbit (t, 2*numb_bits - norm); + mpz_tdiv_q (inv, t, d); + mpz_clrbit (inv, numb_bits); + + mpz_clear (t); +} + +/* Calculate r satisfying r*a == 1 mod 2^n. */ +void +mpz_invert_2exp (mpz_t r, const mpz_t a, unsigned long n) +{ + mpz_t mod; + + assert (mpz_odd_p (a)); + + mpz_init (mod); + mpz_setbit (mod, n); + + mpz_invert (r, a, mod); + + mpz_clear (mod); +} + +/* Calculate inv satisfying r*a == 1 mod 2^n. */ +void +mpz_invert_ui_2exp (mpz_t r, unsigned long a, unsigned long n) +{ + mpz_t az; + + mpz_init_set_ui (az, a); + mpz_invert_2exp (r, az, n); + mpz_clear (az); +} -- cgit v1.2.3