def random_isometry(self, preserve_orientation=True, **kwargs): r""" Return a random isometry in the Upper Half Plane model. INPUT: - ``preserve_orientation`` -- if ``True`` return an orientation-preserving isometry OUTPUT: - a hyperbolic isometry EXAMPLES:: sage: A = HyperbolicPlane().UHP().random_isometry() sage: B = HyperbolicPlane().UHP().random_isometry(preserve_orientation=False) sage: B.preserves_orientation() False """ [a,b,c,d] = [RR.random_element() for k in range(4)] while abs(a*d - b*c) < EPSILON: [a,b,c,d] = [RR.random_element() for k in range(4)] M = matrix(RDF, 2,[a,b,c,d]) M = M / (M.det()).abs().sqrt() if M.det() > 0: if not preserve_orientation: M = M * matrix(2,[0,1,1,0]) elif preserve_orientation: M = M * matrix(2,[0,1,1,0]) return self._Isometry(self, M, check=False)
def random_isometry(self, preserve_orientation=True, **kwargs): r""" Return a random isometry in the Upper Half Plane model. INPUT: - ``preserve_orientation`` -- if ``True`` return an orientation-preserving isometry OUTPUT: - a hyperbolic isometry EXAMPLES:: sage: A = HyperbolicPlane().UHP().random_isometry() sage: B = HyperbolicPlane().UHP().random_isometry(preserve_orientation=False) sage: B.preserves_orientation() False """ [a, b, c, d] = [RR.random_element() for k in range(4)] while abs(a * d - b * c) < EPSILON: [a, b, c, d] = [RR.random_element() for k in range(4)] M = matrix(RDF, 2, [a, b, c, d]) M = M / (M.det()).abs().sqrt() if M.det() > 0: if not preserve_orientation: M = M * matrix(2, [0, 1, 1, 0]) elif preserve_orientation: M = M * matrix(2, [0, 1, 1, 0]) return self._Isometry(self, M, check=False)
def random_point(self, **kwargs): r""" Return a random point in the upper half plane. The points are uniformly distributed over the rectangle `[-10, 10] \times [0, 10i]`. EXAMPLES:: sage: p = HyperbolicPlane().UHP().random_point().coordinates() sage: bool((p.imag()) > 0) True """ # TODO: use **kwargs to allow these to be set real_min = -10 real_max = 10 imag_min = 0 imag_max = 10 p = RR.random_element(min=real_min, max=real_max) \ + I * RR.random_element(min=imag_min, max=imag_max) return self.get_point(p)