/* -*-c-*-
*
- * $Id: mp-arith.c,v 1.11 2002/10/06 22:52:50 mdw Exp $
+ * $Id: mp-arith.c,v 1.12 2002/10/09 00:36:03 mdw Exp $
*
* Basic arithmetic on multiprecision integers
*
/*----- Revision history --------------------------------------------------*
*
* $Log: mp-arith.c,v $
+ * Revision 1.12 2002/10/09 00:36:03 mdw
+ * Fix bounds on workspace for Karatsuba operations.
+ *
* Revision 1.11 2002/10/06 22:52:50 mdw
* Pile of changes for supporting two's complement properly.
*
MP_DEST(d, MP_LEN(a) + MP_LEN(b), a->f | b->f | MP_UNDEF);
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;
+ size_t m = MAX(MP_LEN(a), MP_LEN(b));
mpw *s;
- MP_DEST(d, m, a->f | b->f | MP_UNDEF);
- m += MPK_SLOP;
- s = mpalloc(d->a, m);
- mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + m);
+ MP_DEST(d, 3 * m, a->f | b->f | MP_UNDEF);
+ s = mpalloc(d->a, 5 * m);
+ mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + 5 * m);
mpfree(d->a, s);
}
size_t m = MP_LEN(a);
a = MP_COPY(a);
- MP_DEST(d, 2 * m + 2, a->f | MP_UNDEF);
if (m > MPK_THRESH) {
mpw *s;
- m = 2 * (m + 1) + MPK_SLOP;
- s = mpalloc(d->a, m);
- mpx_ksqr(d->v, d->vl, a->v, a->vl, s, s + m);
+ MP_DEST(d, 3 * m, a->f | MP_UNDEF);
+ s = mpalloc(d->a, 5 * m);
+ mpx_ksqr(d->v, d->vl, a->v, a->vl, s, s + 5 * m);
mpfree(d->a, s);
- } else
+ } else {
+ MP_DEST(d, 2 * m + 2, a->f | MP_UNDEF);
mpx_usqr(d->v, d->vl, a->v, a->vl);
+ }
d->f = a->f & MP_BURN;
MP_SHRINK(d);
MP_DROP(a);