Adjust Karatsuba parameters. Calculate destination size better.
authormdw <mdw>
Wed, 22 Dec 1999 15:54:41 +0000 (15:54 +0000)
committermdw <mdw>
Wed, 22 Dec 1999 15:54:41 +0000 (15:54 +0000)
mp-arith.c

index c055f95..f0502e1 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mp-arith.c,v 1.4 1999/12/13 15:35:16 mdw Exp $
+ * $Id: mp-arith.c,v 1.5 1999/12/22 15:54:41 mdw Exp $
  *
  * Basic arithmetic on multiprecision integers
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mp-arith.c,v $
+ * Revision 1.5  1999/12/22 15:54:41  mdw
+ * Adjust Karatsuba parameters.  Calculate destination size better.
+ *
  * Revision 1.4  1999/12/13 15:35:16  mdw
  * Slightly different rules on memory allocation.
  *
@@ -208,8 +211,6 @@ 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);
 
@@ -217,10 +218,11 @@ mp *mp_mul(mp *d, mp *a, mp *b)
     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 = 2 * MAX(MP_LEN(a), MP_LEN(b)) + 2;
     mpw *s;
-    m += 32;
+    MP_MODIFY(d, m);
+    m += KARATSUBA_SLOP;
     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);
   }
@@ -248,7 +250,7 @@ mp *mp_sqr(mp *d, mp *a)
   MP_MODIFY(d, 2 * m + 2);
   if (m > KARATSUBA_CUTOFF) {
     mpw *s;
-    m = 2 * (m + 1) + 32;
+    m = 2 * (m + 1) + KARATSUBA_SLOP;
     s = MP_ALLOC(m);
     mpx_ksqr(d->v, d->vl, a->v, a->vl, s, s + m);
     MP_FREE(s);