diff --git a/ChangeLog b/ChangeLog index d9b9d3b1e0..82785fb156 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sat Aug 3 22:47:11 2013 Tanaka Akira + + * bignum.c: The branch condition of selecting multiplication + algorighms should check smaller argument because Karatsuba and Toom3 + is effective only if both arguments are big. + (bary_mul_toom3_branch): Compare the smaller argument to + TOOM3_MUL_DIGITS. + (bary_mul): Compare the smaller argument to KARATSUBA_MUL_DIGITS. + Sat Aug 3 22:23:31 2013 Tanaka Akira * bignum.c (big2str_orig): Receive the number to stringize as diff --git a/bignum.c b/bignum.c index 5b75617877..f8d46b23a0 100644 --- a/bignum.c +++ b/bignum.c @@ -2534,7 +2534,7 @@ bary_mul_karatsuba_start(BDIGIT *zds, size_t zl, const BDIGIT *xds, size_t xl, c static void bary_mul_toom3_branch(BDIGIT *zds, size_t zl, const BDIGIT *xds, size_t xl, const BDIGIT *yds, size_t yl, BDIGIT *wds, size_t wl) { - if (yl < TOOM3_MUL_DIGITS) { + if (xl < TOOM3_MUL_DIGITS) { bary_mul_karatsuba_branch(zds, zl, xds, xl, yds, yl, wds, wl); return; } @@ -2560,7 +2560,7 @@ static void bary_mul(BDIGIT *zds, size_t zl, const BDIGIT *xds, size_t xl, const BDIGIT *yds, size_t yl) { if (xl <= yl) { - if (yl < KARATSUBA_MUL_DIGITS) { + if (xl < KARATSUBA_MUL_DIGITS) { if (xds == yds && xl == yl) bary_sq_fast(zds, zl, xds, xl); else @@ -2569,7 +2569,7 @@ bary_mul(BDIGIT *zds, size_t zl, const BDIGIT *xds, size_t xl, const BDIGIT *yds } } else { - if (xl < KARATSUBA_MUL_DIGITS) { + if (yl < KARATSUBA_MUL_DIGITS) { bary_mul1(zds, zl, yds, yl, xds, xl); return; }