diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2013-02-18 10:29:46 +0100 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2013-02-18 10:29:46 +0100 |
commit | 0a2a16fb17788b56d2429fc87db070909afb2f2b (patch) | |
tree | 11e171a4e7a2b2e50ed351cd92ec58415c11170a /rand | |
parent | f8d6dea8127740414983084dcbed47cecb876e8d (diff) | |
download | gmp-0a2a16fb17788b56d2429fc87db070909afb2f2b.tar.gz |
rand/randmts.c: Use init2, as size of variables is known in advance.
Diffstat (limited to 'rand')
-rw-r--r-- | rand/randmts.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/rand/randmts.c b/rand/randmts.c index e3b033885..55fdfa192 100644 --- a/rand/randmts.c +++ b/rand/randmts.c @@ -1,6 +1,6 @@ /* Mersenne Twister pseudo-random number generator functions. -Copyright 2002, 2003 Free Software Foundation, Inc. +Copyright 2002, 2003, 2013 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -25,16 +25,15 @@ along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ /* Calculate (b^e) mod (2^n-k) for e=1074888996, n=19937 and k=20023, needed by the seeding function below. */ static void -mangle_seed (mpz_ptr r, mpz_srcptr b_orig) +mangle_seed (mpz_ptr r) { mpz_t t, b; unsigned long e = 0x40118124; unsigned long bit = 0x20000000; - mpz_init (t); - mpz_init_set (b, b_orig); /* in case r==b_orig */ + mpz_init2 (t, 19937L); + mpz_init_set (b, r); - mpz_set (r, b); do { mpz_mul (r, r, r); @@ -43,7 +42,7 @@ mangle_seed (mpz_ptr r, mpz_srcptr b_orig) for (;;) { mpz_tdiv_q_2exp (t, r, 19937L); - if (mpz_sgn (t) == 0) + if (SIZ (t) == 0) break; mpz_tdiv_r_2exp (r, r, 19937L); mpz_addmul_ui (r, t, 20023L); @@ -51,7 +50,7 @@ mangle_seed (mpz_ptr r, mpz_srcptr b_orig) if ((e & bit) != 0) { - e &= ~bit; + e ^= bit; mpz_mul (r, r, b); goto reduce; } @@ -107,15 +106,15 @@ randseed_mt (gmp_randstate_t rstate, mpz_srcptr seed) p = (gmp_rand_mt_struct *) RNG_STATE (rstate); - mpz_init (mod); - mpz_init (seed1); + mpz_init2 (mod, 19937L); + mpz_init2 (seed1, 19937L); - mpz_set_ui (mod, 0L); mpz_setbit (mod, 19937L); mpz_sub_ui (mod, mod, 20027L); mpz_mod (seed1, seed, mod); /* Reduce `seed' modulo `mod'. */ + mpz_clear (mod); mpz_add_ui (seed1, seed1, 2L); /* seed1 is now ready. */ - mangle_seed (seed1, seed1); /* Perform the mangling by powering. */ + mangle_seed (seed1); /* Perform the mangling by powering. */ /* Copy the last bit into bit 31 of mt[0] and clear it. */ p->mt[0] = (mpz_tstbit (seed1, 19936L) != 0) ? 0x80000000 : 0; @@ -124,14 +123,12 @@ randseed_mt (gmp_randstate_t rstate, mpz_srcptr seed) /* Split seed1 into N-1 32-bit chunks. */ mpz_export (&p->mt[1], &cnt, -1, sizeof (p->mt[1]), 0, 8 * sizeof (p->mt[1]) - 32, seed1); + mpz_clear (seed1); cnt++; ASSERT (cnt <= N); while (cnt < N) p->mt[cnt++] = 0; - mpz_clear (mod); - mpz_clear (seed1); - /* Warm the generator up if necessary. */ if (WARM_UP != 0) for (i = 0; i < WARM_UP / N; i++) |