diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-30 00:46:32 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-30 00:46:32 +0000 |
commit | 51016983ce03f8ffadba819d25ca2d91fe9bafc9 (patch) | |
tree | 9565ad5bc3f8a08dd30e08cc6bbe8037e51d4f74 | |
parent | 6079f0a01ba0aa153979ce2f023d126045b5cd5b (diff) | |
download | ruby-51016983ce03f8ffadba819d25ca2d91fe9bafc9.tar.gz ruby-51016983ce03f8ffadba819d25ca2d91fe9bafc9.tar.xz ruby-51016983ce03f8ffadba819d25ca2d91fe9bafc9.zip |
* bignum.c (bigmul1_single): new function specialized respect to
multiply two single digit bignums.
(bigmul0): use bigmul1_single.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@24708 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | bignum.c | 19 |
2 files changed, 25 insertions, 0 deletions
@@ -1,3 +1,9 @@ +Sun Aug 30 09:45:11 2009 Tanaka Akira <akr@fsij.org> + + * bignum.c (bigmul1_single): new function specialized respect to + multiply two single digit bignums. + (bigmul0): use bigmul1_single. + Sun Aug 30 03:59:43 2009 Tanaka Akira <akr@fsij.org> * timev.h (TIME_SCALE): defined as 1000000000. @@ -1746,6 +1746,24 @@ big_real_len(VALUE x) } static VALUE +bigmul1_single(VALUE x, VALUE y) +{ + BDIGIT_DBL n; + VALUE z = bignew(2, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y)); + BDIGIT *xds, *yds, *zds; + + xds = BDIGITS(x); + yds = BDIGITS(y); + zds = BDIGITS(z); + + n = (BDIGIT_DBL)xds[0] * yds[0]; + zds[0] = BIGLO(n); + zds[1] = BIGDN(n); + + return z; +} + +static VALUE bigmul1_normal(VALUE x, VALUE y) { long xl = RBIGNUM_LEN(x), yl = RBIGNUM_LEN(y), i, j = xl + yl + 1; @@ -2022,6 +2040,7 @@ bigmul0(VALUE x, VALUE y) if (xn < KARATSUBA_MUL_DIGITS) { normal: if (x == y) return bigsqr_fast(x); + if (xn == 1 && yn == 1) return bigmul1_single(x, y); return bigmul1_normal(x, y); } |