Kill reduce().  A coproduction of John Reese, Jacques Frechet, and Alex M.
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 13a5241..b0dbd4a 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1393,32 +1393,6 @@
         self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
         self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
 
-    def test_reduce(self):
-        self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
-        self.assertEqual(
-            reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
-            ['a','c','d','w']
-        )
-        self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
-        self.assertEqual(
-            reduce(lambda x, y: x*y, range(2,21), 1L),
-            2432902008176640000L
-        )
-        self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
-        self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
-        self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
-        self.assertRaises(TypeError, reduce)
-        self.assertRaises(TypeError, reduce, 42, 42)
-        self.assertRaises(TypeError, reduce, 42, 42, 42)
-        self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
-        self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
-        self.assertRaises(TypeError, reduce, 42, (42, 42))
-
-        class BadSeq:
-            def __getitem__(self, index):
-                raise ValueError
-        self.assertRaises(ValueError, reduce, 42, BadSeq())
-
     def test_reload(self):
         import marshal
         reload(marshal)
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py
index f83de78..324eb68 100644
--- a/Lib/test/test_iter.py
+++ b/Lib/test/test_iter.py
@@ -498,19 +498,6 @@
             for y in NoGuessLen5(), Guess3Len5(), Guess30Len5():
                 self.assertEqual(zip(x, y), expected)
 
-    # Test reduces()'s use of iterators.
-    def test_builtin_reduce(self):
-        from operator import add
-        self.assertEqual(reduce(add, SequenceClass(5)), 10)
-        self.assertEqual(reduce(add, SequenceClass(5), 42), 52)
-        self.assertRaises(TypeError, reduce, add, SequenceClass(0))
-        self.assertEqual(reduce(add, SequenceClass(0), 42), 42)
-        self.assertEqual(reduce(add, SequenceClass(1)), 0)
-        self.assertEqual(reduce(add, SequenceClass(1), 42), 42)
-
-        d = {"one": 1, "two": 2, "three": 3}
-        self.assertEqual(reduce(add, d), "".join(d.keys()))
-
     # This test case will be removed if we don't have Unicode
     def test_unicode_join_endcase(self):
 
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index bba4c7c..afcf113 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -77,7 +77,9 @@
         pop = range(n)
         trials = 10000  # large num prevents false negatives without slowing normal case
         def factorial(n):
-            return reduce(int.__mul__, xrange(1, n), 1)
+            if n == 0:
+                return 1
+            return n * factorial(n - 1)
         for k in xrange(n):
             expected = factorial(n) // factorial(n-k)
             perms = {}