From bb250b002bbb0c079ead456f1bf0a47a394f29be Mon Sep 17 00:00:00 2001 From: mrkn Date: Thu, 8 Nov 2012 22:38:03 +0000 Subject: * bignum.c (bigmul0): enable big_mul_toom3. [ruby-core:48552] [Bug #7242] * bignum.c (bigmul1_toom3): fix incorrect calculation. the patch is made by Heesob Park. [ruby-core:48552] [Bug #7242] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37567 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- bignum.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index d2e5f944ac..97be53faf1 100644 --- a/bignum.c +++ b/bignum.c @@ -2501,7 +2501,7 @@ bigmul1_toom3(VALUE x, VALUE y) z2 = bigtrunc(bigadd(u2, u0, 0)); /* z3 <- (z2 - z3) / 2 + 2 * z(inf) == (z2 - z3) / 2 + 2 * u4 */ - z3 = bigadd(z2, z3, 0); + z3 = bigtrunc(bigadd(z2, z3, 0)); bigrsh_bang(BDIGITS(z3), RBIGNUM_LEN(z3), 1); t = big_lshift(u4, 1); /* TODO: combining with next addition */ z3 = bigtrunc(bigadd(z3, t, 1)); @@ -2617,8 +2617,13 @@ bigmul0(VALUE x, VALUE y) /* balance multiplication by slicing y when x is much smaller than y */ if (2 * xn <= yn) return bigmul1_balance(x, y); - /* multiplication by karatsuba method */ - return bigmul1_karatsuba(x, y); + if (xn < TOOM3_MUL_DIGITS) { + /* multiplication by karatsuba method */ + return bigmul1_karatsuba(x, y); + } + else if (3*xn <= 2*(yn + 2)) + return bigmul1_balance(x, y); + return bigmul1_toom3(x, y); } /* -- cgit v1.2.3