ref: dc96f164a2b72ccb209ae98ce50a11087cbe44f8
dir: /sys/src/libmp/port/mpnrand.c/
#include "os.h" #include <mp.h> #include <libsec.h> #include "dat.h" /* return uniform random [0..n-1] */ mpint* mpnrand(mpint *n, void (*gen)(uchar*, int), mpint *b) { mpint *m; int bits; /* m = 2^bits - 1 */ bits = mpsignif(n); m = mpnew(bits+1); mpleft(mpone, bits, m); mpsub(m, mpone, m); if(b == nil){ b = mpnew(bits); setmalloctag(b, getcallerpc(&n)); } /* m = m - (m % n) */ mpmod(m, n, b); mpsub(m, b, m); do { mprand(bits, gen, b); } while(mpcmp(b, m) >= 0); mpmod(b, n, b); mpfree(m); return b; }