1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
mrkn 2012-11-08 22:38:03 +00:00
parent 9071bbb8cc
commit bb250b002b
3 changed files with 20 additions and 7 deletions

View file

@ -1,6 +1,15 @@
Thu Nov 9 05:33:99 2012 Kenta Murata <mrkn@mrkn.jp>
Thu Nov 9 07:36:00 2012 Kenta Murata <mrkn@mrkn.jp>
* bignum.c (bigmul0): disable big_mul_toom3_temporalily.
* 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]
Thu Nov 9 05:33:00 2012 Kenta Murata <mrkn@mrkn.jp>
* bignum.c (bigmul0): disable big_mul_toom3 temporalily.
[ruby-core:48552] [Bug #7242]
* test/ruby/test_bignum.rb (test_mul_large_numbers):

View file

@ -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);
}
/*

View file

@ -292,7 +292,6 @@ class TestBignum < Test::Unit::TestCase
69131640408147806442422254638590386673344704147156793990832671592488742473
31524606724894164324227362735271650556732855509929890983919463699819116427
].join.to_i
b = %w[
31519454770031243652776765515030872050264386564379909299874378289835540661
99756262835346828114038365624177182230027040172583473561802565238817167503
@ -372,7 +371,7 @@ class TestBignum < Test::Unit::TestCase
21851731257845562153822058534043916834839514338448582518847879059020959697
90538105704766415685100946308842788321400392381169436435078204622400475281
].join.to_i
assert_equal(c, a*b)
assert_equal(c, a*b, '[ruby-core:48552]')
end
def test_divrem