Slightly different rules on memory allocation.
authormdw <mdw>
Mon, 13 Dec 1999 15:35:16 +0000 (15:35 +0000)
committermdw <mdw>
Mon, 13 Dec 1999 15:35:16 +0000 (15:35 +0000)
mp-arith.c

index cd6b0bd..c055f95 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mp-arith.c,v 1.3 1999/12/11 10:57:43 mdw Exp $
+ * $Id: mp-arith.c,v 1.4 1999/12/13 15:35:16 mdw Exp $
  *
  * Basic arithmetic on multiprecision integers
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mp-arith.c,v $
+ * Revision 1.4  1999/12/13 15:35:16  mdw
+ * Slightly different rules on memory allocation.
+ *
  * Revision 1.3  1999/12/11 10:57:43  mdw
  * Karatsuba squaring algorithm.
  *
@@ -205,17 +208,19 @@ mp *mp_sub(mp *d, mp *a, mp *b)
 
 mp *mp_mul(mp *d, mp *a, mp *b)
 {
+  size_t m = MAX(MP_LEN(a), MP_LEN(b)) * 2 + KARATSUBA_SLOP;
+
   a = MP_COPY(a);
   b = MP_COPY(b);
 
-  MP_MODIFY(d, MP_LEN(a) + MP_LEN(b));
-  if (MP_LEN(a) <= KARATSUBA_CUTOFF || MP_LEN(b) <= KARATSUBA_CUTOFF)
+  if (MP_LEN(a) <= KARATSUBA_CUTOFF || MP_LEN(b) <= KARATSUBA_CUTOFF) {
+    MP_MODIFY(d, MP_LEN(a) + MP_LEN(b));
     mpx_umul(d->v, d->vl, a->v, a->vl, b->v, b->vl);
-  else {
-    size_t m = MAX(MP_LEN(a), MP_LEN(b)) * 2 + KARATSUBA_SLOP;
+  } else {
     mpw *s;
     m += 32;
     s = MP_ALLOC(m);
+    MP_MODIFY(d, 2 * m + 2);
     mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + m);
     MP_FREE(s);
   }
@@ -240,7 +245,7 @@ mp *mp_sqr(mp *d, mp *a)
   size_t m = MP_LEN(a);
 
   a = MP_COPY(a);
-  MP_MODIFY(d, 2 * m);
+  MP_MODIFY(d, 2 * m + 2);
   if (m > KARATSUBA_CUTOFF) {
     mpw *s;
     m = 2 * (m + 1) + 32;