diff options
author | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-08 22:38:03 +0000 |
---|---|---|
committer | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-08 22:38:03 +0000 |
commit | bb250b002bbb0c079ead456f1bf0a47a394f29be (patch) | |
tree | f5d604a3962de5acecc091319c9a711690669d7a | |
parent | 9071bbb8cc28c8a0fc7dd9d1d0d6c8be5f506f24 (diff) |
* 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
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | bignum.c | 11 | ||||
-rw-r--r-- | test/ruby/test_bignum.rb | 3 |
3 files changed, 20 insertions, 7 deletions
@@ -1,6 +1,15 @@ -Thu Nov 9 05:33:99 2012 Kenta Murata <[email protected]> +Thu Nov 9 07:36:00 2012 Kenta Murata <[email protected]> - * 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 <[email protected]> + + * bignum.c (bigmul0): disable big_mul_toom3 temporalily. [ruby-core:48552] [Bug #7242] * test/ruby/test_bignum.rb (test_mul_large_numbers): @@ -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); } /* diff --git a/test/ruby/test_bignum.rb b/test/ruby/test_bignum.rb index 0e6dea5b93..b1497a9146 100644 --- a/test/ruby/test_bignum.rb +++ b/test/ruby/test_bignum.rb @@ -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 |