summaryrefslogtreecommitdiff
path: root/src/mpfr-mini-gmp.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-12-04 17:00:35 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-12-04 17:00:35 +0000
commit28157275ca2fd71b876139b138e5125f159bdd92 (patch)
tree05d3eb1a7afc0421caed38d9199740f3952f799f /src/mpfr-mini-gmp.c
parent0a4c2aa04b34aa7ad49575bdc0ae05aa317f4a45 (diff)
downloadmpfr-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.c13
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