git: 9front

Download patch

ref: 8b8c49d86c98b963cb6abb453eaf6896c7540aab
parent: 6926174bf9621306d162db24b3f0f6b243bcf073
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Dec 1 06:13:52 EST 2015

libmp: with mpmod() m = 2^a - c ensure that digits(c) < digits(m)

--- a/sys/src/libmp/port/mpmod.c
+++ b/sys/src/libmp/port/mpmod.c
@@ -13,7 +13,7 @@
 	sign = x->sign;
 
 	assert(n->flags & MPnorm);
-	if(n->top < 2 || n->top > nelem(q) || (x->top-n->top) > nelem(q))
+	if(n->top <= 2 || n->top > nelem(q) || (x->top-n->top) > nelem(q))
 		goto hard;
 
 	/*
@@ -42,11 +42,15 @@
 			c = mpnew(0);
 			p = mpnew(0);
 		}
-		mpassign(n, p);
-
-		mpleft(n, s, m);
+		mpleft(p, s, m);
 		mpleft(mpone, k*Dbits, c);
 		mpsub(c, m, c);
+		if(c->top >= k){
+			mpassign(mpzero, p);
+			busy = 0;
+			goto hard;
+		}
+		mpassign(n, p);
 	}
 
 	mpleft(x, s, r);
--