[pypy-commit] pypy improve-rbigint: Reapply proofs of index >= 0 using unsigned (for mul this could in theory be done even quicker by making a unsigned longlonglong and avoid the cast)

stian noreply at buildbot.pypy.org
Sat Jul 21 18:41:47 CEST 2012


Author: stian
Branch: improve-rbigint
Changeset: r56356:22b6be6db1ba
Date: 2012-07-07 19:22 +0200
http://bitbucket.org/pypy/pypy/changeset/22b6be6db1ba/

Log:	Reapply proofs of index >= 0 using unsigned (for mul this could in
	theory be done even quicker by making a unsigned longlonglong and
	avoid the cast)

diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -1048,7 +1048,7 @@
         # via exploiting that each entry in the multiplication
         # pyramid appears twice (except for the size_a squares).
         z = rbigint([NULLDIGIT] * (size_a + size_b), 1)
-        i = 0
+        i = UDIGIT_TYPE(0)
         while i < size_a:
             f = a.widedigit(i)
             pz = i << 1
@@ -1071,12 +1071,7 @@
                 carry >>= SHIFT
                 #assert carry <= (_widen_digit(MASK) << 1)
             if carry:
-                carry += z.widedigit(pz)
-                z.setdigit(pz, carry)
-                pz += 1
-                carry >>= SHIFT
-                if carry:
-                    z.setdigit(pz, z.widedigit(pz) + carry)
+                z.setdigit(pz, z.widedigit(pz) + carry)
             assert (carry >> SHIFT) == 0
             i += 1
         z._positivenormalize()
@@ -1087,7 +1082,7 @@
 
     z = rbigint([NULLDIGIT] * (size_a + size_b), 1)
     # gradeschool long mult
-    i = 0
+    i = UDIGIT_TYPE(0)
     while i < size_a:
         carry = 0
         f = a.widedigit(i)
@@ -1565,9 +1560,9 @@
         
     size_a = size_v - size_w + 1
     a = rbigint([NULLDIGIT] * size_a, 1)
-    assert size_w >= 2
-    wm1 = w.widedigit(size_w-1)
-    wm2 = w.widedigit(size_w-2)
+
+    wm1 = w.widedigit(abs(size_w-1))
+    wm2 = w.widedigit(abs(size_w-2))
     j = size_v
     k = size_a - 1
     while k >= 0:
@@ -1578,7 +1573,7 @@
             vj = v.widedigit(j)
             
         carry = 0
-        vj1 = v.widedigit(j-1)
+        vj1 = v.widedigit(abs(j-1))
         
         if vj == wm1:
             q = MASK
@@ -1588,7 +1583,7 @@
             q = vv // wm1
             r = _widen_digit(vv) - wm1 * q
         
-        vj2 = v.widedigit(j-2)
+        vj2 = v.widedigit(abs(j-2))
         while wm2 * q > ((r << SHIFT) | vj2):
             q -= 1
             r += wm1
diff --git a/pypy/translator/goal/targetbigintbenchmark.py b/pypy/translator/goal/targetbigintbenchmark.py
--- a/pypy/translator/goal/targetbigintbenchmark.py
+++ b/pypy/translator/goal/targetbigintbenchmark.py
@@ -29,21 +29,21 @@
         Sum: 901.7231250000001
         
         Pypy with improvements:
-        2.887265
-        2.253981
-        2.480497
-        1.572440
-        3.941691
-        9.530685
-        1.786801
-        4.046154
-        4.844644
-        6.412511
-        0.038662
-        3.629173
-        8.155449
-        4.997199
-        Sum:  56.577152
+        2.885155
+        2.301395
+        2.425767
+        1.526053
+        4.066191
+        9.405854
+        1.622019
+        3.089785
+        4.844679
+        6.211589
+        0.038158
+        3.629360
+        8.194571
+        5.000065
+        Sum:  55.240641
 
         A pure python form of those tests where also run
         Improved pypy           | Pypy                  | CPython 2.7.3
@@ -65,7 +65,7 @@
     sumTime = 0.0
     
     
-    t = time()
+    """t = time()
     by = rbigint.pow(rbigint.fromint(63), rbigint.fromint(100))
     for n in xrange(9900):
         by2 = by.lshift(63)
@@ -75,7 +75,7 @@
 
     _time = time() - t
     sumTime += _time
-    print "Toom-cook effectivity 100-10000 digits:", _time
+    print "Toom-cook effectivity 100-10000 digits:", _time"""
     
     t = time()
     num = rbigint.pow(rbigint.fromint(100000000), rbigint.fromint(1024))


More information about the pypy-commit mailing list