Cubic Braid Groups - Groups

Skip to content
Back to top
View this page
Edit this page

# Cubic Braid Groups

This module is devoted to factor groups of the Artin braid groups, such that the images \(s_i\) of the braid generators have order three:

\[s_i^3 = 1.\]

In general these groups have firstly been investigated by Coxeter, H.S.M. in: “Factor groups of the braid groups, Proceedings of the Fourth Canadian Mathematical Congress (Vancouver 1957), pp. 95-122”.

Coxeter showed, that these groups are finite as long as the number of strands is less than 6 and infinite else-wise. More explicitly the factor group on three strand braids is isomorphic to \(SL(2,3)\), on four strand braids to \(GU(3,2)\) and on five strand braids to \(Sp(4,3) \times C_3\). Today, these finite groups are known as irreducible complex reflection groups enumerated in the Shephard-Todd classification as \(G_{4}\), \(G_{25}\) and \(G_{32}\).

Coxeter realized these groups as subgroups of unitary groups with respect to a certain Hermitian form over the complex numbers (in fact over \(\QQ\) adjoined with a primitive \(12\)-th root of unity).

In “Einige endliche Faktorgruppen der Zopfgruppen” (Math. Z., 163 (1978), 291-302) J. Assion considered two series \(S(m)\) and \(U(m)\) of finite factors of these groups. The additional relations on the braid group generators \(\{ s_1, \cdots, s_{m-1}\}\) are

\[\begin{split}\begin{array}{lll} \mbox{S:} & s_3 s_1 t_2 s_1 t_2^{-1} t_3 t_2 s_1 t_2^{-1} t_3^{-1} = 1 & \mbox{ for } m >= 5 \mbox{ in case } S(m)\\ \mbox{U:} & t_1 t_3 = 1 & \mbox{ for } m >= 5 \mbox{ in case } U(m) \end{array}\end{split}\]

where \(t_i = (s_i s_{i+1})^3\). He showed that each series of finite cubic braid group factors must be an epimorphic image of one of his two series, as long as the groups with less than 5 strands are the full cubic braid groups, whereas the group on 5 strands is not. He realized the groups \(S(m)\) as symplectic groups over \(GF(3)\) (resp. subgroups therein) and \(U(m)\) as general unitary groups over \(GF(4)\) (resp. subgroups therein).

All the groups considered by Coxeter and Assion are considered as finitely presented groups together with the classical realizations. It also allows for the conversion maps between the two realizations. In addition, we can construct other realizations and maps to matrix groups with help of the Burau representation. In case `gap3` and `CHEVIE` are installed, the reflection groups (via the `gap3` interface) are available, too. This can be done using the methods `as_classical_group()`, `as_matrix_group()`, `as_permutation_group()`, and `as_reflection_group()`.

REFERENCES:

- [Cox1957]

- [Ass1978]

AUTHORS:

- Sebastian Oehms 2019-02-16, initial version.

sage.groups.cubic_braid.AssionGroupS(n=None, names='s')

  Construct cubic braid groups `CubicBraidGroup` which have been investigated by J.Assion using the notation S(m). This function is a short hand cut for setting the construction arguments `cbg_type=CubicBraidGroup.type.AssionS` and default `names='s'`.

  INPUT:

  - `n` – integer (optional); the number of strands

  - `names` – (default: `'s'`) string or list/tuple/iterable of strings

  See also

  `CubicBraidGroup`

  EXAMPLES:

  Sage

      sage: S3 = AssionGroupS(3);  S3
      Assion group on 3 strands of type S
      sage: S3x = CubicBraidGroup(3, names='s', cbg_type=CubicBraidGroup.type.AssionS); S3x
      Assion group on 3 strands of type S
      sage: S3 == S3x
      True

  Python

      >>> from sage.all import *
      >>> S3 = AssionGroupS(Integer(3));  S3
      Assion group on 3 strands of type S
      >>> S3x = CubicBraidGroup(Integer(3), names='s', cbg_type=CubicBraidGroup.type.AssionS); S3x
      Assion group on 3 strands of type S
      >>> S3 == S3x
      True

sage.groups.cubic_braid.AssionGroupU(n=None, names='u')

  Construct cubic braid groups as instance of `CubicBraidGroup` which have been investigated by J.Assion using the notation U(m). This function is a short hand cut for setting the construction arguments `cbg_type=CubicBraidGroup.type.AssionU` and default `names='u'`.

  INPUT:

  - `n` – integer (optional); the number of strands

  - `names` – (default: `'s'`) string or list/tuple/iterable of strings

  See also

  `CubicBraidGroup`

  EXAMPLES:

  Sage

      sage: U3 = AssionGroupU(3);  U3
      Assion group on 3 strands of type U
      sage: U3x = CubicBraidGroup(3, names='u', cbg_type=CubicBraidGroup.type.AssionU); U3x
      Assion group on 3 strands of type U
      sage: U3 == U3x
      True

  Python

      >>> from sage.all import *
      >>> U3 = AssionGroupU(Integer(3));  U3
      Assion group on 3 strands of type U
      >>> U3x = CubicBraidGroup(Integer(3), names='u', cbg_type=CubicBraidGroup.type.AssionU); U3x
      Assion group on 3 strands of type U
      >>> U3 == U3x
      True

class sage.groups.cubic_braid.CubicBraidElement(parent, x, check=True)

  Bases: `FinitelyPresentedGroupElement`

  Elements of cubic factor groups of the braid group.

  For more information see `CubicBraidGroup`.

  EXAMPLES:

  Sage

      sage: C4.<c1, c2, c3> = CubicBraidGroup(4); C4
      Cubic Braid group on 4 strands
      sage: ele1 = c1*c2*c3^-1*c2^-1
      sage: ele2 = C4((1, 2, -3, -2))
      sage: ele1 == ele2
      True

  Python

      >>> from sage.all import *
      >>> C4 = CubicBraidGroup(Integer(4), names=('c1', 'c2', 'c3',)); (c1, c2, c3,) = C4._first_ngens(3); C4
      Cubic Braid group on 4 strands
      >>> ele1 = c1*c2*c3**-Integer(1)*c2**-Integer(1)
      >>> ele2 = C4((Integer(1), Integer(2), -Integer(3), -Integer(2)))
      >>> ele1 == ele2
      True

  braid()

    Return the canonical braid preimage of `self` as a `Braid`.

    EXAMPLES:

    Sage

        sage: C3.<c1, c2> = CubicBraidGroup(3)
        sage: c1.parent()
        Cubic Braid group on 3 strands
        sage: c1.braid().parent()
        Braid group on 3 strands

    Python

        >>> from sage.all import *
        >>> C3 = CubicBraidGroup(Integer(3), names=('c1', 'c2',)); (c1, c2,) = C3._first_ngens(2)
        >>> c1.parent()
        Cubic Braid group on 3 strands
        >>> c1.braid().parent()
        Braid group on 3 strands

  burau_matrix(root_bur=None, domain=None, characteristic=None, var='t', reduced=False)

    Return the Burau matrix of the cubic braid coset.

    This method uses the same method belonging to `Braid`, but reduces the indeterminate to a primitive sixth (resp. twelfth in case `reduced='unitary'`) root of unity.

    INPUT (all arguments are optional keywords):

    - `root_bur` – six (resp. twelfth) root of unity in some field (default: root of unity over \(\QQ\))

    - `domain` – (default: cyclotomic field of order 3 and degree 2, resp. the domain of `root_bur` if given) base ring for the Burau matrix

    - `characteristic` – integer giving the characteristic of the domain (default: 0 or the characteristic of `domain` if given)

    - `var` – string used for the indeterminate name in case `root_bur` must be constructed in a splitting field

    - `reduced` – boolean or string (default: `False`); for more information see the documentation of `burau_matrix()` of `Braid`

    OUTPUT:

    The Burau matrix of the cubic braid coset with entries in the domain given by the options. In case the option `reduced='unitary'` is given a triple consisting of the Burau matrix, its adjoined and the Hermitian form is returned.

    EXAMPLES:

    Sage

        sage: C3.<c1, c2> = CubicBraidGroup(3)
        sage: ele = c1*c2*c1

        sage: # needs sage.rings.number_field
        sage: BuMa = ele.burau_matrix(); BuMa
        [  -zeta3         1     zeta3]
        [  -zeta3 zeta3 + 1         0]
        [       1         0         0]
        sage: BuMa.base_ring()
        Cyclotomic Field of order 3 and degree 2
        sage: BuMa == ele.burau_matrix(characteristic=0)
        True
        sage: BuMa = ele.burau_matrix(domain=QQ); BuMa
        [-t + 1      1  t - 1]
        [-t + 1      t      0]
        [     1      0      0]
        sage: BuMa.base_ring()
        Number Field in t with defining polynomial t^2 - t + 1
        sage: BuMa = ele.burau_matrix(domain = QQ[I, sqrt(3)]); BuMa                # needs sage.symbolic
        [ 1/2*sqrt3*I + 1/2                  1 -1/2*sqrt3*I - 1/2]
        [ 1/2*sqrt3*I + 1/2 -1/2*sqrt3*I + 1/2                  0]
        [                 1                  0                  0]
        sage: BuMa.base_ring()                                                      # needs sage.symbolic
        Number Field in I with defining polynomial x^2 + 1 over its base field

        sage: BuMa = ele.burau_matrix(characteristic=7); BuMa
        [3 1 4]
        [3 5 0]
        [1 0 0]
        sage: BuMa.base_ring()
        Finite Field of size 7

        sage: # needs sage.rings.finite_rings
        sage: BuMa = ele.burau_matrix(characteristic=2); BuMa
        [t + 1     1 t + 1]
        [t + 1     t     0]
        [    1     0     0]
        sage: BuMa.base_ring()
        Finite Field in t of size 2^2
        sage: F4.<r64> = GF(4)
        sage: BuMa = ele.burau_matrix(root_bur=r64); BuMa
        [r64 + 1       1 r64 + 1]
        [r64 + 1     r64       0]
        [      1       0       0]
        sage: BuMa.base_ring()
        Finite Field in r64 of size 2^2
        sage: BuMa = ele.burau_matrix(domain=GF(5)); BuMa
        [2*t + 2       1 3*t + 3]
        [2*t + 2 3*t + 4       0]
        [      1       0       0]
        sage: BuMa.base_ring()
        Finite Field in t of size 5^2

        sage: # needs sage.rings.number_field
        sage: BuMa, BuMaAd, H = ele.burau_matrix(reduced='unitary'); BuMa
        [       0 zeta12^3]
        [zeta12^3        0]
        sage: BuMa * H * BuMaAd == H
        True
        sage: BuMa.base_ring()
        Cyclotomic Field of order 12 and degree 4
        sage: BuMa, BuMaAd, H = ele.burau_matrix(domain=QQ[I, sqrt(3)],             # needs sage.symbolic
        ....:                                    reduced='unitary'); BuMa
        [0 I]
        [I 0]
        sage: BuMa.base_ring()                                                      # needs sage.symbolic
        Number Field in I with defining polynomial x^2 + 1 over its base field

    Python

        >>> from sage.all import *
        >>> C3 = CubicBraidGroup(Integer(3), names=('c1', 'c2',)); (c1, c2,) = C3._first_ngens(2)
        >>> ele = c1*c2*c1

        >>> # needs sage.rings.number_field
        >>> BuMa = ele.burau_matrix(); BuMa
        [  -zeta3         1     zeta3]
        [  -zeta3 zeta3 + 1         0]
        [       1         0         0]
        >>> BuMa.base_ring()
        Cyclotomic Field of order 3 and degree 2
        >>> BuMa == ele.burau_matrix(characteristic=Integer(0))
        True
        >>> BuMa = ele.burau_matrix(domain=QQ); BuMa
        [-t + 1      1  t - 1]
        [-t + 1      t      0]
        [     1      0      0]
        >>> BuMa.base_ring()
        Number Field in t with defining polynomial t^2 - t + 1
        >>> BuMa = ele.burau_matrix(domain = QQ[I, sqrt(Integer(3))]); BuMa                # needs sage.symbolic
        [ 1/2*sqrt3*I + 1/2                  1 -1/2*sqrt3*I - 1/2]
        [ 1/2*sqrt3*I + 1/2 -1/2*sqrt3*I + 1/2                  0]
        [                 1                  0                  0]
        >>> BuMa.base_ring()                                                      # needs sage.symbolic
        Number Field in I with defining polynomial x^2 + 1 over its base field

        >>> BuMa = ele.burau_matrix(characteristic=Integer(7)); BuMa
        [3 1 4]
        [3 5 0]
        [1 0 0]
        >>> BuMa.base_ring()
        Finite Field of size 7

        >>> # needs sage.rings.finite_rings
        >>> BuMa = ele.burau_matrix(characteristic=Integer(2)); BuMa
        [t + 1     1 t + 1]
        [t + 1     t     0]
        [    1     0     0]
        >>> BuMa.base_ring()
        Finite Field in t of size 2^2
        >>> F4 = GF(Integer(4), names=('r64',)); (r64,) = F4._first_ngens(1)
        >>> BuMa = ele.burau_matrix(root_bur=r64); BuMa
        [r64 + 1       1 r64 + 1]
        [r64 + 1     r64       0]
        [      1       0       0]
        >>> BuMa.base_ring()
        Finite Field in r64 of size 2^2
        >>> BuMa = ele.burau_matrix(domain=GF(Integer(5))); BuMa
        [2*t + 2       1 3*t + 3]
        [2*t + 2 3*t + 4       0]
        [      1       0       0]
        >>> BuMa.base_ring()
        Finite Field in t of size 5^2

        >>> # needs sage.rings.number_field
        >>> BuMa, BuMaAd, H = ele.burau_matrix(reduced='unitary'); BuMa
        [       0 zeta12^3]
        [zeta12^3        0]
        >>> BuMa * H * BuMaAd == H
        True
        >>> BuMa.base_ring()
        Cyclotomic Field of order 12 and degree 4
        >>> BuMa, BuMaAd, H = ele.burau_matrix(domain=QQ[I, sqrt(Integer(3))],             # needs sage.symbolic
        ...                                    reduced='unitary'); BuMa
        [0 I]
        [I 0]
        >>> BuMa.base_ring()                                                      # needs sage.symbolic
        Number Field in I with defining polynomial x^2 + 1 over its base field

class sage.groups.cubic_braid.CubicBraidGroup(names, cbg_type=None)

  Bases: `UniqueRepresentation`, `FinitelyPresentedGroup`

  Factor groups of the Artin braid group mapping their generators to elements of order 3.

  These groups are implemented as a particular case of finitely presented groups similar to the `BraidGroup_class`.

  A cubic braid group can be created by giving the number of strands, and the name of the generators in a similar way as it works for the `BraidGroup_class`.

  INPUT:

  - `names` – see the corresponding documentation of `BraidGroup_class`

  - `cbg_type` – (default: `CubicBraidGroup.type.Coxeter`; see explanation below) enum type `CubicBraidGroup.type`

  Setting the keyword `cbg_type` to one on the values `CubicBraidGroup.type.AssionS` or `CubicBraidGroup.type.AssionU`, the additional relations due to Assion are added:

  \[\begin{split}\begin{array}{lll} \mbox{S:} & s_3 s_1 t_2 s_1 t_2^{-1} t_3 t_2 s_1 t_2^{-1} t_3^{-1} = 1 & \mbox{ for } m >= 5 \mbox{ in case } S(m), \\ \mbox{U:} & t_1 t_3 = 1 & \mbox{ for } m >= 5 \mbox{ in case } U(m), \end{array}\end{split}\]

  where \(t_i = (s_i s_{i+1})^3\). If `cbg_type == CubicBraidGroup.type.Coxeter` (default) only the cubic relation on the generators is active (Coxeter’s case of investigation). Note that for \(n = 2, 3, 4\), the groups do not differ between the three possible values of `cbg_type` (as finitely presented groups). However, the `CubicBraidGroup.type.Coxeter`, `CubicBraidGroup.type.AssionS` and `CubicBraidGroup.type.AssionU` are different, so they have different classical realizations implemented.

  See also

  Instances can also be constructed more easily by using `CubicBraidGroup()`, `AssionGroupS()` and `AssionGroupU()`.

  EXAMPLES:

  Sage

      sage: U3 = CubicBraidGroup(3, cbg_type=CubicBraidGroup.type.AssionU); U3
      Assion group on 3 strands of type U
      sage: U3.gens()
      (c0, c1)

  Python

      >>> from sage.all import *
      >>> U3 = CubicBraidGroup(Integer(3), cbg_type=CubicBraidGroup.type.AssionU); U3
      Assion group on 3 strands of type U
      >>> U3.gens()
      (c0, c1)

  Alternative possibilities defining `U3`:

  Sage

      sage: U3 = AssionGroupU(3); U3
      Assion group on 3 strands of type U
      sage: U3.gens()
      (u0, u1)
      sage: U3.<u1,u2> = AssionGroupU(3); U3
      Assion group on 3 strands of type U
      sage: U3.gens()
      (u1, u2)

  [Python]

      >>> from sage.all import *
      >>> U3 = AssionGroupU(Integer(3)); U3
      Assion group on 3 strands of type U
      >>> U3.gens()
      (u0, u1)
      >>> U3 = AssionGroupU(Integer(3), names=('u1', 'u2',)); (u1, u2,) = U3._first_ngens(2); U3
      Assion group on 3 strands of type U
      >>> U3.gens()
      (u1, u2)

  Alternates naming the generators:

  Sage

      sage: U3 = AssionGroupU(3, 'a, b'); U3
      Assion group on 3 strands of type U
      sage: U3.gens()
      (a, b)
      sage: C3 = CubicBraidGroup(3, 't'); C3
      Cubic Braid group on 3 strands
      sage: C3.gens()
      (t0, t1)
      sage: U3.is_isomorphic(C3)
      True
      sage: U3.as_classical_group()
      Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                             (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)]
       of (The projective general unitary group of degree 3 over Finite Field of size 2)
      sage: C3.as_classical_group()
      Subgroup with 2 generators (
      [  E(3)^2        0]  [       1 -E(12)^7]
      [-E(12)^7        1], [       0   E(3)^2]
      ) of General Unitary Group of degree 2 over Universal Cyclotomic Field
      with respect to positive definite hermitian form
      [-E(12)^7 + E(12)^11                  -1]
      [                 -1 -E(12)^7 + E(12)^11]

  Python

      >>> from sage.all import *
      >>> U3 = AssionGroupU(Integer(3), 'a, b'); U3
      Assion group on 3 strands of type U
      >>> U3.gens()
      (a, b)
      >>> C3 = CubicBraidGroup(Integer(3), 't'); C3
      Cubic Braid group on 3 strands
      >>> C3.gens()
      (t0, t1)
      >>> U3.is_isomorphic(C3)
      True
      >>> U3.as_classical_group()
      Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                             (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)]
       of (The projective general unitary group of degree 3 over Finite Field of size 2)
      >>> C3.as_classical_group()
      Subgroup with 2 generators (
      [  E(3)^2        0]  [       1 -E(12)^7]
      [-E(12)^7        1], [       0   E(3)^2]
      ) of General Unitary Group of degree 2 over Universal Cyclotomic Field
      with respect to positive definite hermitian form
      [-E(12)^7 + E(12)^11                  -1]
      [                 -1 -E(12)^7 + E(12)^11]

  REFERENCES:

  - [Cox1957]

  - [Ass1978]

  Element

    alias of `CubicBraidElement`

  as_classical_group(embedded=False)

    Create an isomorphic image of `self` as a classical group according to the construction given by Coxeter resp. Assion.

    INPUT:

    - `embedded` – boolean (default: `False`); this boolean effects the cases of Assion groups when they are realized as projective groups only. More precisely: if `self` is of `cbg_type CubicBraidGroup.type.AssionS` (for example) and the number of strands `n` is even, than its classical group is a subgroup of `PSp(n,3)` (being centralized by the element `self.centralizing_element(projective=True))`. By default this group will be given. Setting `embedded = True` the classical realization is given as subgroup of its classical enlargement with one more strand (in this case as subgroup of `Sp(n,3))`.

    OUTPUT:

    Depending on the type of `self` and the number of strands an instance of `Sp(n-1,3)`, `GU(n-1,2)`, subgroup of `PSp(n,3)`, `PGU(n,2)`, or a subgroup of `GU(n-1, UCF)` (`cbg_type == CubicBraidGroup.type.Coxeter`) with respect to a certain Hermitian form attached to the Burau representation (used by Coxeter and Squier). Here `UCF` stands for the universal cyclotomic field.

    EXAMPLES:

    Sage

        sage: # needs sage.rings.finite_rings
        sage: U3 = AssionGroupU(3)
        sage: U3Cl = U3.as_classical_group(); U3Cl
        Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                               (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)] of
         (The projective general unitary group of degree 3 over Finite Field of size 2)
        sage: U3Clemb = U3.as_classical_group(embedded=True); U3Clemb
        Subgroup with 2 generators (
        [0 0 a]  [a + 1     a     a]
        [0 1 0]  [    a a + 1     a]
        [a 0 a], [    a     a a + 1]
        ) of General Unitary Group of degree 3 over Finite Field in a of size 2^2
        sage: u = U3([-2,1,-2,1]); u
        (u1^-1*u0)^2
        sage: uCl = U3Cl(u); uCl
        (1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)
        sage: uCle = U3Clemb(u); uCle
        [a + 1 a + 1     1]
        [a + 1     0     a]
        [   1     a     a]
        sage: U3(uCl) == u
        True
        sage: U3(uCle) == u
        True
        sage: U4 = AssionGroupU(4)
        sage: U4Cl = U4.as_classical_group(); U4Cl
        General Unitary Group of degree 3 over Finite Field in a of size 2^2
        sage: U3Clemb.ambient() == U4Cl
        True

        sage: # needs sage.rings.number_field
        sage: C4 = CubicBraidGroup(4)
        sage: C4Cl = C4.as_classical_group(); C4Cl
        Subgroup with 3 generators (
        [  E(3)^2        0        0]  [       1 -E(12)^7        0]
        [-E(12)^7        1        0]  [       0   E(3)^2        0]
        [       0        0        1], [       0 -E(12)^7        1],

        [       1        0        0]
        [       0        1 -E(12)^7]
        [       0        0   E(3)^2]
        ) of General Unitary Group of degree 3 over Universal Cyclotomic Field
        with respect to positive definite hermitian form
        [-E(12)^7 + E(12)^11                  -1                   0]
        [                 -1 -E(12)^7 + E(12)^11                  -1]
        [                  0                  -1 -E(12)^7 + E(12)^11]

    Python

        >>> from sage.all import *
        >>> # needs sage.rings.finite_rings
        >>> U3 = AssionGroupU(Integer(3))
        >>> U3Cl = U3.as_classical_group(); U3Cl
        Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                               (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)] of
         (The projective general unitary group of degree 3 over Finite Field of size 2)
        >>> U3Clemb = U3.as_classical_group(embedded=True); U3Clemb
        Subgroup with 2 generators (
        [0 0 a]  [a + 1     a     a]
        [0 1 0]  [    a a + 1     a]
        [a 0 a], [    a     a a + 1]
        ) of General Unitary Group of degree 3 over Finite Field in a of size 2^2
        >>> u = U3([-Integer(2),Integer(1),-Integer(2),Integer(1)]); u
        (u1^-1*u0)^2
        >>> uCl = U3Cl(u); uCl
        (1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)
        >>> uCle = U3Clemb(u); uCle
        [a + 1 a + 1     1]
        [a + 1     0     a]
        [   1     a     a]
        >>> U3(uCl) == u
        True
        >>> U3(uCle) == u
        True
        >>> U4 = AssionGroupU(Integer(4))
        >>> U4Cl = U4.as_classical_group(); U4Cl
        General Unitary Group of degree 3 over Finite Field in a of size 2^2
        >>> U3Clemb.ambient() == U4Cl
        True

        >>> # needs sage.rings.number_field
        >>> C4 = CubicBraidGroup(Integer(4))
        >>> C4Cl = C4.as_classical_group(); C4Cl
        Subgroup with 3 generators (
        [  E(3)^2        0        0]  [       1 -E(12)^7        0]
        [-E(12)^7        1        0]  [       0   E(3)^2        0]
        [       0        0        1], [       0 -E(12)^7        1],
        <BLANKLINE>
        [       1        0        0]
        [       0        1 -E(12)^7]
        [       0        0   E(3)^2]
        ) of General Unitary Group of degree 3 over Universal Cyclotomic Field
        with respect to positive definite hermitian form
        [-E(12)^7 + E(12)^11                  -1                   0]
        [                 -1 -E(12)^7 + E(12)^11                  -1]
        [                  0                  -1 -E(12)^7 + E(12)^11]

  as_matrix_group(root_bur=None, domain=None, characteristic=None, var='t', reduced=False)

    Create an epimorphic image of `self` as a matrix group by use of the Burau representation.

    INPUT:

    - `root_bur` – (default: root of unity over \(\QQ\)) six (resp. twelfth) root of unity in some field

    - `domain` – (default: cyclotomic field of order 3 and degree 2, resp. the domain of `root_bur` if given) base ring for the Burau matrix

    - `characteristic` – integer (optional); the characteristic of the domain; if none of the keywords `root_bur`, `domain` and `characteristic` are given, the default characteristic is 3 (resp. 2) if `self` is of `cbg_type` `CubicBraidGroup.type.AssionS` (resp. `CubicBraidGroup.type.AssionU`)

    - `var` – string used for the indeterminate name in case `root_bur` must be constructed in a splitting field

    - `reduced` – boolean (default: `False`); for more information see the documentation of `Braid.burau_matrix()`

    EXAMPLES:

    Sage

        sage: # needs sage.rings.finite_rings
        sage: C5 = CubicBraidGroup(5)
        sage: C5Mch5 = C5.as_matrix_group(characteristic=5); C5Mch5
        Matrix group over Finite Field in t of size 5^2 with 4 generators (
        [2*t + 2 3*t + 4       0       0       0]
        [     1       0       0       0       0]
        [     0       0       1       0       0]
        [     0       0       0       1       0]
        [     0       0       0       0       1],

        [     1       0       0       0       0]
        [     0 2*t + 2 3*t + 4       0       0]
        [     0       1       0       0       0]
        [     0       0       0       1       0]
        [     0       0       0       0       1],

        [     1       0       0       0       0]
        [     0       1       0       0       0]
        [     0       0 2*t + 2 3*t + 4       0]
        [     0       0       1       0       0]
        [     0       0       0       0       1],

        [     1       0       0       0       0]
        [     0       1       0       0       0]
        [     0       0       1       0       0]
        [     0       0       0 2*t + 2 3*t + 4]
        [     0       0       0       1       0]
        )
        sage: c = C5([3,4,-2,-3,1]); c
        c2*c3*c1^-1*c2^-1*c0
        sage: m = C5Mch5(c); m
        [2*t + 2 3*t + 4       0       0       0]
        [     0       0       0       1       0]
        [2*t + 1       0 2*t + 2     3*t 3*t + 3]
        [2*t + 2       0       0 3*t + 4       0]
        [     0       0 2*t + 2 3*t + 4       0]
        sage: m_back = C5(m)
        sage: m_back == c
        True
        sage: U5 = AssionGroupU(5); U5
        Assion group on 5 strands of type U
        sage: U5Mch3 = U5.as_matrix_group(characteristic=3)
        Traceback (most recent call last):
        ...
        ValueError: Burau representation does not factor through the relations

    Python

        >>> from sage.all import *
        >>> # needs sage.rings.finite_rings
        >>> C5 = CubicBraidGroup(Integer(5))
        >>> C5Mch5 = C5.as_matrix_group(characteristic=Integer(5)); C5Mch5
        Matrix group over Finite Field in t of size 5^2 with 4 generators (
        [2*t + 2 3*t + 4       0       0       0]
        [     1       0       0       0       0]
        [     0       0       1       0       0]
        [     0       0       0       1       0]
        [     0       0       0       0       1],
        <BLANKLINE>
        [     1       0       0       0       0]
        [     0 2*t + 2 3*t + 4       0       0]
        [     0       1       0       0       0]
        [     0       0       0       1       0]
        [     0       0       0       0       1],
        <BLANKLINE>
        [     1       0       0       0       0]
        [     0       1       0       0       0]
        [     0       0 2*t + 2 3*t + 4       0]
        [     0       0       1       0       0]
        [     0       0       0       0       1],
        <BLANKLINE>
        [     1       0       0       0       0]
        [     0       1       0       0       0]
        [     0       0       1       0       0]
        [     0       0       0 2*t + 2 3*t + 4]
        [     0       0       0       1       0]
        )
        >>> c = C5([Integer(3),Integer(4),-Integer(2),-Integer(3),Integer(1)]); c
        c2*c3*c1^-1*c2^-1*c0
        >>> m = C5Mch5(c); m
        [2*t + 2 3*t + 4       0       0       0]
        [     0       0       0       1       0]
        [2*t + 1       0 2*t + 2     3*t 3*t + 3]
        [2*t + 2       0       0 3*t + 4       0]
        [     0       0 2*t + 2 3*t + 4       0]
        >>> m_back = C5(m)
        >>> m_back == c
        True
        >>> U5 = AssionGroupU(Integer(5)); U5
        Assion group on 5 strands of type U
        >>> U5Mch3 = U5.as_matrix_group(characteristic=Integer(3))
        Traceback (most recent call last):
        ...
        ValueError: Burau representation does not factor through the relations

  as_permutation_group(use_classical=True)

    Return a permutation group isomorphic to `self` that has a group isomorphism from `self` as a conversion.

    INPUT:

    - `use_classical` – boolean (default: `True`); the permutation group is calculated via the attached classical matrix group as this results in a smaller degree; if `False`, the permutation group will be calculated using `self` (as finitely presented group)

    EXAMPLES:

    Sage

        sage: C3 = CubicBraidGroup(3)
        sage: PC3 = C3.as_permutation_group()
        sage: assert C3.is_isomorphic(PC3)  # random (with respect to the occurrence of the info message)
        sage: PC3.degree()
        8
        sage: c = C3([2,1-2])
        sage: C3(PC3(c)) == c
        True

    Python

        >>> from sage.all import *
        >>> C3 = CubicBraidGroup(Integer(3))
        >>> PC3 = C3.as_permutation_group()
        >>> assert C3.is_isomorphic(PC3)  # random (with respect to the occurrence of the info message)
        >>> PC3.degree()
        8
        >>> c = C3([Integer(2),Integer(1)-Integer(2)])
        >>> C3(PC3(c)) == c
        True

  as_reflection_group()

    Return an isomorphic image of `self` as irreducible complex reflection group.

    This is possible only for the finite cubic braid groups of `cbg_type` `CubicBraidGroup.type.Coxeter`.

    Note

    This method uses the sage implementation of reflection group via the `gap3` `CHEVIE` package. These must be installed in order to use this method.

    EXAMPLES:

    Sage

        sage: # optional - gap3
        sage: C3.<c1,c2> = CubicBraidGroup(3)
        sage: R3 = C3.as_reflection_group(); R3
        Irreducible complex reflection group of rank 2 and type ST4
        sage: R3.cartan_matrix()
        [-2*E(3) - E(3)^2           E(3)^2]
        [        -E(3)^2 -2*E(3) - E(3)^2]
        sage: R3.simple_roots()
        Finite family {1: (0, -2*E(3) - E(3)^2), 2: (2*E(3)^2, E(3)^2)}
        sage: R3.simple_coroots()
        Finite family {1: (0, 1), 2: (1/3*E(3) - 1/3*E(3)^2, 1/3*E(3) - 1/3*E(3)^2)}

    Python

        >>> from sage.all import *
        >>> # optional - gap3
        >>> C3 = CubicBraidGroup(Integer(3), names=('c1', 'c2',)); (c1, c2,) = C3._first_ngens(2)
        >>> R3 = C3.as_reflection_group(); R3
        Irreducible complex reflection group of rank 2 and type ST4
        >>> R3.cartan_matrix()
        [-2*E(3) - E(3)^2           E(3)^2]
        [        -E(3)^2 -2*E(3) - E(3)^2]
        >>> R3.simple_roots()
        Finite family {1: (0, -2*E(3) - E(3)^2), 2: (2*E(3)^2, E(3)^2)}
        >>> R3.simple_coroots()
        Finite family {1: (0, 1), 2: (1/3*E(3) - 1/3*E(3)^2, 1/3*E(3) - 1/3*E(3)^2)}

    Conversion maps:

    Sage

        sage: # optional - gap3
        sage: r = R3.an_element()
        sage: cr = C3(r); cr
        c1*c2
        sage: mr = r.matrix(); mr
        [ 1/3*E(3) - 1/3*E(3)^2  2/3*E(3) + 1/3*E(3)^2]
        [-2/3*E(3) + 2/3*E(3)^2  2/3*E(3) + 1/3*E(3)^2]
        sage: C3Cl = C3.as_classical_group()
        sage: C3Cl(cr)
        [ E(3)^2    -E(4)]
        [-E(12)^7        0]

    [Python]

        >>> from sage.all import *
        >>> # optional - gap3
        >>> r = R3.an_element()
        >>> cr = C3(r); cr
        c1*c2
        >>> mr = r.matrix(); mr
        [ 1/3*E(3) - 1/3*E(3)^2  2/3*E(3) + 1/3*E(3)^2]
        [-2/3*E(3) + 2/3*E(3)^2  2/3*E(3) + 1/3*E(3)^2]
        >>> C3Cl = C3.as_classical_group()
        >>> C3Cl(cr)
        [ E(3)^2    -E(4)]
        [-E(12)^7        0]

    The reflection groups can also be viewed as subgroups of unitary groups over the universal cyclotomic field. Note that the unitary group corresponding to the reflection group is isomorphic but different from the classical group due to different hermitian forms for the unitary groups they live in:

    Sage

        sage: # optional - gap3
        sage: C4 = CubicBraidGroup(4)
        sage: R4 = C4.as_reflection_group()
        sage: R4.invariant_form()
        [1 0 0]
        [0 1 0]
        [0 0 1]
        sage: _ == C4.classical_invariant_form()
        False

    Python

        >>> from sage.all import *
        >>> # optional - gap3
        >>> C4 = CubicBraidGroup(Integer(4))
        >>> R4 = C4.as_reflection_group()
        >>> R4.invariant_form()
        [1 0 0]
        [0 1 0]
        [0 0 1]
        >>> _ == C4.classical_invariant_form()
        False

  braid_group()

    Return a `BraidGroup` with identical generators, such that there exists an epimorphism to `self`.

    OUTPUT: a `BraidGroup` having conversion maps to and from `self` (which is just a section in the latter case)

    EXAMPLES:

    Sage

        sage: U5 = AssionGroupU(5); U5
        Assion group on 5 strands of type U
        sage: B5 = U5.braid_group(); B5
        Braid group on 5 strands
        sage: b = B5([4,3,2,-4,1])
        sage: u = U5([4,3,2,-4,1])
        sage: u == b
        False
        sage: b.burau_matrix()
        [ 1 - t      t      0      0      0]
        [ 1 - t      0      t      0      0]
        [ 1 - t      0      0      0      t]
        [ 1 - t      0      0      1 -1 + t]
        [     1      0      0      0      0]
        sage: u.burau_matrix()
        [t + 1     t     0     0     0]
        [t + 1     0     t     0     0]
        [t + 1     0     0     0     t]
        [t + 1     0     0     1 t + 1]
        [    1     0     0     0     0]
        sage: bU = U5(b)
        sage: uB = B5(u)
        sage: bU == u
        True
        sage: uB == b
        True

    Python

        >>> from sage.all import *
        >>> U5 = AssionGroupU(Integer(5)); U5
        Assion group on 5 strands of type U
        >>> B5 = U5.braid_group(); B5
        Braid group on 5 strands
        >>> b = B5([Integer(4),Integer(3),Integer(2),-Integer(4),Integer(1)])
        >>> u = U5([Integer(4),Integer(3),Integer(2),-Integer(4),Integer(1)])
        >>> u == b
        False
        >>> b.burau_matrix()
        [ 1 - t      t      0      0      0]
        [ 1 - t      0      t      0      0]
        [ 1 - t      0      0      0      t]
        [ 1 - t      0      0      1 -1 + t]
        [     1      0      0      0      0]
        >>> u.burau_matrix()
        [t + 1     t     0     0     0]
        [t + 1     0     t     0     0]
        [t + 1     0     0     0     t]
        [t + 1     0     0     1 t + 1]
        [    1     0     0     0     0]
        >>> bU = U5(b)
        >>> uB = B5(u)
        >>> bU == u
        True
        >>> uB == b
        True

  cardinality()

    alias of `order()`.

  centralizing_element(embedded=False)

    Return the centralizing element defined by the work of Assion (Hilfssatz 1.1.3 and 1.2.3).

    INPUT:

    - `embedded` – boolean (default; `False`); this boolean only effects the cases of Assion groups when they are realized as projective groups. More precisely: if `self` is of `cbg_type CubicBraidGroup.type.AssionS` (for example) and the number of strands `n` is even, than its classical group is a subgroup of `PSp(n,3)` being centralized by the element return for option `embedded=False`. Otherwise the image of this element inside the embedded classical group will be returned (see option embedded of `classical_group()`).

    OUTPUT:

    Depending on the optional keyword a permutation as an element of `PSp(n,3)` (type S) or `PGU(n,2)` (type U) for `n = 0 mod 2` (type S) resp. `n = 0 mod 3` (type U) is returned. Otherwise, the centralizing element is a matrix belonging to `Sp(n,3)` resp. `GU(n,2)`.

    EXAMPLES:

    Sage

        sage: U3 = AssionGroupU(3);  U3
        Assion group on 3 strands of type U
        sage: U3Cl = U3.as_classical_group(); U3Cl
        Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                               (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)]
         of (The projective general unitary group of degree 3 over Finite Field of size 2)
        sage: c = U3.centralizing_element(); c
        (1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)
        sage: c in U3Cl
        True
        sage: P = U3Cl.ambient_group()
        sage: P.centralizer(c) == U3Cl
        True

    Python

        >>> from sage.all import *
        >>> U3 = AssionGroupU(Integer(3));  U3
        Assion group on 3 strands of type U
        >>> U3Cl = U3.as_classical_group(); U3Cl
        Subgroup generated by [(1,7,6)(3,19,14)(4,15,10)(5,11,18)(12,16,20),
                               (1,12,13)(2,15,19)(4,9,14)(5,18,8)(6,21,16)]
         of (The projective general unitary group of degree 3 over Finite Field of size 2)
        >>> c = U3.centralizing_element(); c
        (1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)
        >>> c in U3Cl
        True
        >>> P = U3Cl.ambient_group()
        >>> P.centralizer(c) == U3Cl
        True

    Embedded version:

    Sage

        sage: cm = U3.centralizing_element(embedded=True); cm
        [a + 1 a + 1     1]
        [a + 1     0     a]
        [   1     a     a]
        sage: U4 = AssionGroupU(4)
        sage: U4Cl = U4.as_classical_group()
        sage: cm in U4Cl
        True
        sage: [cm * U4Cl(g) == U4Cl(g) * cm for g in U4.gens()]
        [True, True, False]

    [Python]

        >>> from sage.all import *
        >>> cm = U3.centralizing_element(embedded=True); cm
        [a + 1 a + 1     1]
        [a + 1     0     a]
        [   1     a     a]
        >>> U4 = AssionGroupU(Integer(4))
        >>> U4Cl = U4.as_classical_group()
        >>> cm in U4Cl
        True
        >>> [cm * U4Cl(g) == U4Cl(g) * cm for g in U4.gens()]
        [True, True, False]

  classical_invariant_form()

    Return the invariant form of the classical realization of `self`.

    OUTPUT:

    A square matrix of dimension according to the space the classical realization is operating on. In the case of the full cubic braid groups and of the Assion groups of `cbg_type CubicBraidGroup.type.AssionU` the matrix is Hermitian. In the case of the Assion groups of `cbg_type CubicBraidGroup.type.AssionS` it is alternating. Note that the invariant form of the full cubic braid group on more than 5 strands is degenerated (causing the group to be infinite).

    In the case of Assion groups having projective classical groups, the invariant form corresponds to the ambient group of its classical embedding.

    EXAMPLES:

    Sage

        sage: S3 = AssionGroupS(3)
        sage: S3.classical_invariant_form()
        [0 1]
        [2 0]
        sage: S4 = AssionGroupS(4)
        sage: S4.classical_invariant_form()
        [0 0 0 1]
        [0 0 1 0]
        [0 2 0 0]
        [2 0 0 0]
        sage: S5 = AssionGroupS(5)
        sage: S4.classical_invariant_form() == S5.classical_invariant_form()
        True
        sage: U4 = AssionGroupU(4)
        sage: U4.classical_invariant_form()
        [0 0 1]
        [0 1 0]
        [1 0 0]
        sage: C5 = CubicBraidGroup(5)
        sage: C5.classical_invariant_form()
        [-E(12)^7 + E(12)^11                  -1                   0                   0]
        [                -1 -E(12)^7 + E(12)^11                  -1                   0]
        [                 0                  -1 -E(12)^7 + E(12)^11                  -1]
        [                 0                   0                  -1 -E(12)^7 + E(12)^11]
        sage: _.is_singular()
        False
        sage: C6 = CubicBraidGroup(6)
        sage: C6.classical_invariant_form().is_singular()
        True

    Python

        >>> from sage.all import *
        >>> S3 = AssionGroupS(Integer(3))
        >>> S3.classical_invariant_form()
        [0 1]
        [2 0]
        >>> S4 = AssionGroupS(Integer(4))
        >>> S4.classical_invariant_form()
        [0 0 0 1]
        [0 0 1 0]
        [0 2 0 0]
        [2 0 0 0]
        >>> S5 = AssionGroupS(Integer(5))
        >>> S4.classical_invariant_form() == S5.classical_invariant_form()
        True
        >>> U4 = AssionGroupU(Integer(4))
        >>> U4.classical_invariant_form()
        [0 0 1]
        [0 1 0]
        [1 0 0]
        >>> C5 = CubicBraidGroup(Integer(5))
        >>> C5.classical_invariant_form()
        [-E(12)^7 + E(12)^11                  -1                   0                   0]
        [                -1 -E(12)^7 + E(12)^11                  -1                   0]
        [                 0                  -1 -E(12)^7 + E(12)^11                  -1]
        [                 0                   0                  -1 -E(12)^7 + E(12)^11]
        >>> _.is_singular()
        False
        >>> C6 = CubicBraidGroup(Integer(6))
        >>> C6.classical_invariant_form().is_singular()
        True

  codegrees()

    Return the codegrees of `self`.

    This only makes sense when `self` is a finite reflection group.

    EXAMPLES:

    Sage

        sage: CubicBraidGroup(5).codegrees()
        (0, 6, 12, 18)

    Python

        >>> from sage.all import *
        >>> CubicBraidGroup(Integer(5)).codegrees()
        (0, 6, 12, 18)

  cubic_braid_subgroup(nstrands=None)

    Return a cubic braid group as subgroup of `self` on the first `nstrands` strands.

    INPUT:

    - `nstrands` – (default: `self.strands() - 1`) integer at least 1 and at most `self.strands()` giving the number of strands of the subgroup

    Warning

    Since `self` is inherited from `UniqueRepresentation`, the obtained instance is identical to other instances created with the same arguments (see example below). The ambient group corresponds to the last call of this method.

    EXAMPLES:

    Sage

        sage: U5 = AssionGroupU(5)
        sage: U3s = U5.cubic_braid_subgroup(3)
        sage: u1, u2 = U3s.gens()
        sage: u1 in U5
        False
        sage: U5(u1) in U5.gens()
        True
        sage: U3s is AssionGroupU(3)
        True
        sage: U3s.ambient() == U5
        True

    Python

        >>> from sage.all import *
        >>> U5 = AssionGroupU(Integer(5))
        >>> U3s = U5.cubic_braid_subgroup(Integer(3))
        >>> u1, u2 = U3s.gens()
        >>> u1 in U5
        False
        >>> U5(u1) in U5.gens()
        True
        >>> U3s is AssionGroupU(Integer(3))
        True
        >>> U3s.ambient() == U5
        True

  degrees()

    Return the degrees of `self`.

    This only makes sense when `self` is a finite reflection group.

    EXAMPLES:

    Sage

        sage: CubicBraidGroup(4).degrees()
        (6, 9, 12)

    Python

        >>> from sage.all import *
        >>> CubicBraidGroup(Integer(4)).degrees()
        (6, 9, 12)

  index_set()

    Return the index set of `self`.

    This is the set of integers \(0,\dots,n-2\) where \(n\) is the number of strands.

    This is only used when `self` is a finite reflection group.

    EXAMPLES:

    Sage

        sage: CubicBraidGroup(3).index_set()
        [0, 1]

    Python

        >>> from sage.all import *
        >>> CubicBraidGroup(Integer(3)).index_set()
        [0, 1]

  is_finite()

    Return if `self` is a finite group or not.

    EXAMPLES:

    Sage

        sage: CubicBraidGroup(6).is_finite()
        False
        sage: AssionGroupS(6).is_finite()
        True

    Python

        >>> from sage.all import *
        >>> CubicBraidGroup(Integer(6)).is_finite()
        False
        >>> AssionGroupS(Integer(6)).is_finite()
        True

  order()

    To avoid long wait-time on calculations the order will be obtained using the classical realization.

    OUTPUT: cardinality of the group as integer or infinity

    EXAMPLES:

    Sage

        sage: S15 = AssionGroupS(15)
        sage: S15.order()
        109777561863482259035023554842176139436811616256000
        sage: C6 = CubicBraidGroup(6)
        sage: C6.order()
        +Infinity

    Python

        >>> from sage.all import *
        >>> S15 = AssionGroupS(Integer(15))
        >>> S15.order()
        109777561863482259035023554842176139436811616256000
        >>> C6 = CubicBraidGroup(Integer(6))
        >>> C6.order()
        +Infinity

  simple_reflections()

    Return the generators of `self`.

    This is only used when `self` is a finite reflection group.

    EXAMPLES:

    Sage

        sage: CubicBraidGroup(3).simple_reflections()
        (c0, c1)

    Python

        >>> from sage.all import *
        >>> CubicBraidGroup(Integer(3)).simple_reflections()
        (c0, c1)

  strands()

    Return the number of strands of the braid group whose image is `self`.

    OUTPUT: `Integer`

    EXAMPLES:

    Sage

        sage: C4 = CubicBraidGroup(4)
        sage: C4.strands()
        4

    Python

        >>> from sage.all import *
        >>> C4 = CubicBraidGroup(Integer(4))
        >>> C4.strands()
        4

  class type(*values)

    Bases: `Enum`

    Enum class to select the type of the group:

    - `Coxeter` – `'C'` the full cubic braid group

    - `AssionS` – `'S'` finite factor group of type S considered by Assion

    - `AssionU` – `'U'` finite factor group of type U considered by Assion

    EXAMPLES:

    Sage

        sage: S2 = CubicBraidGroup(2, cbg_type=CubicBraidGroup.type.AssionS); S2
        Assion group on 2 strands of type S
        sage: U3 = CubicBraidGroup(2, cbg_type='U')
        Traceback (most recent call last):
        ...
        TypeError: the cbg_type must be an instance of <enum 'CubicBraidGroup.type'>

    Python

        >>> from sage.all import *
        >>> S2 = CubicBraidGroup(Integer(2), cbg_type=CubicBraidGroup.type.AssionS); S2
        Assion group on 2 strands of type S
        >>> U3 = CubicBraidGroup(Integer(2), cbg_type='U')
        Traceback (most recent call last):
        ...
        TypeError: the cbg_type must be an instance of <enum 'CubicBraidGroup.type'>

    AssionS = 'S'
    AssionU = 'U'
    Coxeter = 'C'