shithub: riscv

Download patch

ref: 33862ff7936eb8be9380ce1332a3cfd7ed703672
parent: b80684a1d20b8d6c0fa096891524a424dbd05e72
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Aug 28 20:45:16 EDT 2016

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.

--- 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;
 }