From bba03f55f14e99019d7afd0ba97ab4c90039c481 Mon Sep 17 00:00:00 2001 From: mdw Date: Wed, 22 Dec 1999 15:54:41 +0000 Subject: [PATCH] Adjust Karatsuba parameters. Calculate destination size better. --- mp-arith.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mp-arith.c b/mp-arith.c index c055f95..f0502e1 100644 --- a/mp-arith.c +++ b/mp-arith.c @@ -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); -- 2.11.0