X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/d1c733526062c5e1a2fb87edc35ebbaa4f9aa0fc..dd22938ef0d9b0131dad9171a8a95866ceec9607:/mp-arith.c diff --git a/mp-arith.c b/mp-arith.c index d31309b..23137e2 100644 --- a/mp-arith.c +++ b/mp-arith.c @@ -1,6 +1,6 @@ /* -*-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 * @@ -30,6 +30,9 @@ /*----- 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. * @@ -421,12 +424,11 @@ mp *mp_mul(mp *d, mp *a, mp *b) 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); } @@ -450,15 +452,16 @@ mp *mp_sqr(mp *d, mp *a) 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);