summaryrefslogtreecommitdiff
path: root/rand
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2013-02-18 10:29:46 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2013-02-18 10:29:46 +0100
commit0a2a16fb17788b56d2429fc87db070909afb2f2b (patch)
tree11e171a4e7a2b2e50ed351cd92ec58415c11170a /rand
parentf8d6dea8127740414983084dcbed47cecb876e8d (diff)
downloadgmp-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.c25
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++)