version 1.1, 2000/09/09 14:12:16 |
version 1.1.1.2, 2003/08/25 16:06:00 |
|
|
state STATE for a linear congruential generator with multiplier A, |
state STATE for a linear congruential generator with multiplier A, |
adder C, and modulus 2 ^ M2EXP. |
adder C, and modulus 2 ^ M2EXP. |
|
|
Copyright (C) 2000 Free Software Foundation, Inc. |
Copyright 2000, 2002 Free Software Foundation, Inc. |
|
|
This file is part of the GNU MP Library. |
This file is part of the GNU MP Library. |
|
|
Line 25 MA 02111-1307, USA. */ |
|
Line 25 MA 02111-1307, USA. */ |
|
#include "gmp-impl.h" |
#include "gmp-impl.h" |
|
|
void |
void |
#if __STDC__ |
|
gmp_randinit_lc_2exp (gmp_randstate_t rstate, |
gmp_randinit_lc_2exp (gmp_randstate_t rstate, |
mpz_t a, |
mpz_srcptr a, |
unsigned long int c, |
unsigned long int c, |
unsigned long int m2exp) |
unsigned long int m2exp) |
#else |
|
gmp_randinit_lc_2exp (rstate, a, c, m2exp) |
|
gmp_randstate_t rstate; |
|
mpz_t a; |
|
unsigned long int c; |
|
unsigned long int m2exp; |
|
#endif |
|
{ |
{ |
mpz_init_set_ui (rstate->seed, 1); |
mpz_init_set_ui (rstate->_mp_seed, 1); |
_mpz_realloc (rstate->seed, m2exp / BITS_PER_MP_LIMB |
_mpz_realloc (rstate->_mp_seed, (m2exp + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS); |
+ (m2exp % BITS_PER_MP_LIMB != 0)); |
|
|
|
/* Allocate algorithm specific data. */ |
/* Allocate algorithm specific data. */ |
rstate->algdata.lc = (__gmp_randata_lc *) |
rstate->_mp_algdata._mp_lc = (__gmp_randata_lc *) |
(*_mp_allocate_func) (sizeof (__gmp_randata_lc)); |
(*__gmp_allocate_func) (sizeof (__gmp_randata_lc)); |
|
|
mpz_init_set (rstate->algdata.lc->a, a); |
mpz_init_set (rstate->_mp_algdata._mp_lc->_mp_a, a); |
rstate->algdata.lc->c = c; |
rstate->_mp_algdata._mp_lc->_mp_c = c; |
|
|
/* Cover weird case where m2exp is 0, which means that m is used |
/* Cover weird case where m2exp is 0, which means that m is used |
instead of m2exp. */ |
instead of m2exp. */ |
if (m2exp == 0) |
if (m2exp == 0) |
mpz_init_set_ui (rstate->algdata.lc->m, 0); |
mpz_init_set_ui (rstate->_mp_algdata._mp_lc->_mp_m, 0); |
rstate->algdata.lc->m2exp = m2exp; |
rstate->_mp_algdata._mp_lc->_mp_m2exp = m2exp; |
|
|
rstate->alg = GMP_RAND_ALG_LC; |
rstate->_mp_alg = GMP_RAND_ALG_LC; |
} |
} |