ruby-changes:12966
From: akr <ko1@a...>
Date: Sun, 30 Aug 2009 09:46:57 +0900 (JST)
Subject: [ruby-changes:12966] Ruby:r24708 (trunk): * bignum.c (bigmul1_single): new function specialized respect to
akr 2009-08-30 09:46:32 +0900 (Sun, 30 Aug 2009) New Revision: 24708 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24708 Log: * bignum.c (bigmul1_single): new function specialized respect to multiply two single digit bignums. (bigmul0): use bigmul1_single. Modified files: trunk/ChangeLog trunk/bignum.c Index: ChangeLog =================================================================== --- ChangeLog (revision 24707) +++ ChangeLog (revision 24708) @@ -1,3 +1,9 @@ +Sun Aug 30 09:45:11 2009 Tanaka Akira <akr@f...> + + * 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@f...> * timev.h (TIME_SCALE): defined as 1000000000. Index: bignum.c =================================================================== --- bignum.c (revision 24707) +++ bignum.c (revision 24708) @@ -1746,6 +1746,24 @@ } 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 @@ 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); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/