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 Candian Mathematical Congress (Vancover 1957), pp. 95-122".

Coxeter showed, that these groups are finite as long as the number of strands is less than 6 and infinite elsewise. More explicitely 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$. Coxeter realized these groups as subgroups of unitary groups with respect to a certain hermitian form over the complex numbers (in fact over 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 dimensional factors of these groups. The additional relations on the braid group generators $\{ s_1, \cdots , s_{m-1}\}$ are

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).

This class implements all the groups conidered by Coxeter and Assion as finitely presented groups (via the gap interface) together with the classical realizations given by the authors. It also contains the coercion maps between the two ways of realization. In addition the user can construct other realizations and maps to matrix groups with help of the burau representation. In case gap3 and CHEVIE are installed under sage version 7.2 (or later) the reflection groups via the gap3 interface are availlable, too. The methods for all this functionality are:

- as_classical_group
- as_matrix_group
- as_reflection_group (needs sage version 7.2 up and gap3 + CHEVIE)
- as_permutation_group

Further methods are:

- order
- pre_image_braid_group
- cubic_braid_subgroup
- character_table

AUTHOR

Sebastian Oehms, Sept. 2016

The CubicBraidGroup class is not integrated into the sage library, right now. If you are using sage on your own computer you may install the CubicBraidGoup class following the README.txt file.

To use the CubicBraidGroup on this plattform you can create a sage worksheet or jupyter notebook (like this) and start with a cell containing this first line:

In [1]:

from cubic_braid import *

To execute the command you must click on the "play" symbol (>|) above (instead of carriage return key in a shell session).

On your own computer in a command-line sage-session you must start with this line, as well. For further information on how to get started see the README.txt-File.

The general documentation concerning the CubicBraidGroup class can be shown using the following command:

In [2]:

print CubicBraidGroup_class.__doc__

Class to handel cubic factors of braid group on n strands
If you don't see this well formatted type
sage: print CubicBraidGroup_class.__doc__
This class implements quotient groups of the braid group mapping their generators to elements of order 3
(see the module header for more informations on these groups)
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 (to the constructor):
- "names": (see the BraidGroup_class docomentation)
- "AdditionalRelation": (keyword, explantaion see below)
- "verbose": (keyword, explantaion see below)
RAISE (on init):
- ValueError: "the number of strands must be an integer larger than one"
Setting the keyword 'AdditionalRelation' to one on the values 'S' or 'U' the additional relations due to
Assion are added:
'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$ for $m >= 5$
'U': $t_1 t_3 = 1$ for $m >= 5$
where $t_i = (s_i s_{i+1})^3$. If AdditionalRelation='C' (default) only the cubic relation on the generators is
active (Coxeters case of investigation). Note that for n=2,3,4 the groups do not differ between the three possible
values of AdditionalRelation (as finitely presented groups). But anyway, the classes for 'C', 'S' and 'U' are
different, since they have different classical realizations implemented .
Setting the keyword verbose it is possible to print time stamp messages in order to do a performance or
call stack debugging. This keyword uses the timeStampControl class. For more information on this type
print setupTimeStamp.__doc__
print timeStampControl.__doc__
print timeStampControl.print_timestamp.__doc__
print print_time_tb.__doc__
The creation of instances of this class can also be done more easy by help of the functions CubicBraidGroup,
AssionGroupS and AssionGroupU (similar to the function BraidGroup with respect to the BraidGroup_class)
EXAMPLES:
sage: from cubic_braid import *
sage: U3 = CubicBraidGroup(3, AdditionalRelation = 'U'); U3
Assion group on 3 strands of type U
sage: U3.gens()
(c0, c1)
alternate possibilities defining U3:
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)
alternates naming the generators:
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 of (The projective general unitary group of degree 3 over Finite Field of size 2) 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)]
sage: C3.as_classical_group()
Subgroup of General Unitary Group of degree 2 over Universal Cyclotomic Field with respect to hermitian form
[-E(12)^7 + E(12)^11 -1]
[ -1 -E(12)^7 + E(12)^11]
generated by (
[ E(3) E(12)^11]
[ 0 1],
[ 1 0]
[E(12)^11 E(3)])
using verbose mode:
sage: C3.<c1,c2> = CubicBraidGroup(3, verbose=True); C3
L: StackInfo Elapse: 0, Total: 0 Ident: C3 In: __init__ Line: 403
L: StackInfo Elapse: 197, Total: 0 Begin In: __create_classical_realization__ Line: 910
L: StackInfo Elapse: 8, Total: 0 Begin In: as_matrix_group Line: 1031
L: Body Elapse: 92, Total: 0 genList prepared In: as_matrix_group Line: 1038
L: Body Elapse: 52, Total: 0 MatGroup defined In: as_matrix_group Line: 1054
L: StackInfo Elapse: 356, Total: 0 Begin In: gap_hom Line: 143
L: Debug Elapse: 8, Total: 0 GroupHomomorphis In: gap_hom Line: 188
L: Debug Elapse: 17, Total: 0 checked if groupMap works In: gap_hom Line: 199
L: StackInfo Elapse: 8, Total: 0 End In: gap_hom Line: 226
L: StackInfo Elapse: 44, Total: 0 Begin In: __check_homomorphism__ Line: 60
L: StackInfo Elapse: 52, Total: 0 End In: __check_homomorphism__ Line: 625
L: Body Elapse: 3, Total: 0 Hom from self defined In: as_matrix_group Line: 1064
L: StackInfo Elapse: 62, Total: 0 Begin In: gap_hom Line: 143
L: Debug Elapse: 4, Total: 0 GroupHomomorphis In: gap_hom Line: 188
L: Debug Elapse: 20, Total: 0 checked if groupMap works In: gap_hom Line: 199
L: StackInfo Elapse: 4, Total: 0 End In: gap_hom Line: 226
L: Body Elapse: 35, Total: 0 Section to self defined In: as_matrix_group Line: 1077
L: StackInfo Elapse: 3, Total: 0 Ende In: as_matrix_group Line: 1102
L: StackInfo Elapse: 3, Total: 0 End In: __create_classical_realization__ Line: 975
L: StackInfo Elapse: 12, Total: 0 Ident: C3 In: __init__ Line: 472
Cubic Braid group on 3 strands
sage:
sage:
sage: C3.<c1,c2> = CubicBraidGroup(3, verbose=30); C3
L: StackInfo Elapse: 62, Total: 0 (truncated 1) Begin In: __create_classical_realization__ Line: 910
---> __init__ In: lib/cubic_braid.py Line: 471
---> __classcall__ In: /opt/sage/sage-6.9-i686-Linux/local/lib/python2.7/site-packages/sage/structure
/unique_representation.py Line: 1021
---> CubicBraidGroup In: lib/cubic_braid.py Line: 1231
L: StackInfo Elapse: 405, Total: 0 Begin In: as_matrix_group Line: 1031
---> __create_classical_realization__ In: lib/cubic_braid.py Line: 968
---> __init__ In: lib/cubic_braid.py Line: 471
---> __classcall__ In: /opt/sage/sage-6.9-i686-Linux/local/lib/python2.7/site-packages/sage/structure
/unique_representation.py Line: 1021
L: Body Elapse: 145, Total: 0 genList prepared In: as_matrix_group Line: 1038
---> __create_classical_realization__ In: lib/cubic_braid.py Line: 968
---> __init__ In: lib/cubic_braid.py Line: 471
---> __classcall__ In: /opt/sage/sage-6.9-i686-Linux/local/lib/python2.7/site-packages/sage/structure
/unique_representation.py Line: 1021
Cubic Braid group on 3 strands
sage:
TESTS:
sage: C4 = CubicBraidGroup(4)
sage: TestSuite(C4).run()
sage: C5 = CubicBraidGroup(5)
sage: TestSuite(C5).run()
sage: C6 = CubicBraidGroup(6)
sage: TestSuite(C6).run()
sage: S3 = AssionGroupS(3)
sage: TestSuite(S3).run()
sage: S4 = AssionGroupS(4)
sage: TestSuite(S5).run()
sage: U3 = AssionGroupU(3)
sage: TestSuite(U3).run()
sage: U4 = AssionGroupU(4)
sage: TestSuite(U4).run()
sage: U5 = AssionGroupU(5)
sage: TestSuite(U5).run()
METHODS (implemented / overwriten here):
- as_classical_group(): type
sage: print CubicBraidGroup_class.as_classical_group.__doc__
- as_matrix_group(): type
sage: print CubicBraidGroup_class.as_matrix_group.__doc__
- as_refection_group(): type
sage: print CubicBraidGroup_class.as_refection_group.__doc__
- as_permutation_group(): type
sage: print CubicBraidGroup_class.as_permutation_group.__doc__
- pre_image_braid_group: type
sage: print CubicBraidGroup_class.pre_image_braid_group.__doc__
- cubic_braid_subgroup(): type
sage: print CubicBraidGroup_class.cubic_braid_subgroup.__doc__
- centralizing_element(): type
sage: print CubicBraidGroup_class.centralizing_element.__doc__
- order(): type
sage: print CubicBraidGroup_class.order.__doc__
- character_table(): type
sage: print CubicBraidGroup_class.character_table.__doc__
AUTHOR
- Sebastian Oehms, Sept. 2016
REFERENCES:
- Coxeter, H.S.M: "Factor groups of the braid groups, Proceedings of the Fourth Candian Mathematical Congress
(Vancover 1957), pp. 95-122".
- J. Assion: "Einige endliche Faktorgruppen der Zopfgruppen" (Math. Z., 163 (1978), 291-302)

To definine the cubic braid group on 3 strand, for example, type:

In [3]:

C3 = CubicBraidGroup( 3 ); C3

Cubic Braid group on 3 strands

There are several ways to obtain the braid generators as variables: First using the pre defined names:

In [4]:

C3.inject_variables()

Defining c0, c1

Second, if you like to use your own names it is possiblbe to include a generator declaration inside the group declaration in two ways (caution: sage-kernel needed, this does no work for a pure python kernel):

In [5]:

C4.<c1, c2, c3> = CubicBraidGroup(4); print "Element of C4", c1*c2**2*c3 U4 = AssionGroupU(4, 'a, b, c' ); a, b, c = U4.gens(); print "Element of U4", a*b**2*c

Element of C4 c1*c2^2*c3
Element of U4 a*b^2*c

But, note:

In [6]:

S4 = AssionGroupS(4); x, y, z = S4.gens(); print "Element of S4", x*y**2*z

Element of S4 s0*s1^2*s2

Now, lets define Coxeter realization of the 3 strand cubic braid group:

In [7]:

C3Cl = C3.as_classical_group(); C3Cl

Subgroup of Unitary Group of degree 2 over Universal Cyclotomic Field with respect to hermitian form
[-E(12)^7 + E(12)^11 -1]
[ -1 -E(12)^7 + E(12)^11] generated by:
([ E(3) E(12)^11]
[ 0 1], [ 1 0]
[E(12)^11 E(3)])

You may apply any method implemented for groups and finitely presented resp. finitely generated matrix groups in sage to C3 resp. C3Cl, for instance to check if they are isomorphic:

In [8]:

C3.is_isomorphic( C3Cl )

True

To see which methods are availlable you may use the python 'dir' function. To see all methods containing the substring 'is_' in their names, for instance, type:

In [9]:

print 'Attributes of C3:\n', [ attrib for attrib in dir(C3) if attrib.find('is_') >= 0 ], '\n\n'

Attributes of C3:
['_interface_is_cached_', '_is_category_initialized', '_is_valid_homomorphism_', 'is_abelian', 'is_atomic_repr', 'is_coercion_cached', 'is_commutative', 'is_conversion_cached', 'is_empty', 'is_exact', 'is_finite', 'is_isomorphic', 'is_multiplicative', 'is_parent_of', 'is_subgroup']

Restriction to substrings at the beginning or end works like this:

In [10]:

print 'Attributes of C3:\n', [ attrib for attrib in dir(C3) if attrib.startswith('as_') ], '\n\n' print 'Attributes of C3:\n', [ attrib for attrib in dir(C3) if attrib.endswith('_group') ], '\n\n' print 'Attributes of C3Cl:\n', [ attrib for attrib in dir(C3Cl) if attrib.startswith('as_') ], '\n\n' print 'Attributes of C3Cl:\n', [ attrib for attrib in dir(C3Cl) if attrib.endswith('_group') ], '\n\n'

Attributes of C3:
['as_classical_group', 'as_matrix_group', 'as_permutation_group', 'as_reflection_group']
Attributes of C3:
['_free_group', 'as_classical_group', 'as_matrix_group', 'as_permutation_group', 'as_reflection_group', 'free_group', 'pre_image_braid_group']
Attributes of C3Cl:
['as_matrix_group', 'as_permutation_group']
Attributes of C3Cl:
['as_matrix_group', 'as_permutation_group']

In stead of the 'startswith' query you can use the 'TAB'-key functionality like with 'bash', as well.

The above used method "as_classical_group" is a special method of the CubicBraidGroup class. It returns the realization of the cubic braid group as classical group. These are (in principal) symplectic groups over GF(3) resp. unitary groups over GF(4) in the case of Assion groups of type "S" and "U" respectively (realization of Assion) and subgroups of the unitary groups over adjoined with a primitive 12-th root of unity with respect to a certain hermitian form in the case of the ordinary cubic braid groups (Coxeters realization):

In [11]:

S3 = AssionGroupS(3); print S3; print "" S3Cl = S3.as_classical_group(); print S3Cl; print "" U3 = AssionGroupU(3); print U3; print "" U3Cl = U3.as_classical_group(); print U3Cl

Assion group on 3 strands of type S
Symplectic Group of degree 2 over Finite Field of size 3
Assion group on 3 strands of type U
Subgroup of (The projective general unitary group of degree 3 over Finite Field of size 2) 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)]

U3Cl is an exception to the statement above! It is not identical to the unitary group of degree 2. This exception occurs if the number of strands is zero mululo three in the case of Assion groups of type U resp. if the number of strands is even concerning the Assion groups of type S. But, since U3Cl is a subgroup of U4Cl (the unitary group of degree 3 over GF(4) ) you may obtain it like this:

In [12]:

U3Clemb = U3.as_classical_group( embedded = True); print U3Clemb; print "" um1, um2 =U3Clemb.gens() U4 = AssionGroupU(4) U4Cl = U4.as_classical_group(); print U4Cl; print "" print 'first generator in U4Cl?', um1 in U4Cl print 'second generator in U4Cl?', um2 in U4Cl

Matrix group over Finite Field in a of size 2^2 with 2 generators (
[0 0 a] [a + 1 a a]
[0 1 0] [ a a + 1 a]
[a 0 a], [ a a a + 1]
)
General Unitary Group of degree 3 over Finite Field in a of size 2^2
first generator in U4Cl? True
second generator in U4Cl? True

Don't confuse about the difference with respect to the base field concerning GU(3,2) (size 2²) and PGU(3,2) (size 2) which is caused by non conform conventions inside sage.

Assion described the exceptional cases of the groups $S(m)$ and $U(m)$ as centralizer groups of certain elements in the projective counterpart of the corresponding classical group. These elements can be obtained by the following method:

In [13]:

u3cent = U3.centralizing_element(); print "centalizing element (u3cent):\n%s\n" %( u3cent ) print "u3cent in U3Cl? %s" %( u3cent in U3Cl ) print "u3cent in U3Clemb? %s\n" %(u3cent in U3Clemb ) u3centP = U3.centralizing_element(projective = True ); print "projective centalizing element (u3centP):\n%s\n" %( u3centP ) print "u3centP in U3Cl? %s" %(u3centP in U3Cl) print "u3centP in U3Clemb? %s\n" %(u3centP in U3Clemb) PU3 = U3Cl.ambient_group(); print "Ambient Group of U3Cl (PU3):\n%s\n" %(PU3) PU3cent = PU3.centralizer(u3centP); print "Centralizer of u3centP in PU3 (PU3cent):\n%s\n" %(PU3cent) print "Check PU3cent == U3Cl: %s" %( U3Cl == PU3cent)

centalizing element (u3cent):
[a + 1 a + 1 1]
[a + 1 0 a]
[ 1 a a]
u3cent in U3Cl? False
u3cent in U3Clemb? True
projective centalizing element (u3centP):
(1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)
u3centP in U3Cl? True
u3centP in U3Clemb? False
Ambient Group of U3Cl (PU3):
The projective general unitary group of degree 3 over Finite Field of size 2
Centralizer of u3centP in PU3 (PU3cent):
Subgroup of (The projective general unitary group of degree 3 over Finite Field of size 2) generated by [(2,3,4)(6,13,20)(7,12,21)(8,11,18)(9,10,19), (1,6,7)(3,14,19)(4,10,15)(5,18,11)(12,20,16), (1,16)(2,9)(3,10)(4,19)(6,12)(7,20)(13,21)(14,15)]
Check PU3cent == U3Cl: True

Observe, that the cubic braid groups do not differ from the corresponding Assion groups in terms of isomorphism as long as the number of strand is less than five:

In [14]:

print 'C3 isomorphic to S3?', C3.is_isomorphic(S3) print 'C3 isomorphic to U3?', C3.is_isomorphic(U3) print 'C3 isomorphic to S3Cl?', C3.is_isomorphic(S3Cl) print 'C3 isomorphic to U3Cl?', C3.is_isomorphic(U3Cl) print 'C3 isomorphic to U3Clemb?', C3.is_isomorphic(U3Clemb)

C3 isomorphic to S3? True
C3 isomorphic to U3? True
C3 isomorphic to S3Cl? True
C3 isomorphic to U3Cl? True
C3 isomorphic to U3Clemb? True

These isomorphisms are canonical in the case of S3 and U3 since all these groups are defined as finitely presented groups with identical number of generators and according relations:

In [15]:

print 'Relations of C3:\n%s\n'%( list(C3.relations()) ) print 'Relations of S3:\n%s\n'%( list(S3.relations()) )

Relations of C3:
[c0*c1*c0*c1^-1*c0^-1*c1^-1, c0^3, c1^3]
Relations of S3:
[s0*s1*s0*s1^-1*s0^-1*s1^-1, s0^3, s1^3]

In the other cases the maps are realized as conversion maps, that is:

In [16]:

C3.inject_variables(); element = c0*c1**2; image_element = C3Cl(element) print 'Image of %s in C3Cl:\n%s\n' %(element, image_element) U3.inject_variables(); element = u0*u1**2; image_element = U3Cl(element) print 'Image of %s in U3Cl:\n%s\n' %(element, image_element) image_element = U3Clemb(element) print 'Image of %s in U3Clemb:\n%s\n' %(element, image_element)

Defining c0, c1
Image of c0*c1^2 in C3Cl:
[ -E(3)^2 E(12)^7]
[-E(12)^7 E(3)^2]
Defining u0, u1
Image of u0*u1^2 in U3Cl:
(1,7,16,20)(2,19,9,4)(3,15,10,14)(5,11)(6,13,12,21)(8,18)
Image of u0*u1^2 in U3Clemb:
[ 1 1 a + 1]
[a + 1 a a + 1]
[ a 0 a]

You may also convert in the opposite direction:

In [17]:

elements = list(S3Cl.some_elements()) image_elements = [ S3(element) for element in elements ] print 'Images of\n%s\n\nand\n%s\n\nin S3:\n\n%s\n' %(elements[0], elements[1], image_elements)

Images of
[1 1]
[0 1]
and
[0 1]
[2 0]
in S3:
[s1, s0*s1*s0]

For each element of a cubic braid group you can define a preimage in the braid group as instance of the element class of the braid group class:

In [18]:

braid_elements = [element.braid() for element in image_elements ] print 'Braid preimages of\n%s\nand\n%s:\n\n%s\n' %(elements[0], elements[1], braid_elements) type(braid_elements[0]) jones_polynomial = [element.jones_polynomial() for element in braid_elements ] print 'Coresponding Jones polynomials:\n%s\n' %(jones_polynomial) burau_matrix = braid_elements[1].burau_matrix() print 'Burau matrix to second braid preimage:\n%s' %(burau_matrix)

Braid preimages of
[1 1]
[0 1]
and
[0 1]
[2 0]:
[s1, s0*s1*s0]
Coresponding Jones polynomials:
[-sqrt(t) - 1/sqrt(t), -t^(5/2) - sqrt(t)]
Burau matrix to second braid preimage:
[ 1 - t t - t^2 t^2]
[ 1 - t t 0]
[ 1 0 0]

You can calculate the burau matrix correspondig to elements of the cubic braid groups, as well. By default you will get it as matrix over adjoint with a third root of unity (zeta3):

In [19]:

elem = image_elements[1] print "Burau:\n%s" %(elem.burau_matrix())

Burau:
[ -zeta3 1 zeta3]
[ -zeta3 zeta3 + 1 0]
[ 1 0 0]

Using the additional options of this method, you can construct representations in finite matrix groups, as well:

In [20]:

bur_mat = elem.burau_matrix(characteristic = 5) print "Burau in characteristic 5:\n%s\nbase_ring: %s" %(bur_mat, bur_mat.base_ring())

Burau in characteristic 5:
[2*rI + 2 1 3*rI + 3]
[2*rI + 2 3*rI + 4 0]
[ 1 0 0]
base_ring: Finite Field in rI of size 5^2

To see all possible options type:

In [21]:

print CubicBraidElement.burau_matrix.__doc__

Return the Burau matrix of the cubic braid coset.
If you don't see this well formatted type
sage: print CubicBraidElement.burau_matrix.__doc_
This method uses the same method belonging to the Braid class, but reduces the parameter to a primitive six
root of unity, respectivly an element vanishing on the polynomial $x^2-x+1$
INPUT: (all parameters are optional by keyword )
- "rootBur": six root of unity in some field (default six root of unity over $\QQ$)
- "Domain": base_ring for the burau matrix (default is Cyclotomic Field of order 3 and degree 2, resp. the
domain of rootBur if given)
- "reduced": boolean (default: False); whether to return the reduced or unreduced Burau representation
(see Braid class )
- "characteristic": integer giving the characteristic of the domain (default is 0 or the characteristic of
the doamain if given)
- "version": values:
'unitary': gives the unitary form according to Squier (see Braid._unitary_burau_matrix_() )
'default': the method behaves like the original one of the Braid -class
any value else: gives the reduced form given on wikipedia
OUTPUT:
The Burau matrix of the cubic braid coset with entries in the domain given by the options
If you need the values of the reconstructed keywords "rootBur", "Domain" or "characteristic" use the internal
version _burau_matrix_ of this method
RAISE:
- ValueError: 'characteristic must be in integer'
- ValueError: 'characteristic must be a prime'
- ValueError: 'characteristic of Domain does not match given characteristic'
- ValueError: 'rootBur must belong to a domain containing 1'
- ValueError: 'rootBur must vanish on $x^2-x+1$ default case
- ValueError: 'rootBur must vanish on $x^4-x^2+1$ in case of call with version = 'unitary'
EXAMPLES::
sage: C3.<c1, c2> = CubicBraidGroup(3)
sage: ele1 = c1*c2*c1
sage: BurauTest = ele1.burau_matrix(); print BurauTest
[ -zeta3 1 zeta3]
[ -zeta3 zeta3 + 1 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Cyclotomic Field of order 3 and degree 2
sage:
sage: BurauTest = ele1.burau_matrix( characteristic = 0 ); print BurauTest
[ -zeta3 1 zeta3]
[ -zeta3 zeta3 + 1 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Cyclotomic Field of order 3 and degree 2
sage:
sage: BurauTest = ele1.burau_matrix( Domain = QQ ); print BurauTest
Warning: Domain extended to splitting field of tT^2 - tT + 1
[-rI + 1 1 rI - 1]
[-rI + 1 rI 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Number Field in rI with defining polynomial tT^2 - tT + 1
sage:
sage: BurauTest = ele1.burau_matrix( Domain = QQ[I, sqrt(3)] ); print BurauTest
[ 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: BurauTest.base_ring()
Number Field in I with defining polynomial x^2 + 1 over its base field
sage:
sage: BurauTest = ele1.burau_matrix( characteristic = 7 ); print BurauTest
[3 1 4]
[3 5 0]
[1 0 0]
sage: BurauTest.base_ring()
Finite Field of size 7
sage:
sage: BurauTest = ele1.burau_matrix( characteristic = 2 ); print BurauTest
[rI + 1 1 rI + 1]
[rI + 1 rI 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Finite Field in rI of size 2^2
sage:
sage:
sage: F4.<r64> = GF(4)
sage: BurauTest = ele1.burau_matrix( rootBur=r64 ); print BurauTest
[r64 + 1 1 r64 + 1]
[r64 + 1 r64 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Finite Field in r64 of size 2^2
sage:
sage: BurauTest = ele1.burau_matrix( Domain = GF(5) ); print BurauTest
Warning: Domain extended to splitting field of tT^2 + 4*tT + 1
[2*rI + 2 1 3*rI + 3]
[2*rI + 2 3*rI + 4 0]
[ 1 0 0]
sage: BurauTest.base_ring()
Finite Field in rI of size 5^2
sage:
sage: BurauTest = ele1.burau_matrix( version = 'unitary' ); print BurauTest
[ 0 -zeta12^3]
[-zeta12^3 0]
sage: BurauTest.base_ring()
Cyclotomic Field of order 12 and degree 4
sage:
sage: BurauTest = ele1.burau_matrix( Domain = QQ[I, sqrt(3)], version = 'unitary' ); print BurauTest
[ 0 -I]
[-I 0]
sage: BurauTest.base_ring()
Number Field in I with defining polynomial x^2 + 1 over its base field
AUTHOR:
- Sebastian Oehms, Sept. 2016
REFERENCES:
- :wikipedia: "Burau_representation"
for more inormation type
sage: print Braid.burau_matrix.__doc__
sage: print local_Braid.burau_matrix.__doc__
sage: print local_Braid.__burau_matrix_wikipedia__.__doc__
sage: print local_Braid.__burau_matrix_unitary__.__doc__

If you want to create the image of the Burau representation as as matrix group together with the corresponding group homorphism you just need to type, for instance:

In [22]:

C3c7 = C3.as_matrix_group( Domain = GF(7) ); C3c7

Matrix group over Finite Field of size 7 with 2 generators (
[3 5 0] [1 0 0]
[1 0 0] [0 3 5]
[0 0 1], [0 1 0]
)

Conversion maps are availlable as in the case of the classical groups:

In [23]:

c1, c2 = C3.gens(); elemC3 = c1*c2 elemC3c7 = C3c7( elemC3 ); print "elemC3c7:\n", elemC3c7 elemC3back = C3( elemC3c7 ); print "elemC3back:\n", elemC3back print "Check: ", elemC3back == elemC3

elemC3c7:
[3 1 4]
[1 0 0]
[0 1 0]
elemC3back:
c0*c1
Check: True

Of course, the map backwards is a group homomorphism only if the representation is faithfull. In general this conversion map is a section.

Further, note that the Burau representation does factor through the relations of Assion, just for certain characteristic.

A third kind of realization of the cubic braid groups leads to complex reflection groups. This realization is availlable starting with sage version 7.2 if in addition gap3 with the CHEVIE package is installed. In this case the complex reflection group is obtained by:

In [24]:

R3 = C3.as_reflection_group(); R3

Irreducible complex reflection group of rank 2 and type ST4

All methods implemented for the IrreduclibeComplexReflectionGroup class can be used for R3, for example:

In [25]:

ctmat = R3.cartan_matrix() print "Cartan matrix corresponding to %s:\n%s\n" %(C3, ctmat) simproots = R3.simple_roots() print "simple roots corresponding to %s:\n%s\n" %(C3, simproots) reflhplanes = R3.reflection_hyperplanes() print "reflection hyperplanes corresponding to %s:\n%s\n" %(C3, reflhplanes) coxele = R3.coxeter_element() print "Coxeter element corresponding to %s:\n%s" %(C3, coxele)

Cartan matrix corresponding to Cubic Braid group on 3 strands:
[-2*E(3) - E(3)^2 E(3)^2]
[ -E(3)^2 -2*E(3) - E(3)^2]
simple roots corresponding to Cubic Braid group on 3 strands:
Finite family {1: (0, -2*E(3) - E(3)^2), 2: (2*E(3)^2, E(3)^2)}
reflection hyperplanes corresponding to Cubic Braid group on 3 strands:
Finite family {1: Vector space of degree 2 and dimension 1 over Universal Cyclotomic Field
Basis matrix:
[1 0], 2: Vector space of degree 2 and dimension 1 over Universal Cyclotomic Field
Basis matrix:
[ 1 -1], 3: Vector space of degree 2 and dimension 1 over Universal Cyclotomic Field
Basis matrix:
[ 1 -E(3)], 4: Vector space of degree 2 and dimension 1 over Universal Cyclotomic Field
Basis matrix:
[ 1 -E(3)^2]}
Coxeter element corresponding to Cubic Braid group on 3 strands:
(1,7,6,12,23,20)(2,8,17,24,9,5)(3,16,10,19,15,21)(4,14,11,22,18,13)

Elements in R3 may be interpreted as element of the cubic braid group or the classical realization via conversion:

In [26]:

coxeleC3 = C3(coxele) print "Coxeter element as element of %s:\n%s\n" %(C3, coxeleC3) coxeleC3Cl = C3Cl(coxele) print "Coxeter element as element of the classical group corresponding to the %s:\n%s\n" %(C3, coxeleC3Cl)

Coxeter element as element of Cubic Braid group on 3 strands:
c0*c1
Coxeter element as element of the classical group corresponding to the Cubic Braid group on 3 strands:
[ 0 E(4)]
[E(12)^11 E(3)]

Conversion backwards is posible, as well:

In [27]:

c1, c2 = C3.gens() element = c1*c2/c1/c2; elementcl = C3Cl(element) image = R3(element); print "Image of %s in %s:\n%s\n" %(element, R3, image) image = R3(elementcl); print "Image of \n%s\nin %s:\n%s\n" %(elementcl, R3, image)

Image of c0*c1*c0^-1*c1^-1 in Irreducible complex reflection group of rank 2 and type ST4:
(1,15,12,16)(2,18,24,14)(3,17,19,5)(4,20,22,6)(7,9,23,8)(10,11,21,13)
Image of
[ E(3) E(12)^11]
[-E(12)^11 -E(3)]
in Irreducible complex reflection group of rank 2 and type ST4:
(1,15,12,16)(2,18,24,14)(3,17,19,5)(4,20,22,6)(7,9,23,8)(10,11,21,13)

The realization as reflection group allows another realization as matrix group beeing compatible to the corresponding root system. A method for this prurpose has been added to the IrreducibleComplexReflectionGroup_class inside the CubicBraidGroup_class:

In [28]:

R4 = C4.as_reflection_group(); R4Cl = R4.as_matrix_group(); R4Cl

Subgroup of General Unitary Group of degree 3 over Universal Cyclotomic Field generated by:
([ 1 0 0]
[ 0 1 0]
[ 0 0 E(3)], [-1/3*E(3) - 2/3*E(3)^2 2/3*E(3) + 1/3*E(3)^2 2/3*E(3) + 1/3*E(3)^2]
[ 2/3*E(3) + 1/3*E(3)^2 -1/3*E(3) - 2/3*E(3)^2 2/3*E(3) + 1/3*E(3)^2]
[ 2/3*E(3) + 1/3*E(3)^2 2/3*E(3) + 1/3*E(3)^2 -1/3*E(3) - 2/3*E(3)^2], [ 1 0 0]
[ 0 E(3) 0]
[ 0 0 1])

But note, that even in the case where this matrix group is a subgroup of a unitary group, this realization is different from the classical group realization. Even the respective ambient groups are different, since they are defined with respect to different hermitian forms:

In [29]:

C4Cl = C4.as_classical_group() print "ambient group of C4Cl:\n", C4Cl.ambient(); print "" print "ambient group of R4Cl:\n", R4Cl.ambient(); print "" print "hermitian Form of ambient group of R4Cl:\n", R4Cl.ambient().invariant_bilinear_form()

ambient group of C4Cl:
Unitary Group of degree 3 over Universal Cyclotomic Field with respect to 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]
ambient group of R4Cl:
General Unitary Group of degree 3 over Universal Cyclotomic Field
hermitian Form of ambient group of R4Cl:
[1 0 0]
[0 1 0]
[0 0 1]

A third kind of realization of the cubic braid groups leads to permutation groups. This realization is in sage available for all finetely presented groups via the gap interface. In addition you will get coercion maps here, as well and a permutation group constructed with respect to the classical realization. This is the default in the call:

In [30]:

C3.as_permutation_group()

Subgroup of (Symmetric group of order 8! as a permutation group) generated by [(2,3,5)(4,6,8), (1,2,4)(5,7,6)]

To obtain the permutation group calculated for the finitely presented group you must type:

In [31]:

C3.as_permutation_group( native = True )

Subgroup of (Symmetric group of order 8! as a permutation group) generated by [(2,4,5)(3,6,7), (1,2,3)(5,8,6)]

In principal you can use all gap functions being available for these types of groups and being implemented via the gap interface of sage. Use the online help ("print dir(C3)" for example) as shown above to see them all. Here are some examples:

In [32]:

U7 = AssionGroupU( 7 ); print "Order of U7:", U7.order()

Order of U7: 82771476480

In [33]:

conCls1s2 = S4.conjugacy_class( x*y**2*z ); conCls1s2

Conjugacy class of s0*s1^2*s2 in Assion group on 4 strands of type S

In [34]:

S3.character_table()

[ 1 1 1 1 1 1 1]
[ 1 -zeta3 - 1 zeta3 1 zeta3 -zeta3 - 1 1]
[ 1 zeta3 -zeta3 - 1 1 -zeta3 - 1 zeta3 1]
[ 2 -1 -1 -2 1 1 0]
[ 2 -zeta3 zeta3 + 1 -2 -zeta3 - 1 zeta3 0]
[ 2 zeta3 + 1 -zeta3 -2 zeta3 -zeta3 - 1 0]
[ 3 0 0 3 0 0 -1]

In [ ]:

```
```