44Braid groups are implemented as a particular case of finitely presented groups,
55but with a lot of specific methods for braids.
66
7- A braid group can be created by giving the number of strands, and the name of the generators::
7+ A braid group can be created by giving the number of strands, and the name
8+ of the generators::
89
910 sage: BraidGroup(3)
1011 Braid group on 3 strands
1516 sage: BraidGroup(3,'a,b').gens()
1617 (a, b)
1718
18- The elements can be created by operating with the generators, or by passing a list
19- with the indices of the letters to the group::
19+ The elements can be created by operating with the generators, or by passing
20+ a list with the indices of the letters to the group::
2021
2122 sage: B.<s0,s1,s2> = BraidGroup(4)
2223 sage: s0*s1*s0
8182 GroupMorphismWithGensImages ,
8283)
8384from sage .groups .free_group import FreeGroup , is_FreeGroup
84- from sage .groups .perm_gps .permgroup_named import SymmetricGroup , SymmetricGroupElement
85+ from sage .groups .perm_gps .permgroup_named import (SymmetricGroup ,
86+ SymmetricGroupElement )
8587from sage .libs .gap .libgap import libgap
8688from sage .matrix .constructor import identity_matrix , matrix
8789from sage .misc .cachefunc import cached_method
9698from sage .structure .richcmp import rich_to_bool , richcmp
9799
98100lazy_import ('sage.libs.braiding' ,
99- ['leftnormalform' , 'rightnormalform' , 'centralizer' , 'supersummitset' , 'greatestcommondivisor' ,
101+ ['leftnormalform' , 'rightnormalform' , 'centralizer' ,
102+ 'supersummitset' , 'greatestcommondivisor' ,
100103 'leastcommonmultiple' , 'conjugatingbraid' , 'ultrasummitset' ,
101104 'thurston_type' , 'rigidity' , 'sliding_circuits' , 'send_to_sss' ,
102- 'send_to_uss' , 'send_to_sc' , 'trajectory' , 'cyclic_slidings' ],
105+ 'send_to_uss' , 'send_to_sc' , 'trajectory' , 'cyclic_slidings' ],
103106 feature = sage__libs__braiding ())
104107lazy_import ('sage.knots.knot' , 'Knot' )
105108
@@ -466,7 +469,8 @@ def permutation(self, W=None):
466469 """
467470 return self .coxeter_group_element (W )
468471
469- def plot (self , color = 'rainbow' , orientation = 'bottom-top' , gap = 0.05 , aspect_ratio = 1 , axes = False , ** kwds ):
472+ def plot (self , color = 'rainbow' , orientation = 'bottom-top' , gap = 0.05 ,
473+ aspect_ratio = 1 , axes = False , ** kwds ):
470474 """
471475 Plot the braid.
472476
@@ -598,7 +602,7 @@ def plot(self, color='rainbow', orientation='bottom-top', gap=0.05, aspect_ratio
598602
599603 def plot3d (self , color = 'rainbow' ):
600604 """
601- Plots the braid in 3d.
605+ Plot the braid in 3d.
602606
603607 The following option is available:
604608
@@ -796,6 +800,7 @@ def links_gould_matrix(self, symbolics=False):
796800 r"""
797801 Return the representation matrix of ``self`` according to the R-matrix
798802 representation being attached to the quantum superalgebra `\mathfrak{sl}_q(2|1)`.
803+
799804 See [MW2012]_, section 3 and references given there.
800805
801806 INPUT:
@@ -827,15 +832,16 @@ def links_gould_matrix(self, symbolics=False):
827832 M = rep [0 ][0 ].parent ().one ()
828833 for i in self .Tietze ():
829834 if i > 0 :
830- M = M * rep [i - 1 ][0 ]
835+ M = M * rep [i - 1 ][0 ]
831836 if i < 0 :
832- M = M * rep [- i - 1 ][1 ]
837+ M = M * rep [- i - 1 ][1 ]
833838 return M
834839
835840 @cached_method
836841 def links_gould_polynomial (self , varnames = None , use_symbolics = False ):
837842 r"""
838843 Return the Links-Gould polynomial of the closure of ``self``.
844+
839845 See [MW2012]_, section 3 and references given there.
840846
841847 INPUT:
@@ -872,12 +878,13 @@ def links_gould_polynomial(self, varnames=None, use_symbolics=False):
872878 mu = rep [ln - 1 ] # quantum trace factor
873879 M = mu * self .links_gould_matrix (symbolics = use_symbolics )
874880 d1 , d2 = M .dimensions ()
875- e = d1 // 4
881+ e = d1 // 4
876882 B = M .base_ring ()
877883 R = LaurentPolynomialRing (ZZ , varnames )
878884
879885 # partial quantum trace according to I. Marin section 2.5
880- part_trace = matrix (B , 4 , 4 , lambda i , j : sum (M [e * i + k , e * j + k ] for k in range (e )))
886+ part_trace = matrix (B , 4 , 4 , lambda i , j : sum (M [e * i + k , e * j + k ]
887+ for k in range (e )))
881888 ptemp = part_trace [0 , 0 ] # part_trace == psymb*M.parent().one()
882889 if use_symbolics :
883890 v1 , v2 = R .variable_names ()
@@ -888,13 +895,13 @@ def links_gould_polynomial(self, varnames=None, use_symbolics=False):
888895 else :
889896 ltemp = ptemp .lift ().constant_coefficient ()
890897 # Since the result of the calculation is known to be a Laurent polynomial
891- # in t0 and t1 all exponents of ltemp must be divisable by 2
898+ # in t0 and t1 all exponents of ltemp must be divisible by 2
892899 L = ltemp .parent ()
893900 lred = L ({(k [0 ]/ 2 , k [1 ]/ 2 ): v for k , v in ltemp .monomial_coefficients ().items ()})
894901 t0 , t1 = R .gens ()
895902 return lred (t0 , t1 )
896903
897- def tropical_coordinates (self ):
904+ def tropical_coordinates (self ) -> list :
898905 r"""
899906 Return the tropical coordinates of ``self`` in the braid group `B_n`.
900907
@@ -938,7 +945,7 @@ def tropical_coordinates(self):
938945
939946 from sage .rings .semirings .tropical_semiring import TropicalSemiring
940947 T = TropicalSemiring (ZZ )
941- return [T (_ ) for _ in coord ]
948+ return [T (c ) for c in coord ]
942949
943950 def markov_trace (self , variab = None , normalized = True ):
944951 r"""
@@ -1606,7 +1613,7 @@ def right_normal_form(self):
16061613 B = self .parent ()
16071614 return tuple ([B (b ) for b in rnf [:- 1 ]] + [B .delta ()** rnf [- 1 ][0 ]])
16081615
1609- def centralizer (self ):
1616+ def centralizer (self ) -> list :
16101617 """
16111618 Return a list of generators of the centralizer of the braid.
16121619
@@ -1621,7 +1628,7 @@ def centralizer(self):
16211628 B = self .parent ()
16221629 return [B ._element_from_libbraiding (b ) for b in c ]
16231630
1624- def super_summit_set (self ):
1631+ def super_summit_set (self ) -> list :
16251632 """
16261633 Return a list with the super summit set of the braid.
16271634
@@ -1739,10 +1746,9 @@ def conjugating_braid(self, other):
17391746 cb = conjugatingbraid (self , other )
17401747 if not cb :
17411748 return None
1742- else :
1743- B = self .parent ()
1744- cb [0 ][0 ] %= 2
1745- return B ._element_from_libbraiding (cb )
1749+ B = self .parent ()
1750+ cb [0 ][0 ] %= 2
1751+ return B ._element_from_libbraiding (cb )
17461752
17471753 def is_conjugated (self , other ) -> bool :
17481754 """
@@ -1859,7 +1865,7 @@ def pure_conjugating_braid(self, other):
18591865 n2 = len (b2 .Tietze ())
18601866 return b2 if n2 <= n0 else b0
18611867
1862- def ultra_summit_set (self ):
1868+ def ultra_summit_set (self ) -> list :
18631869 """
18641870 Return a list with the orbits of the ultra summit set of ``self``.
18651871
@@ -1888,7 +1894,7 @@ def ultra_summit_set(self):
18881894 B = self .parent ()
18891895 return [[B ._element_from_libbraiding (i ) for i in s ] for s in uss ]
18901896
1891- def thurston_type (self ):
1897+ def thurston_type (self ) -> str :
18921898 """
18931899 Return the thurston_type of ``self``.
18941900
@@ -1973,7 +1979,7 @@ def rigidity(self):
19731979 """
19741980 return Integer (rigidity (self ))
19751981
1976- def sliding_circuits (self ):
1982+ def sliding_circuits (self ) -> list :
19771983 """
19781984 Return the sliding circuits of the braid.
19791985
@@ -2270,7 +2276,7 @@ def ultra_summit_set_element(self):
22702276 B = self .parent ()
22712277 return tuple ([B ._element_from_libbraiding (b ) for b in to_uss ])
22722278
2273- def sliding_circuits_element (self ):
2279+ def sliding_circuits_element (self ) -> tuple :
22742280 r"""
22752281 Return an element of the braid's sliding circuits, and the conjugating
22762282 braid.
@@ -2286,7 +2292,7 @@ def sliding_circuits_element(self):
22862292 B = self .parent ()
22872293 return tuple ([B ._element_from_libbraiding (b ) for b in to_sc ])
22882294
2289- def trajectory (self ):
2295+ def trajectory (self ) -> list :
22902296 r"""
22912297 Return the braid's trajectory.
22922298
@@ -2304,7 +2310,7 @@ def trajectory(self):
23042310 B = self .parent ()
23052311 return [B ._element_from_libbraiding (b ) for b in traj ]
23062312
2307- def cyclic_slidings (self ):
2313+ def cyclic_slidings (self ) -> list :
23082314 r"""
23092315 Return the braid's cyclic slidings.
23102316
@@ -2484,6 +2490,7 @@ def reduced_word(self):
24842490 def tuple_to_word (q_tuple ):
24852491 return M .prod (self ._gens [i ]** exp
24862492 for i , exp in enumerate (q_tuple ))
2493+
24872494 ret = {tuple_to_word (q_tuple ): q_factor
24882495 for q_tuple , q_factor in self .tuples .items () if q_factor }
24892496 return self ._algebra ._from_dict (ret , remove_zeros = False )
@@ -2546,7 +2553,7 @@ def eps_monom(q_tuple):
25462553 return sum (q_factor * eps_monom (q_tuple )
25472554 for q_tuple , q_factor in self .tuples .items ())
25482555
2549- def __repr__ (self ):
2556+ def __repr__ (self ) -> str :
25502557 r"""
25512558 String representation of ``self``.
25522559
@@ -2582,7 +2589,7 @@ class BraidGroup_class(FiniteTypeArtinGroup):
25822589 """
25832590 Element = Braid
25842591
2585- def __init__ (self , names ):
2592+ def __init__ (self , names ) -> None :
25862593 """
25872594 Python constructor.
25882595
@@ -2657,7 +2664,7 @@ def __init__(self, names):
26572664 # For caching hermitian form of unitary Burau representation
26582665 self ._hermitian_form = None
26592666
2660- def __reduce__ (self ):
2667+ def __reduce__ (self ) -> tuple :
26612668 """
26622669 TESTS::
26632670
@@ -2670,7 +2677,7 @@ def __reduce__(self):
26702677 """
26712678 return (BraidGroup_class , (self .variable_names (), ))
26722679
2673- def _repr_ (self ):
2680+ def _repr_ (self ) -> str :
26742681 """
26752682 Return a string representation.
26762683
@@ -2761,7 +2768,7 @@ def an_element(self):
27612768 """
27622769 return self .gen (0 )
27632770
2764- def some_elements (self ):
2771+ def some_elements (self ) -> list :
27652772 """
27662773 Return a list of some elements of the braid group.
27672774
@@ -2778,7 +2785,7 @@ def some_elements(self):
27782785 elements_list .append (elements_list [- 1 ]** self .strands ())
27792786 return elements_list
27802787
2781- def _standard_lift_Tietze (self , p ):
2788+ def _standard_lift_Tietze (self , p ) -> tuple :
27822789 """
27832790 Helper for :meth:`_standard_lift_Tietze`.
27842791
@@ -2806,8 +2813,7 @@ def _standard_lift_Tietze(self, p):
28062813 (1, 2, 3, 4, 1, 2)
28072814 """
28082815 G = SymmetricGroup (self .strands ())
2809- pl = G (p )
2810- return tuple (pl .reduced_word ())
2816+ return tuple (G (p ).reduced_word ())
28112817
28122818 @cached_method
28132819 def _links_gould_representation (self , symbolics = False ):
@@ -2853,8 +2859,9 @@ def _links_gould_representation(self, symbolics=False):
28532859 else :
28542860 from sage .rings .polynomial .polynomial_ring_constructor import PolynomialRing
28552861 LR = LaurentPolynomialRing (ZZ , 's0r, s1r' )
2862+ s0r , s1r = LR .gens ()
28562863 PR = PolynomialRing (LR , 'Yr' )
2857- s0r , s1r , Yr = PR .gens_dict_recursive (). values ()
2864+ Yr = PR .gens ()
28582865 pqr = Yr ** 2 + (s0r ** 2 - 1 ) * (s1r ** 2 - 1 )
28592866 BR = PR .quotient_ring (pqr )
28602867 s0 = BR (s0r )
@@ -3419,9 +3426,10 @@ def mirror_involution(self):
34193426 r"""
34203427 Return the mirror involution of ``self``.
34213428
3422- This automorphism maps a braid to another one by replacing each generator
3423- in its word by the inverse. In general this is different from the inverse
3424- of the braid since the order of the generators in the word is not reversed.
3429+ This automorphism maps a braid to another one by replacing
3430+ each generator in its word by the inverse. In general this is
3431+ different from the inverse of the braid since the order of the
3432+ generators in the word is not reversed.
34253433
34263434 EXAMPLES::
34273435
@@ -3485,7 +3493,7 @@ def presentation_two_generators(self, isomorphisms=False):
34853493 h2 = G .hom (codomain = self , im_gens = [self (a ) for a in L2 ], check = False )
34863494 return (G , h1 , h2 )
34873495
3488- def epimorphisms (self , H ):
3496+ def epimorphisms (self , H ) -> list :
34893497 r"""
34903498 Return the epimorphisms from ``self`` to ``H``, up to automorphism of `H` passing
34913499 through the :meth:`two generator presentation
@@ -3518,12 +3526,15 @@ def epimorphisms(self, H):
35183526 Gg = libgap (G )
35193527 Hg = libgap (H )
35203528 gquotients = Gg .GQuotients (Hg )
3521- hom1g = libgap .GroupHomomorphismByImagesNC (G0g , Gg , [libgap (hom1 (u )) for u in self .gens ()])
3529+ hom1g = libgap .GroupHomomorphismByImagesNC (G0g , Gg ,
3530+ [libgap (hom1 (u ))
3531+ for u in self .gens ()])
35223532 g0quotients = [hom1g * h for h in gquotients ]
35233533 res = []
35243534 # the following closure is needed to attach a specific value of quo to
35253535 # each function in the different morphisms
3526- fmap = lambda tup : (lambda a : H (prod (tup [abs (i )- 1 ]** sign (i ) for i in a .Tietze ())))
3536+ fmap = lambda tup : (lambda a : H (prod (tup [abs (i )- 1 ]** sign (i )
3537+ for i in a .Tietze ())))
35273538 for quo in g0quotients :
35283539 tup = tuple (H (quo .ImageElm (i .gap ()).sage ()) for i in self .gens ())
35293540 fhom = GroupMorphismWithGensImages (HomSpace , fmap (tup ))
@@ -3651,22 +3662,24 @@ class group of the punctured disk.
36513662
36523663 sage: A = B.mapping_class_action(F)
36533664 sage: A
3654- Right action by Braid group on 4 strands on Free Group on generators {x0, x1, x2, x3}
3665+ Right action by Braid group on 4 strands on Free Group
3666+ on generators {x0, x1, x2, x3}
36553667 sage: A(x0, s1)
36563668 x0
36573669 sage: A(x1, s1)
36583670 x1*x2*x1^-1
36593671 sage: A(x1^-1, s1)
36603672 x1*x2^-1*x1^-1
36613673 """
3662- def __init__ (self , G , M ):
3674+ def __init__ (self , G , M ) -> None :
36633675 """
36643676 TESTS::
36653677
36663678 sage: B = BraidGroup(3)
36673679 sage: G = FreeGroup('a, b, c')
36683680 sage: B.mapping_class_action(G) # indirect doctest
3669- Right action by Braid group on 3 strands on Free Group on generators {a, b, c}
3681+ Right action by Braid group on 3 strands on Free Group
3682+ on generators {a, b, c}
36703683 """
36713684 import operator
36723685 Action .__init__ (self , G , M , False , operator .mul )
0 commit comments