diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-08 13:05:57 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-08 13:05:57 +0000 |
commit | 6fdad008a2bf2e28db5029104b51373b767021fd (patch) | |
tree | 068375d8277b90188bfbc623e62c2c3639b1d6f7 /bignum.c | |
parent | 85855a22420bb6e2fd244f294c844106c992141a (diff) | |
download | ruby-6fdad008a2bf2e28db5029104b51373b767021fd.tar.gz |
* bignum.c (rb_big_sq_fast): New function for testing.
(rb_big_mul_toom3): Ditto.
* internal.h (rb_big_sq_fast): Declared.
(rb_big_mul_toom3): Ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41832 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 25 |
1 files changed, 22 insertions, 3 deletions
@@ -1515,7 +1515,8 @@ bary_sq_fast(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn) MEMZERO(zds, BDIGIT, zn); for (i = 0; i < xn; i++) { v = (BDIGIT_DBL)xds[i]; - if (!v) continue; + if (!v) + continue; c = (BDIGIT_DBL)zds[i + i] + v * v; zds[i + i] = BIGLO(c); c = BIGDN(c); @@ -1525,18 +1526,30 @@ bary_sq_fast(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn) c += (BDIGIT_DBL)zds[i + j] + BIGLO(v) * w; zds[i + j] = BIGLO(c); c = BIGDN(c); - if (BIGDN(v)) c += w; + if (BIGDN(v)) + c += w; } if (c) { c += (BDIGIT_DBL)zds[i + xn]; zds[i + xn] = BIGLO(c); c = BIGDN(c); assert(c == 0 || i != xn-1); - if (c && i != xn-1) zds[i + xn + 1] += (BDIGIT)c; + if (c && i != xn-1) + zds[i + xn + 1] += (BDIGIT)c; } } } +VALUE +rb_big_sq_fast(VALUE x) +{ + size_t xn = RBIGNUM_LEN(x), zn = 2 * xn; + VALUE z = bignew(zn, 1); + bary_sq_fast(BDIGITS(z), zn, BDIGITS(x), xn); + RB_GC_GUARD(x); + return z; +} + /* balancing multiplication by slicing larger argument */ static void bary_mul_balance(BDIGIT *zds, size_t zl, BDIGIT *xds, size_t xl, BDIGIT *yds, size_t yl) @@ -4626,6 +4639,12 @@ bigmul1_toom3(VALUE x, VALUE y) return bignorm(z); } +VALUE +rb_big_mul_toom3(VALUE x, VALUE y) +{ + return bigmul1_toom3(x, y); +} + static VALUE bigmul0(VALUE x, VALUE y) { |