[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]