summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-08-29 00:45:16 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-08-29 00:45:16 +0200
commit33862ff7936eb8be9380ce1332a3cfd7ed703672 (patch)
tree5fac524faf06b1d4bc3a72a0010aa687417b2d82 /sys/src
parentb80684a1d20b8d6c0fa096891524a424dbd05e72 (diff)
libmp: mpnrand(), what was i *THINKING*
the prior implementation was unneccesarily complicated for no good reason due to me misunderstanding how libc's nrand() works. in contrast to libc, we already generate the *closest* power-of-2 random number with mprand() in the sampling loop.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/libmp/port/mpnrand.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/sys/src/libmp/port/mpnrand.c b/sys/src/libmp/port/mpnrand.c
index aa6a1e273..278547ca6 100644
--- a/sys/src/libmp/port/mpnrand.c
+++ b/sys/src/libmp/port/mpnrand.c
@@ -6,30 +6,18 @@
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(bits == 0)
+ abort();
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);
+ } while(mpmagcmp(b, n) >= 0);
return b;
}