mpz_rrandomb most significant bit always set

Emmanuel Thomé emmanuel.thome at
Fri Mar 4 13:37:15 UTC 2016


The documentation of mpz_rrandomb says:

 -- Function: void mpz_rrandomb (mpz_t ROP, gmp_randstate_t STATE,
          mp_bitcnt_t N)
     Generate a random integer with long strings of zeros and ones in
     the binary representation.  Useful for testing functions and
     algorithms, since this kind of random numbers have proven to be
     more likely to trigger corner-case bugs.  The random number will
     be in the range 0 to 2^N-1, inclusive.

I was surprised to notice that in fact, the most significant bit of
the output seems to be always set, as shown by the code below.

Sure, this behaviour does not *contradict* the documentation, but
perhaps the latter could be changed to reflect this fact, as for
example in:
     The random number will be in the range 2^(N-1) to 2^N-1, inclusive.



#include <stdlib.h>
#include <stdio.h>
#include <gmp.h>

int main(int argc, char * argv[])
    mpz_t x;
    gmp_randstate_t state;
    int iter = (argc > 1) ? (atoi(argv[1])) : 100;
    for(int i = 0 ; i < iter ; i++) {
        mpz_rrandomb(x, state, 64);
        printf("%d\n", mpz_tstbit(x, 63));

 $ ./a.out 10000 | uniq -c
  10000 1

More information about the gmp-discuss mailing list