diff options
author | Kevin Ryde <user42@zip.com.au> | 2002-12-06 22:34:57 +0100 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2002-12-06 22:34:57 +0100 |
commit | 293d9b657741b5122442ec8386350de4749c055b (patch) | |
tree | 248e8094c92ea01d0e9b414dbf85723130e38f09 /randlc2x.c | |
parent | f6b3bf755a5bfdd1531c28062eb34c2a04651ae8 (diff) | |
download | gmp-293d9b657741b5122442ec8386350de4749c055b.tar.gz |
2002-12-07 Pedro Gimeno <pggimeno@wanadoo.es>
* randlc2x.c (gmp_rand_lc_struct): _mp_c and _mp_c_limbs replaced
with mpn style _cp and _cn. All callers changed.
(randseed_lc): Fix limbs(seed) > bits_to_limbs(m2exp) case.
Remove return value.
(gmp_randinit_lc_2exp): Attempt to avoid redundant relocation.
Diffstat (limited to 'randlc2x.c')
-rw-r--r-- | randlc2x.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/randlc2x.c b/randlc2x.c index ca4a224ab..66d2e6607 100644 --- a/randlc2x.c +++ b/randlc2x.c @@ -26,8 +26,8 @@ MA 02111-1307, USA. */ typedef struct { mpz_t _mp_seed; /* Current value. Fixed size. */ mpz_t _mp_a; /* Multiplier. */ - mpz_t _mp_c; /* Adder. */ - mp_limb_t _mp_c_limbs[2]; /* Limbs of the adder. */ + mp_size_t _cn; /* Number of limbs of the adder. */ + mp_limb_t _cp[LIMBS_PER_ULONG]; /* Limbs of the adder. */ unsigned long int _mp_m2exp; /* Modulus is 2 ^ m2exp. */ } gmp_rand_lc_struct; @@ -76,14 +76,15 @@ lc (mp_ptr rp, gmp_randstate_t rstate) else tp = (mp_ptr) TMP_ALLOC (ta * BYTES_PER_MP_LIMB); - /* t = a * seed */ + /* t = a * seed. NOTE: an is always > 0; see initialization. */ if (seedn > an) mpn_mul (tp, seedp, seedn, ap, an); else mpn_mul (tp, ap, an, seedp, seedn); - /* t = t + c */ - __GMPN_ADD (cy, tp, tp, tn, p->_mp_c_limbs, SIZ (p->_mp_c)); + /* t = t + c. NOTE: tn is always >= p->_cn (precondition for __GMPN_ADD); + see initialization. */ + __GMPN_ADD (cy, tp, tp, tn, p->_cp, p->_cn); /* t = t % m */ tp[m2exp / GMP_NUMB_BITS] &= (CNST_LIMB (1) << m2exp % GMP_NUMB_BITS) - 1; @@ -198,17 +199,18 @@ randget_lc (gmp_randstate_t rstate, mp_ptr rp, unsigned long int nbits) } -static int +static void randseed_lc (gmp_randstate_t rstate, mpz_srcptr seed) { gmp_rand_lc_struct *p = (gmp_rand_lc_struct *) RNG_STATE (rstate); mpz_ptr seedp = p->_mp_seed; mp_size_t seedn = BITS_TO_LIMBS (p->_mp_m2exp); - mpz_set (seedp, seed); + /* Store p->_mp_seed as an unnormalized integer with size enough + for numbers up to 2^m2exp-1. That size can't be zero. */ + mpz_fdiv_r_2exp (seedp, seed, p->_mp_m2exp); MPN_ZERO (&PTR (seedp)[SIZ (seedp)], seedn - SIZ (seedp)); SIZ (seedp) = seedn; - return 0; } @@ -252,9 +254,9 @@ gmp_randinit_lc_2exp (gmp_randstate_t rstate, SIZ (p->_mp_seed) = seedn; PTR (p->_mp_seed)[0] = 1; - mpz_init_set (p->_mp_a, a); + mpz_init2 (p->_mp_a, m2exp); /* Avoid negative a. */ - mpz_fdiv_r_2exp (p->_mp_a, p->_mp_a, m2exp); + mpz_fdiv_r_2exp (p->_mp_a, a, m2exp); /* Avoid SIZ(a) == 0 to avoid checking for special case in lc(). */ if (SIZ (p->_mp_a) == 0) @@ -263,14 +265,14 @@ gmp_randinit_lc_2exp (gmp_randstate_t rstate, PTR (p->_mp_a)[0] = CNST_LIMB (0); } - MPZ_FAKE_UI (p->_mp_c, p->_mp_c_limbs, c); + MPN_SET_UI (p->_cp, p->_cn, c); /* Internally we may discard any bits of c above m2exp. The following code ensures that __GMPN_ADD in lc() will always work. */ - if (seedn == 1 && SIZ (p->_mp_c) == 2) + if (seedn == 1 && p->_cn == 2) /* Only case to worry about. */ { - p->_mp_c_limbs[1] = CNST_LIMB (0); - SIZ (p->_mp_c) = (p->_mp_c_limbs[0] != 0); + p->_cp[1] = CNST_LIMB (0); /* Mask out c (probably not needed.) */ + p->_cn = (p->_cp[0] != 0); /* Fix size. */ } p->_mp_m2exp = m2exp; |