summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-08 13:05:57 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-08 13:05:57 +0000
commit6fdad008a2bf2e28db5029104b51373b767021fd (patch)
tree068375d8277b90188bfbc623e62c2c3639b1d6f7 /bignum.c
parent85855a22420bb6e2fd244f294c844106c992141a (diff)
* 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.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/bignum.c b/bignum.c
index eed2181955..1e87b2e519 100644
--- a/bignum.c
+++ b/bignum.c
@@ -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)
{