diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-12-04 17:00:35 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-12-04 17:00:35 +0000 |
commit | 28157275ca2fd71b876139b138e5125f159bdd92 (patch) | |
tree | 05d3eb1a7afc0421caed38d9199740f3952f799f /src/mpfr-mini-gmp.c | |
parent | 0a4c2aa04b34aa7ad49575bdc0ae05aa317f4a45 (diff) | |
download | mpfr-28157275ca2fd71b876139b138e5125f159bdd92.tar.gz |
[src/mpfr-mini-gmp.c] gmp_urandomm_ui did not generate uniform values
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13312 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/mpfr-mini-gmp.c')
-rw-r--r-- | src/mpfr-mini-gmp.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/mpfr-mini-gmp.c b/src/mpfr-mini-gmp.c index ddaa028fa..22cce452c 100644 --- a/src/mpfr-mini-gmp.c +++ b/src/mpfr-mini-gmp.c @@ -98,7 +98,18 @@ mpz_urandomb (mpz_t rop, gmp_randstate_t state, mp_bitcnt_t nbits) unsigned long gmp_urandomm_ui (gmp_randstate_t state, unsigned long n) { - return random_limb () % n; + unsigned long p, q, r; + MPFR_ASSERTD(n <= MPFR_LIMB_MAX); + p = random_limb (); /* p is in [0, MPFR_LIMB_MAX], thus p is uniform among + MPFR_LIMB_MAX+1 values */ + r = MPFR_LIMB_MAX % n; + if (r < n - 1) /* MPFR_LIMB_MAX+1 is not multiple of n */ + { + q = n * (MPFR_LIMB_MAX / n); + while (p >= q) + p = random_limb (); + } + return p % n; } #endif |