]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
mjo/clan/clan.py: Vinberg cone automorphisms (WIP)
authorMichael Orlitzky <michael@orlitzky.com>
Fri, 20 Feb 2026 20:33:55 +0000 (15:33 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Fri, 20 Feb 2026 20:33:55 +0000 (15:33 -0500)
This proof-of-concept is mostly working, but the tests are crashing
for some reason.

mjo/clan/clan.py

index 9435f737d5a8c69630b9baeaea31e3abd97bc0d4..bec08fa9cf2bd83ea12804d7b6a00823790f8486 100644 (file)
@@ -789,6 +789,105 @@ class VinbergClan(NormalDecomposition):
         """
         return f"Vinberg clan over {self.base_ring()}"
 
+    def random_triangular_cone_automorphism(self):
+        r"""
+        Generate a random triangular automorphism of the Vinberg cone.
+
+        Elliot Herrington in his thesis "Highly symmetric homogeneous
+        Kobayashi-hyperbolic manifolds" gives a formula for the
+        connected component of the identity in the group of triangular
+        automorphisms. This won't generate the whole group, but it's
+        a good start.
+        """
+        from sage.matrix.matrix_space import MatrixSpace
+        R = self.base_ring()
+        MS = MatrixSpace(R, 5)
+
+        # Herrington's notation for triangular automorphisms
+        a = R._random_nonzero_element().abs()
+        b = R.random_element()
+        c = R.random_element()
+        e = R._random_nonzero_element()
+        i = R._random_nonzero_element()
+
+        T = MS([ [a**2, b**2, c**2, 2*a*b, 2*a*c],
+                 [   0, e**2,    0,     0,     0],
+                 [   0,    0, i**2,     0,     0],
+                 [   0,  b*e,    0,   a*e,     0],
+                 [   0,    0,  c*i,     0,   a*i] ])
+
+        from mjo.clan.clan_operator import ClanOperator
+        return ClanOperator(self, self, T)
+
+
+    def random_isotropy_cone_automorphism(self):
+        r"""
+        Generate a random automorphism of the Vinberg cone that
+        fixes the unit element.
+
+        This is effectively a guess, based on the work done by Ishi
+        and Koufany for the **dual** Vinberg cone.
+
+        TESTS:
+
+        Evidence for the conjecture that these preserve the two trace
+        inner products::
+
+            sage: C = VinbergClan()
+            sage: isinstance(C, Clan)
+            True
+            sage: A = C.random_isotropy_cone_automorphism()
+            sage: A(C.one()) == C.one()
+            True
+            sage: x = C.random_element()
+            sage: y = C.random_element()
+            sage: x.inner_product(y) == A(x).inner_product(A(y))
+            True
+            sage: expected = x.inner_product_vinberg(y)
+            sage: actual = A(x).inner_product_vinberg(A(y))
+            sage: actual == expected
+            True
+
+        """
+        from sage.matrix.matrix_space import MatrixSpace
+        MS = MatrixSpace(self.base_ring(), 5)
+        # Now the generators of the isotropy subgroup (inspired by
+        # Ishi/Kounfany, but basically just guessing and checking).
+        #
+        # x21 -> -x21
+        g1 = MS([ [1, 0,0,0,0],
+                  [0,-1,0,0,0],
+                  [0, 0,1,0,0],
+                  [0, 0,0,1,0],
+                  [0, 0,0,0,1] ])
+        # x31 -> -x31
+        g2 = MS([ [1,0,0, 0,0],
+                  [0,1,0, 0,0],
+                  [0,0,1, 0,0],
+                  [0,0,0,-1,0],
+                  [0,0,0, 0,1] ])
+        # x32 <-> x33, x21 <-> x31
+        g3 = MS([ [1,0,0,0,0],
+                  [0,0,0,1,0],
+                  [0,0,0,0,1],
+                  [0,1,0,0,0],
+                  [0,0,1,0,0] ])
+
+        # Group is order eight?
+        gs = [MS.one(), g1, g2, g3, g1*g2, g1*g3, g3*g1, g3*g2]
+
+        from random import choice
+        from mjo.clan.clan_operator import ClanOperator
+        return ClanOperator(self, self, choice(gs))
+
+    def random_cone_automorphism(self):
+        r"""
+        Generate a random automorphism of the Vinberg cone.
+        """
+        T = self.random_triangular_cone_automorphism()
+        K = self.random_isotropy_cone_automorphism()
+        return T*K
+
     def from_matrices(self, A, B):
         r"""
         Construct an element of this clan from a pair of