Add an internal-representation no-op function.
[u/mdw/catacomb] / mpmont.c
index be7d00e..d051778 100644 (file)
--- a/mpmont.c
+++ b/mpmont.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mpmont.c,v 1.10 2000/07/29 17:05:43 mdw Exp $
+ * $Id: mpmont.c,v 1.14 2001/02/22 09:04:26 mdw Exp $
  *
  * Montgomery reduction
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mpmont.c,v $
+ * Revision 1.14  2001/02/22 09:04:26  mdw
+ * Cosmetic fix.
+ *
+ * Revision 1.13  2001/02/03 12:00:29  mdw
+ * Now @mp_drop@ checks its argument is non-NULL before attempting to free
+ * it.  Note that the macro version @MP_DROP@ doesn't do this.
+ *
+ * Revision 1.12  2000/10/08 15:48:35  mdw
+ * Rename Karatsuba constants now that we have @gfx_kmul@ too.
+ *
+ * Revision 1.11  2000/10/08 12:04:27  mdw
+ * (mpmont_reduce, mpmont_mul): Cope with negative numbers.
+ *
  * Revision 1.10  2000/07/29 17:05:43  mdw
  * (mpmont_expr): Use sliding window exponentiation, with a drop-through
  * for small exponents to use a simple left-to-right bitwise routine.  This
@@ -195,7 +208,7 @@ mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
 
   /* --- Check for serious Karatsuba reduction --- */
 
-  if (n > KARATSUBA_CUTOFF * 3) {
+  if (n > MPK_THRESH * 3) {
     mp al;
     mpw *vl;
     mp *u;
@@ -246,8 +259,12 @@ mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
 
   memmove(d->v, d->v + n, MPWS(MP_LEN(d) - n));
   d->vl -= n;
-  if (MP_CMP(d, >=, mm->m))
-    d = mp_sub(d, d, mm->m);
+  if (MPX_UCMP(d->v, d->vl, >=, mm->m->v, mm->m->vl))
+    mpx_usub(d->v, d->vl, d->v, d->vl, mm->m->v, mm->m->vl);
+  if (d->f & MP_NEG) {
+    mpx_usub(d->v, d->vl, mm->m->v, mm->m->vl, d->v, d->vl);
+    d->f &= ~MP_NEG;
+  }
   MP_SHRINK(d);
   return (d);
 }
@@ -276,7 +293,7 @@ mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
 
 mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
 {
-  if (mm->n > KARATSUBA_CUTOFF * 3) {
+  if (mm->n > MPK_THRESH * 3) {
     d = mp_mul(d, a, b);
     d = mpmont_reduce(mm, d, d);
   } else {
@@ -331,10 +348,12 @@ mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
 
     memmove(d->v, dv, MPWS(dvl - dv));
     d->vl -= dv - d->v;
+    if (MPX_UCMP(d->v, d->vl, >=, mm->m->v, mm->m->vl))
+      mpx_usub(d->v, d->vl, d->v, d->vl, mm->m->v, mm->m->vl);
+    if ((a->f ^ b->f) & MP_NEG)
+      mpx_usub(d->v, d->vl, mm->m->v, mm->m->vl, d->v, d->vl);
     MP_SHRINK(d);
     d->f = (a->f | b->f) & MP_BURN;
-    if (MP_CMP(d, >=, mm->m))
-      d = mp_sub(d, d, mm->m);
     MP_DROP(a);
     MP_DROP(b);
   }
@@ -456,9 +475,8 @@ mp *mpmont_expr(mpmont *mm, mp *d, mp *a, mp *e)
    */
 
   MP_RSTEP(&sc);
-  while (!MP_RBIT(&sc)) {
+  while (!MP_RBIT(&sc))
     MP_RSTEP(&sc);
-  }
 
   /* --- Now for the main work --- */
 
@@ -536,10 +554,8 @@ done:
     mp_drop(tab[i]);
   xfree(tab);
 exit:
-  if (d != MP_NEW)
-    mp_drop(d);
-  if (spare)
-    mp_drop(spare);
+  mp_drop(d);
+  mp_drop(spare);
   return (x);
 }
 
@@ -584,7 +600,7 @@ static int tcreate(dstr *v)
     ok = 0;
   }
 
-  if (MP_CMP(mm.r, !=, r)) {
+  if (!MP_EQ(mm.r, r)) {
     fputs("\n*** bad r", stderr);
     fputs("\nm = ", stderr); mp_writefile(m, stderr, 10);
     fputs("\nexpected ", stderr); mp_writefile(r, stderr, 10);
@@ -593,7 +609,7 @@ static int tcreate(dstr *v)
     ok = 0;
   }
 
-  if (MP_CMP(mm.r2, !=, r2)) {
+  if (!MP_EQ(mm.r2, r2)) {
     fputs("\n*** bad r2", stderr);
     fputs("\nm = ", stderr); mp_writefile(m, stderr, 10);
     fputs("\nexpected ", stderr); mp_writefile(r2, stderr, 10);
@@ -626,7 +642,7 @@ static int tmul(dstr *v)
     mp *qr = mp_mul(MP_NEW, a, b);
     mp_div(0, &qr, qr, m);
 
-    if (MP_CMP(qr, !=, r)) {
+    if (!MP_EQ(qr, r)) {
       fputs("\n*** classical modmul failed", stderr);
       fputs("\n m = ", stderr); mp_writefile(m, stderr, 10);
       fputs("\n a = ", stderr); mp_writefile(a, stderr, 10);
@@ -645,7 +661,7 @@ static int tmul(dstr *v)
     mp *br = mpmont_mul(&mm, MP_NEW, b, mm.r2);
     mp *mr = mpmont_mul(&mm, MP_NEW, ar, br);
     mr = mpmont_reduce(&mm, mr, mr);
-    if (MP_CMP(mr, !=, r)) {
+    if (!MP_EQ(mr, r)) {
       fputs("\n*** montgomery modmul failed", stderr);
       fputs("\n m = ", stderr); mp_writefile(m, stderr, 10);
       fputs("\n a = ", stderr); mp_writefile(a, stderr, 10);
@@ -683,7 +699,7 @@ static int texp(dstr *v)
 
   mr = mpmont_exp(&mm, MP_NEW, a, b);
 
-  if (MP_CMP(mr, !=, r)) {
+  if (!MP_EQ(mr, r)) {
     fputs("\n*** montgomery modexp failed", stderr);
     fputs("\n m = ", stderr); mp_writefile(m, stderr, 10);
     fputs("\n a = ", stderr); mp_writefile(a, stderr, 10);