# HG changeset patch
# User Carl Witty <cwitty@newtonlabs.com>
# Date 1215987088 25200
# Node ID fd218c6a75d100fd8e47095e25272113f0240488
# Parent  1be7586b568c14c29f194c433fb95523610e64e6
Asymptotically speed up .random_element() for ambient free modules

diff -r 1be7586b568c -r fd218c6a75d1 sage/modules/free_module.py
--- a/sage/modules/free_module.py	Sun Jul 13 12:11:04 2008 -0700
+++ b/sage/modules/free_module.py	Sun Jul 13 15:11:28 2008 -0700
@@ -2992,6 +2992,38 @@
     def echelon_coordinates(self, v, check=True):
         return self.coordinate_vector(v, check=check)
 
+    def random_element(self, prob=1.0, **kwds):
+        """
+        Returns a random element of self.
+        
+        INPUT:
+            prob -- float; probability that given coefficient is nonzero.
+            **kwds -- passed on to random_element function of base ring.
+        
+        EXAMPLES:
+            sage: M = FreeModule(ZZ, 3)
+            sage: M.random_element()
+            (-1, 2, 1)
+            sage: M.random_element()
+            (-95, -1, -2)
+            sage: M.random_element()
+            (-12, 0, 0)
+
+            sage: M = FreeModule(ZZ, 16)
+            sage: M.random_element()
+            (1, -1, 1, -1, -2, -1, 4, -4, -6, 5, 0, 0, -2, 0, 1, -4)
+            sage: M.random_element(prob=0.3)
+            (0, 0, 0, 0, 0, 0, 0, -6, 1, -1, 1, 0, 1, 0, 0, 0)
+        """
+        rand = current_randstate().python_random().random
+        R = self.base_ring()
+        v = self(0)
+        prob = float(prob)
+        for i in range(self.rank()):
+            if rand() <= prob:
+                v[i] = R.random_element(**kwds)
+        return v
+
     
 ###############################################################################
 #
