From f12ef626d161021a1318e8848fef8ca5b0cb65e5 Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 3 Aug 2013 14:20:31 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ bignum.c | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) 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; }