Added a test specifically to tickle Karatsuba; it costs no appreciable
authorTim Peters <tim.peters@gmail.com>
Tue, 13 Aug 2002 21:06:55 +0000 (21:06 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 13 Aug 2002 21:06:55 +0000 (21:06 +0000)
runtime.

Lib/test/test_long.py

index f5416d3d87dcedc4002d504d7b8d653611bf70a1..93197346016ce882b94c9d00b605eb6f243f564f 100644 (file)
@@ -99,7 +99,32 @@ def test_division(maxdigits=MAXDIGITS):
         for leny in digits:
             y = getran(leny) or 1L
             test_division_2(x, y)
+# ------------------------------------------------------------ karatsuba
 
+def test_karatsuba():
+
+    if verbose:
+        print "Karatsuba"
+
+    digits = range(1, 5) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 10)
+    digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
+
+    bits = [digit * SHIFT for digit in digits]
+
+    # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
+    # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
+    for abits in bits:
+        a = (1L << abits) - 1
+        for bbits in bits:
+            if bbits < abits:
+                continue
+            b = (1L << bbits) - 1
+            x = a * b
+            y = ((1L << (abits + bbits)) -
+                 (1L << abits) -
+                 (1L << bbits) +
+                 1)
+            check(x == y, "bad result for", a, "*", b, x, y)
 # -------------------------------------------------------------- ~ & | ^
 
 def test_bitop_identities_1(x):
@@ -403,6 +428,7 @@ def test_logs():
 # ---------------------------------------------------------------- do it
 
 test_division()
+test_karatsuba()
 test_bitop_identities()
 test_format()
 test_misc()