passagemath-groups 10.5.6__cp311-cp311-macosx_13_0_x86_64.whl → 10.6.31rc3__cp311-cp311-macosx_13_0_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,113 @@
1
+ Metadata-Version: 2.4
2
+ Name: passagemath-groups
3
+ Version: 10.6.31rc3
4
+ Summary: passagemath: Groups and Invariant Theory
5
+ Author-email: The Sage Developers <sage-support@googlegroups.com>
6
+ Maintainer: Matthias Köppe, passagemath contributors
7
+ License-Expression: GPL-2.0-or-later
8
+ Project-URL: release notes, https://github.com/passagemath/passagemath/releases
9
+ Project-URL: repo (upstream), https://github.com/sagemath/sage
10
+ Project-URL: repo, https://github.com/passagemath/passagemath
11
+ Project-URL: documentation, https://passagemath.org/docs/latest
12
+ Project-URL: homepage (upstream), https://www.sagemath.org
13
+ Project-URL: discourse, https://passagemath.discourse.group
14
+ Project-URL: tracker (upstream), https://github.com/sagemath/sage/issues
15
+ Project-URL: tracker, https://github.com/passagemath/passagemath/issues
16
+ Classifier: Development Status :: 6 - Mature
17
+ Classifier: Intended Audience :: Education
18
+ Classifier: Intended Audience :: Science/Research
19
+ Classifier: Operating System :: POSIX
20
+ Classifier: Operating System :: POSIX :: Linux
21
+ Classifier: Operating System :: MacOS :: MacOS X
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Programming Language :: Python :: 3.14
28
+ Classifier: Programming Language :: Python :: Implementation :: CPython
29
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
30
+ Requires-Python: <3.15,>=3.10
31
+ Description-Content-Type: text/x-rst
32
+ Requires-Dist: passagemath-categories==10.6.31rc3
33
+ Requires-Dist: passagemath-gap==10.6.31rc3
34
+ Requires-Dist: passagemath-modules==10.6.31rc3
35
+ Provides-Extra: test
36
+ Requires-Dist: passagemath-repl; extra == "test"
37
+ Provides-Extra: coxeter3
38
+ Requires-Dist: passagemath-coxeter3; extra == "coxeter3"
39
+ Provides-Extra: gap
40
+ Provides-Extra: additive
41
+ Provides-Extra: affine
42
+ Provides-Extra: lie
43
+ Provides-Extra: matrix
44
+ Provides-Extra: permutation
45
+ Provides-Extra: presentation
46
+ Provides-Extra: representations
47
+ Requires-Dist: passagemath-combinat; extra == "representations"
48
+ Provides-Extra: semigroups
49
+ Requires-Dist: passagemath-combinat; extra == "semigroups"
50
+ Provides-Extra: standard
51
+ Requires-Dist: passagemath-groups[additive,matrix,representations,semigroups]; extra == "standard"
52
+
53
+ =====================================================================
54
+ passagemath: Groups and Invariant Theory
55
+ =====================================================================
56
+
57
+ `passagemath <https://github.com/passagemath/passagemath>`__ is open
58
+ source mathematical software in Python, released under the GNU General
59
+ Public Licence GPLv2+.
60
+
61
+ It is a fork of `SageMath <https://www.sagemath.org/>`__, which has been
62
+ developed 2005-2025 under the motto “Creating a Viable Open Source
63
+ Alternative to Magma, Maple, Mathematica, and MATLAB”.
64
+
65
+ The passagemath fork uses the motto "Creating a Free Passage Between the
66
+ Scientific Python Ecosystem and Mathematical Software Communities."
67
+ It was created in October 2024 with the following goals:
68
+
69
+ - providing modularized installation with pip,
70
+ - establishing first-class membership in the scientific Python
71
+ ecosystem,
72
+ - giving `clear attribution of upstream
73
+ projects <https://groups.google.com/g/sage-devel/c/6HO1HEtL1Fs/m/G002rPGpAAAJ>`__,
74
+ - providing independently usable Python interfaces to upstream
75
+ libraries,
76
+ - offering `platform portability and integration testing
77
+ services <https://github.com/passagemath/passagemath/issues/704>`__
78
+ to upstream projects,
79
+ - inviting collaborations with upstream projects,
80
+ - `building a professional, respectful, inclusive
81
+ community <https://groups.google.com/g/sage-devel/c/xBzaINHWwUQ>`__,
82
+ - `empowering Sage users to participate in the scientific Python ecosystem
83
+ <https://github.com/passagemath/passagemath/issues/248>`__ by publishing packages,
84
+ - developing a port to `Pyodide <https://pyodide.org/en/stable/>`__ for
85
+ serverless deployment with Javascript,
86
+ - developing a native Windows port.
87
+
88
+ `Full documentation <https://passagemath.org/docs/latest/html/en/index.html>`__ is
89
+ available online.
90
+
91
+ passagemath attempts to support and provides binary wheels suitable for
92
+ all major Linux distributions and recent versions of macOS.
93
+
94
+ Binary wheels for native Windows (x86_64) are are available for a subset of
95
+ the passagemath distributions. Use of the full functionality of passagemath
96
+ on Windows currently requires the use of Windows Subsystem for Linux (WSL)
97
+ or virtualization.
98
+
99
+ The supported Python versions in the passagemath 10.6.x series are 3.10.x-3.13.x.
100
+
101
+
102
+ About this pip-installable distribution package
103
+ -----------------------------------------------
104
+
105
+ This pip-installable package ``passagemath-groups`` a distribution of a part of the Sage Library. It provides a small subset of the modules of the Sage library ("sagelib", ``passagemath-standard``) for computations with groups.
106
+
107
+
108
+ What is included
109
+ ----------------
110
+
111
+ * `Groups <https://passagemath.org/docs/latest/html/en/reference/groups/index.html>`_
112
+
113
+ * see https://github.com/passagemath/passagemath/blob/main/pkgs/sagemath-groups/MANIFEST.in
@@ -0,0 +1,39 @@
1
+ passagemath_groups.dylibs/libreadline.8.2.dylib,sha256=72suzcaXCcybK0QXegE7UE0RQBlgvEX4IdQPNglBzrQ,300032
2
+ passagemath_groups.dylibs/libz.1.3.1.dylib,sha256=9Hhgm_e9pvI1VtfNcMqL7YjAakyzlSuGRZcR-jAkNUA,128928
3
+ passagemath_groups.dylibs/libgap.10.dylib,sha256=MQSc4m9xKmpsJsFc0NHtvKdAudRuzEep1R2LNM6k4kM,2524976
4
+ passagemath_groups.dylibs/libgmp.10.dylib,sha256=fu542UCvo3ZacIgrGLQN4qezlyObM_Gyi6lasM72Ysk,510784
5
+ passagemath_groups-10.6.31rc3.dist-info/RECORD,,
6
+ passagemath_groups-10.6.31rc3.dist-info/WHEEL,sha256=RyxoEM-DdYra2rgZTpxdiJkmjbwgUQ_Obk5UCeDLiEQ,137
7
+ passagemath_groups-10.6.31rc3.dist-info/top_level.txt,sha256=Kmzulf9WsphADFQuqgvdy5mvTLDj_V2zkFHU2s3UXos,6
8
+ passagemath_groups-10.6.31rc3.dist-info/METADATA,sha256=wUlLpHzoPm_PIKLPS0jXnNzOWhh-_2HjvD92VXMscxQ,5183
9
+ sage/all__sagemath_groups.py,sha256=JOSY5oJmS67eaWpSs14SBcD7be6NMKH05esJQj8sNOI,525
10
+ sage/groups/finitely_presented.py,sha256=hLccjNjrj880fFeiLu9W7Z7Xz1HewuyJTVKNWrUsVMI,70042
11
+ sage/groups/fqf_orthogonal.py,sha256=8cx71JJorwsFoSPzVLBg1rI_dA9dfGeWDqA6GAuqRh8,20181
12
+ sage/groups/free_group.py,sha256=iMxfq5y8gA91i7XdpCmlL2N-5s2h_oYYohITmhMpVXo,29468
13
+ sage/groups/all__sagemath_groups.py,sha256=g4HxEDA-YDJcTYHqA5pGLBIy7gpzg-BEVb2Jn7mTJD8,1147
14
+ sage/groups/artin.py,sha256=CQHII1jKlBJZ_3GEyH-D22lS06prmIYcagTE7eg_RKc,41353
15
+ sage/groups/finitely_presented_named.py,sha256=dKB2M78fw5W7RTHCGy-VB_X9co9UbFcQQYSdBr945Rc,20597
16
+ sage/groups/all.py,sha256=ia6P1nJW_QxBEPMNKdT6ZE8v7J0z8qlMbX2uD3lBJU8,229
17
+ sage/groups/raag.py,sha256=WbkPRhwCopLc2PtJ_Zcy_QASzsHcsp84_fM1x_dUcWw,28842
18
+ sage/groups/cubic_braid.py,sha256=LEStrE9YiJAb5acsybhoQhth5fh-wbtn7uLjYyLoO1o,86974
19
+ sage/groups/group_semidirect_product.py,sha256=7XqgwRR8i-KAWQdRXE8uoNbYDG-mDTqFw2uyqhDGCwY,17910
20
+ sage/groups/cactus_group.py,sha256=O0FTBvGw8y3nRSR1aGPn5FdEv3jILG7QK_g_lZYdLPc,32895
21
+ sage/groups/braid.py,sha256=6LyEbj9KCOyR7v1HhHWYyd62XqGSHcIOQVQF_TuWCXk,140495
22
+ sage/groups/finitely_presented_catalog.py,sha256=Ylc_cx0Sv6eKH9J-n4xotqWK0Hc4pNrwZ3iRPe-gh1s,1251
23
+ sage/groups/group_exp.py,sha256=KjhnaTnqnNKvBmYZJEbUge2-RydGSkued1JFXSLzeoo,11190
24
+ sage/groups/kernel_subgroup.py,sha256=hZVsh5UYfq6MPxekXwlRuQyPuHq0Fk6SlNnN-5Yja6A,7706
25
+ sage/groups/lie_gps/catalog.py,sha256=O5ub0bmV3z8tvJEFjxhgjIz4Zff8rJksOe5VQp0py0o,363
26
+ sage/groups/lie_gps/all.py,sha256=-vXQHOTG46Zum7Q6k0kcJO43yJo09AIX-El8fzXA7eI,45
27
+ sage/groups/lie_gps/nilpotent_lie_group.py,sha256=6VEgyU0U4ERif179dC1JWBdxO1PM6ZJ4d7Rc7dLkZmY,32506
28
+ sage/groups/misc_gps/misc_groups.py,sha256=W2eH0XFqltL2-g7suj4vS8-klTYW4bTFmoWJ6ciR0-s,346
29
+ sage/groups/misc_gps/all.py,sha256=-vXQHOTG46Zum7Q6k0kcJO43yJo09AIX-El8fzXA7eI,45
30
+ sage/groups/misc_gps/misc_groups_catalog.py,sha256=TbpMPXGhwFpeOMlXdwdIGItBLV0XSvfN4oQRbKbMK9o,1627
31
+ sage/groups/abelian_gps/all.py,sha256=yQQEiBWy_vtucLyFb_q1OIqgiC_DIE9KUzNWpdGTa4A,906
32
+ sage/groups/semimonomial_transformations/semimonomial_transformation.cpython-311-darwin.so,sha256=FgGIWI8YCRssC-dQ_Uv_WPFRkHenjOeL1O3ls518hEQ,131976
33
+ sage/groups/semimonomial_transformations/semimonomial_transformation.pyx,sha256=9j9eS_uZYdCUQrTJDs4VhpO_7SeSzXdnzh0cACFNtkk,11298
34
+ sage/groups/semimonomial_transformations/all.py,sha256=-vXQHOTG46Zum7Q6k0kcJO43yJo09AIX-El8fzXA7eI,45
35
+ sage/groups/semimonomial_transformations/semimonomial_transformation_group.py,sha256=QflEYRK_oDUf8axx4kwcUR4aMOQNmE_faY1lzOdrAvQ,18312
36
+ sage/groups/semimonomial_transformations/semimonomial_transformation.pxd,sha256=wivg7LyXn_ZMrADRUmabPEYNitTRZCvs2htLN3E0v9g,297
37
+ sage/geometry/all__sagemath_groups.py,sha256=-vXQHOTG46Zum7Q6k0kcJO43yJo09AIX-El8fzXA7eI,45
38
+ sage/geometry/palp_normal_form.pyx,sha256=HfDpZHxffoxG2pxTrXO0ucRlEDZcrtzHBoZ0CoHm5lI,17498
39
+ sage/geometry/palp_normal_form.cpython-311-darwin.so,sha256=6GR7I1FSlnhEauQM7r6UOpJl8fr9WWKQRDNg1ZEyxK0,227760
@@ -1,5 +1,6 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp311-cp311-macosx_13_0_x86_64
5
+ Generator: delocate 0.13.0
5
6
 
Binary file
@@ -1,4 +1,5 @@
1
1
  # sage_setup: distribution = sagemath-groups
2
+ # delvewheel: patch
2
3
  r"""
3
4
  Top level of the distribution package sagemath-groups
4
5
 
@@ -9,8 +10,8 @@ This distribution makes the following feature available::
9
10
  FeatureTestResult('sage.groups', True)
10
11
  """
11
12
 
12
- from .all__sagemath_modules import *
13
13
  from .all__sagemath_gap import *
14
+ from .all__sagemath_modules import *
14
15
 
15
16
  try: # extra
16
17
  from sage.all__sagemath_combinat import *
@@ -198,7 +198,7 @@ def _palp_PM_max(Matrix_integer_dense PM, check=False):
198
198
  else:
199
199
  S[i] = i + 1
200
200
 
201
- cdef int l, np, cf, ccf, n_s_bar, d1, v0, vc, vj
201
+ cdef int l, cf, ccf, n_s_bar, d1, v0, vc, vj
202
202
  cdef list l_r
203
203
 
204
204
  # We determine the other rows of PM_max in turn by use of perms and
@@ -10,10 +10,6 @@ from sage.groups.all__sagemath_gap import *
10
10
 
11
11
  from sage.misc.lazy_import import lazy_import
12
12
 
13
- lazy_import('sage.groups.class_function', 'ClassFunction')
14
-
15
- lazy_import('sage.groups.conjugacy_classes', ['ConjugacyClass', 'ConjugacyClassGAP'])
16
-
17
13
  lazy_import('sage.groups.free_group', 'FreeGroup')
18
14
  lazy_import('sage.groups.braid', 'BraidGroup')
19
15
  lazy_import('sage.groups.cubic_braid', 'CubicBraidGroup')
sage/groups/artin.py CHANGED
@@ -10,10 +10,17 @@ of the corresponding Coxeter group.
10
10
  AUTHORS:
11
11
 
12
12
  - Travis Scrimshaw (2018-02-05): Initial version
13
+ - Travis Scrimshaw (2025-01-30): Allowed general construction; implemented
14
+ general Burau representation
15
+
16
+ .. TODO::
17
+
18
+ Implement affine type Artin groups with their well-known embeddings into
19
+ the classical braid group.
13
20
  """
14
21
 
15
22
  # ****************************************************************************
16
- # Copyright (C) 2018 Travis Scrimshaw <tcscrims at gmail.com>
23
+ # Copyright (C) 2018-2025 Travis Scrimshaw <tcscrims at gmail.com>
17
24
  #
18
25
  # This program is free software: you can redistribute it and/or modify
19
26
  # it under the terms of the GNU General Public License as published by
@@ -27,6 +34,7 @@ from sage.combinat.root_system.coxeter_group import CoxeterGroup
27
34
  from sage.groups.free_group import FreeGroup
28
35
  from sage.groups.finitely_presented import FinitelyPresentedGroup, FinitelyPresentedGroupElement
29
36
  from sage.misc.cachefunc import cached_method
37
+ from sage.misc.lazy_attribute import lazy_attribute
30
38
  from sage.rings.infinity import Infinity
31
39
  from sage.structure.richcmp import richcmp, rich_to_bool
32
40
  from sage.structure.unique_representation import UniqueRepresentation
@@ -62,7 +70,7 @@ class ArtinGroupElement(FinitelyPresentedGroupElement):
62
70
  sage: b._latex_() # needs sage.rings.number_field
63
71
  '\\sigma_{1}\\sigma_{2}\\sigma_{3}\\sigma_{1}^{-1}\\sigma_{2}\\sigma_{3}^{-1}'
64
72
 
65
- sage: # needs sage.graphs
73
+ sage: # needs sage.combinat sage.graphs
66
74
  sage: B = BraidGroup(4)
67
75
  sage: b = B([1, 2, 3, -1, 2, -3])
68
76
  sage: b._latex_()
@@ -93,7 +101,7 @@ class ArtinGroupElement(FinitelyPresentedGroupElement):
93
101
  sage: b.exponent_sum()
94
102
  0
95
103
 
96
- sage: # needs sage.graphs
104
+ sage: # needs sage.combinat sage.graphs
97
105
  sage: B = BraidGroup(5)
98
106
  sage: b = B([1, 4, -3, 2])
99
107
  sage: b.exponent_sum()
@@ -127,6 +135,8 @@ class ArtinGroupElement(FinitelyPresentedGroupElement):
127
135
  [ a -a 1]
128
136
  sage: b.coxeter_group_element().reduced_word()
129
137
  [1, 2, 3, 2]
138
+
139
+ sage: # neeeds sage.combinat sage.rings.number_field
130
140
  sage: A.<s1,s2,s3> = ArtinGroup(['A',3])
131
141
  sage: c = s1 * s2 *s3
132
142
  sage: c1 = c.coxeter_group_element(); c1
@@ -161,7 +171,157 @@ class ArtinGroupElement(FinitelyPresentedGroupElement):
161
171
  W = self.parent().coxeter_group()
162
172
  s = W.simple_reflections()
163
173
  In = W.index_set()
164
- return W.prod(s[In[abs(i)-1]] for i in self.Tietze())
174
+ return W.prod(s[In[abs(i) - 1]] for i in self.Tietze())
175
+
176
+ def burau_matrix(self, var='t'):
177
+ r"""
178
+ Return the Burau matrix of the Artin group element.
179
+
180
+ Following [BQ2024]_, the (generalized) Burau representation
181
+ of an Artin group is defined by deforming the reflection
182
+ representation of the corresponding Coxeter group. However,
183
+ we substitute `q \mapsto -t` from [BQ2024]_ to match one of
184
+ the unitary (reduced) Burau representations of the braid group
185
+ (see :meth:`sage.groups.braid.Braid.burau_matrix()` for details.)
186
+
187
+ More precisely, let `(m_{ij})_{i,j \in I}` be the
188
+ :meth:`Coxeter matrix<coxeter_matrix>`. Then the action is
189
+ given on the basis `(\alpha_1, \ldots \alpha_n)` (corresponding
190
+ to the reflection representation of the corresponding
191
+ :meth:`Coxeter group<coxeter_group>`) by
192
+
193
+ .. MATH::
194
+
195
+ \sigma_i(\alpha_j) = \alpha_j
196
+ - \langle \alpha_i, \alpha_j \rangle_q \alpha_i,
197
+ \qquad \text{ where }
198
+ \langle \alpha_i, \alpha_j \rangle_q := \begin{cases}
199
+ 1 + t^2 & \text{if } i = j, \\
200
+ -2 t \cos(\pi/m_{ij}) & \text{if } i \neq j.
201
+ \end{cases}.
202
+
203
+ By convention `\cos(\pi/\infty) = 1`. Note that the inverse of the
204
+ generators act by `\sigma_i^{-1}(\alpha_j) = \alpha_j - q^{-2}
205
+ \langle \alpha_j, \alpha_i \rangle_q \alpha_i`.
206
+
207
+ INPUT:
208
+
209
+ - ``var`` -- string (default: ``'t'``); the name of the
210
+ variable in the entries of the matrix
211
+
212
+ OUTPUT:
213
+
214
+ The Burau matrix of the Artin group element over the Laurent
215
+ polynomial ring in the variable ``var``.
216
+
217
+ EXAMPLES::
218
+
219
+ sage: A.<s1,s2,s3> = ArtinGroup(['B',3])
220
+ sage: B1 = s1.burau_matrix()
221
+ sage: B2 = s2.burau_matrix()
222
+ sage: B3 = s3.burau_matrix()
223
+ sage: [B1, B2, B3]
224
+ [
225
+ [-t^2 t 0] [ 1 0 0] [ 1 0 0]
226
+ [ 0 1 0] [ t -t^2 a*t] [ 0 1 0]
227
+ [ 0 0 1], [ 0 0 1], [ 0 a*t -t^2]
228
+ ]
229
+ sage: B1 * B2 * B1 == B2 * B1 * B2
230
+ True
231
+ sage: B2 * B3 * B2 * B3 == B3 * B2 * B3 * B2
232
+ True
233
+ sage: B1 * B3 == B3 * B1
234
+ True
235
+ sage: (~s1).burau_matrix() * B1 == 1
236
+ True
237
+
238
+ We verify the example in Theorem 4.1 of [BQ2024]_::
239
+
240
+ sage: A.<s1,s2,s3,s4> = ArtinGroup(['A', 3, 1])
241
+ sage: [g.burau_matrix() for g in A.gens()]
242
+ [
243
+ [-t^2 t 0 t] [ 1 0 0 0] [ 1 0 0 0]
244
+ [ 0 1 0 0] [ t -t^2 t 0] [ 0 1 0 0]
245
+ [ 0 0 1 0] [ 0 0 1 0] [ 0 t -t^2 t]
246
+ [ 0 0 0 1], [ 0 0 0 1], [ 0 0 0 1],
247
+ <BLANKLINE>
248
+ [ 1 0 0 0]
249
+ [ 0 1 0 0]
250
+ [ 0 0 1 0]
251
+ [ t 0 t -t^2]
252
+ ]
253
+ sage: a = s3^2 * s4 * s3 * s2 *s1 * ~s3 * s4 * s3 * s2 * s1^-2 * s4
254
+ sage: b = s1^2 * ~s2 * s4 * s1 * ~s3 * s2 * ~s4 * s3 * s1 * s4 * s1 * ~s2 * s4^-2 * s3
255
+ sage: alpha = a * s3 * ~a
256
+ sage: beta = b * s2 * ~b
257
+ sage: elm = alpha * beta * ~alpha * ~beta
258
+ sage: print(elm.Tietze())
259
+ (3, 3, 4, 3, 2, 1, -3, 4, 3, 2, -1, -1, 4, 3, -4, 1, 1, -2, -3,
260
+ -4, 3, -1, -2, -3, -4, -3, -3, 1, 1, -2, 4, 1, -3, 2, -4, 3, 1,
261
+ 4, 1, -2, -4, -4, 3, 2, -3, 4, 4, 2, -1, -4, -1, -3, 4, -2, 3,
262
+ -1, -4, 2, -1, -1, 3, 3, 4, 3, 2, 1, -3, 4, 3, 2, -1, -1, 4,
263
+ -3, -4, 1, 1, -2, -3, -4, 3, -1, -2, -3, -4, -3, -3, 1, 1, -2,
264
+ 4, 1, -3, 2, -4, 3, 1, 4, 1, -2, -4, -4, 3, -2, -3, 4, 4, 2,
265
+ -1, -4, -1, -3, 4, -2, 3, -1, -4, 2, -1, -1)
266
+ sage: elm.burau_matrix()
267
+ [1 0 0 0]
268
+ [0 1 0 0]
269
+ [0 0 1 0]
270
+ [0 0 0 1]
271
+
272
+ Next, we show ``elm`` is not the identity by using the embedding of
273
+ the affine braid group `\widetilde{B}_n \to B_{n+1}`::
274
+
275
+ sage: # needs sage.libs.braiding
276
+ sage: B.<t1,t2,t3,t4> = BraidGroup(5)
277
+ sage: D = t1 * t2 * t3 * t4^2
278
+ sage: t0 = D * t3 * ~D
279
+ sage: t0*t1*t0 == t1*t0*t1
280
+ True
281
+ sage: t0*t2 == t2*t0
282
+ True
283
+ sage: t0*t3*t0 == t3*t0*t3
284
+ True
285
+ sage: T = [t0, t1, t2, t3]
286
+ sage: emb = B.prod(T[i-1] if i > 0 else ~T[-i-1] for i in elm.Tietze())
287
+ sage: emb.is_one()
288
+ False
289
+
290
+ Since the Burau representation does not respect the group embedding,
291
+ the corresponding `B_5` element's Burau matrix is not the identity
292
+ (Bigelow gave an example of the representation not being faithful for
293
+ `B_5`, but it is still open for `B_4`)::
294
+
295
+ sage: emb.burau_matrix() != 1 # needs sage.libs.braiding
296
+ True
297
+
298
+ We also verify the result using the elements in [BQ2024]_ Remark 4.2::
299
+
300
+ sage: ap = s3 * s1 * s2 * s1 * ~s3 * s4 * s2 * s3 * s2 * ~s3 * s1^-2 * s4
301
+ sage: bp = s1 * ~s4 * s1^2 * s3^-2 * ~s2 * s4 * s1 * ~s3 * s2 * ~s4 * s3 * s1 * s4 * s1 * ~s2 * s4^-2 * s3
302
+ sage: alpha = ap * s3 * ~ap
303
+ sage: beta = bp * s2 * ~bp
304
+ sage: elm = alpha * beta * ~alpha * ~beta # needs sage.libs.braiding
305
+ sage: elm.burau_matrix() # needs sage.libs.braiding
306
+ [1 0 0 0]
307
+ [0 1 0 0]
308
+ [0 0 1 0]
309
+ [0 0 0 1]
310
+
311
+ REFERENCES:
312
+
313
+ - [BQ2024]_
314
+ """
315
+ gens, invs = self.parent()._burau_generators
316
+ MS = gens[0].parent()
317
+ ret = MS.prod(gens[i-1] if i > 0 else invs[-i-1] for i in self.Tietze())
318
+
319
+ if var == 't':
320
+ return ret
321
+
322
+ from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
323
+ poly_ring = LaurentPolynomialRing(ret.base_ring().base_ring(), var)
324
+ return ret.change_ring(poly_ring)
165
325
 
166
326
 
167
327
  class FiniteTypeArtinGroupElement(ArtinGroupElement):
@@ -248,6 +408,7 @@ class FiniteTypeArtinGroupElement(ArtinGroupElement):
248
408
  sage: A([1,2,1,3,2,1,3,2,3,3,2,3,1,2,3,1,2,3,1,2]).left_normal_form()
249
409
  ((s3*(s2*s3*s1)^2*s2*s1)^2, s3*s2)
250
410
 
411
+ sage: # needs sage.combinat
251
412
  sage: B = BraidGroup(4)
252
413
  sage: b = B([1, 2, 3, -1, 2, -3])
253
414
  sage: b.left_normal_form() # needs sage.libs.braiding
@@ -434,7 +595,7 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
434
595
  sage: A1 is A2 and A2 is A3
435
596
  True
436
597
 
437
- sage: ArtinGroup(['A',3]) is BraidGroup(4, 's1,s2,s3') # needs sage.rings.number_field
598
+ sage: ArtinGroup(['A',3]) is BraidGroup(4, 's1,s2,s3') # needs sage.combinat sage.rings.number_field
438
599
  True
439
600
 
440
601
  sage: # needs sage.graphs sage.rings.number_field
@@ -461,13 +622,13 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
461
622
  from sage.groups.raag import RightAngledArtinGroup
462
623
  return RightAngledArtinGroup(coxeter_data.coxeter_graph(), names)
463
624
  if not coxeter_data.is_finite():
464
- raise NotImplementedError
625
+ return super().__classcall__(cls, coxeter_data, names)
465
626
  if coxeter_data.coxeter_type().cartan_type().type() == 'A':
466
627
  from sage.groups.braid import BraidGroup
467
- return BraidGroup(coxeter_data.rank()+1, names)
628
+ return BraidGroup(coxeter_data.rank() + 1, names)
468
629
  return FiniteTypeArtinGroup(coxeter_data, names)
469
630
 
470
- def __init__(self, coxeter_matrix, names):
631
+ def __init__(self, coxeter_matrix, names) -> None:
471
632
  """
472
633
  Initialize ``self``.
473
634
 
@@ -484,18 +645,20 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
484
645
  rels = []
485
646
  # Generate the relations based on the Coxeter graph
486
647
  I = coxeter_matrix.index_set()
648
+ gens = free_group.gens()
487
649
  for ii, i in enumerate(I):
488
- for j in I[ii + 1:]:
650
+ for jj, j in enumerate(I[ii + 1:], start=ii + 1):
489
651
  m = coxeter_matrix[i, j]
490
652
  if m == Infinity: # no relation
491
653
  continue
492
- elt = [i, j] * m
493
- for ind in range(m, 2*m):
494
- elt[ind] = -elt[ind]
495
- rels.append(free_group(elt))
654
+ elt = (gens[ii] * gens[jj]) ** (m // 2)
655
+ if m % 2 == 1:
656
+ elt = elt * gens[ii] * ~gens[jj]
657
+ elt = elt * (~gens[ii] * ~gens[jj]) ** (m // 2)
658
+ rels.append(elt)
496
659
  FinitelyPresentedGroup.__init__(self, free_group, tuple(rels))
497
660
 
498
- def _repr_(self):
661
+ def _repr_(self) -> str:
499
662
  """
500
663
  Return a string representation of ``self``.
501
664
 
@@ -630,7 +793,7 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
630
793
  return self.element_class(self, x)
631
794
 
632
795
  @cached_method
633
- def an_element(self):
796
+ def _an_element_(self):
634
797
  """
635
798
  Return an element of ``self``.
636
799
 
@@ -642,7 +805,7 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
642
805
  """
643
806
  return self.gen(0)
644
807
 
645
- def some_elements(self):
808
+ def some_elements(self) -> list:
646
809
  """
647
810
  Return a list of some elements of ``self``.
648
811
 
@@ -687,8 +850,8 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
687
850
 
688
851
  EXAMPLES::
689
852
 
690
- sage: A = ArtinGroup(['B',3]) # needs sage.rings.number_field
691
- sage: A._standard_lift(A.coxeter_group().long_element()) # needs sage.rings.number_field
853
+ sage: A = ArtinGroup(['B',3]) # needs sage.combinat sage.rings.number_field
854
+ sage: A._standard_lift(A.coxeter_group().long_element()) # needs sage.combinat sage.rings.number_field
692
855
  s3*(s2*s3*s1)^2*s2*s1
693
856
 
694
857
  sage: B = BraidGroup(5)
@@ -698,6 +861,154 @@ class ArtinGroup(UniqueRepresentation, FinitelyPresentedGroup):
698
861
  """
699
862
  return self(self._standard_lift_Tietze(w))
700
863
 
864
+ @lazy_attribute
865
+ def _burau_generators(self):
866
+ """
867
+ The Burau matrices for the generators of ``self`` and their inverses.
868
+
869
+ EXAMPLES::
870
+
871
+ sage: A = ArtinGroup(['G',2])
872
+ sage: A._burau_generators
873
+ [[
874
+ [-t^2 a*t] [ 1 0]
875
+ [ 0 1], [ a*t -t^2]
876
+ ],
877
+ [
878
+ [ -t^-2 a*t^-1] [ 1 0]
879
+ [ 0 1], [a*t^-1 -t^-2]
880
+ ]]
881
+
882
+ sage: A = ArtinGroup(['H',3])
883
+ sage: A._burau_generators
884
+ [[
885
+ [-t^2 t 0] [ 1 0 0]
886
+ [ 0 1 0] [ t -t^2 (1/2*a + 1/2)*t]
887
+ [ 0 0 1], [ 0 0 1],
888
+ <BLANKLINE>
889
+ [ 1 0 0]
890
+ [ 0 1 0]
891
+ [ 0 (1/2*a + 1/2)*t -t^2]
892
+ ],
893
+ [
894
+ [-t^-2 t^-1 0]
895
+ [ 0 1 0]
896
+ [ 0 0 1],
897
+ <BLANKLINE>
898
+ [ 1 0 0]
899
+ [ t^-1 -t^-2 (1/2*a + 1/2)*t^-1]
900
+ [ 0 0 1],
901
+ <BLANKLINE>
902
+ [ 1 0 0]
903
+ [ 0 1 0]
904
+ [ 0 (1/2*a + 1/2)*t^-1 -t^-2]
905
+ ]]
906
+
907
+ sage: CM = matrix([[1,4,7], [4,1,10], [7,10,1]])
908
+ sage: A = ArtinGroup(CM)
909
+ sage: gens = A._burau_generators[0]; gens
910
+ [
911
+ [ -t^2 (E(8) - E(8)^3)*t (-E(7)^3 - E(7)^4)*t]
912
+ [ 0 1 0]
913
+ [ 0 0 1],
914
+ <BLANKLINE>
915
+ [ 1 0 0]
916
+ [ (E(8) - E(8)^3)*t -t^2 (E(20) - E(20)^9)*t]
917
+ [ 0 0 1],
918
+ <BLANKLINE>
919
+ [ 1 0 0]
920
+ [ 0 1 0]
921
+ [(-E(7)^3 - E(7)^4)*t (E(20) - E(20)^9)*t -t^2]
922
+ ]
923
+ sage: all(gens[i] * A._burau_generators[1][i] == 1 for i in range(3))
924
+ True
925
+ sage: B1, B2, B3 = gens
926
+ sage: (B1 * B2)^2 == (B2 * B1)^2
927
+ True
928
+ sage: (B2 * B3)^5 == (B3 * B2)^5
929
+ True
930
+ sage: B1 * B3 * B1 * B3 * B1 * B3 * B1 == B3 * B1 * B3 * B1 * B3 * B1 * B3
931
+ True
932
+ """
933
+ data = self.coxeter_type()
934
+ coxeter_matrix = self.coxeter_matrix()
935
+ n = coxeter_matrix.rank()
936
+
937
+ # Determine the base field
938
+ if data.is_simply_laced():
939
+ from sage.rings.integer_ring import ZZ
940
+ base_ring = ZZ
941
+ elif data.is_finite():
942
+ from sage.rings.number_field.number_field import QuadraticField
943
+ letter = data.cartan_type().type()
944
+ if letter in ['B', 'C', 'F']:
945
+ base_ring = QuadraticField(2)
946
+ elif letter == 'G':
947
+ base_ring = QuadraticField(3)
948
+ elif letter == 'H':
949
+ base_ring = QuadraticField(5)
950
+ else:
951
+ from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
952
+ base_ring = UniversalCyclotomicField()
953
+ else:
954
+ from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
955
+ base_ring = UniversalCyclotomicField()
956
+
957
+ # Construct the matrices
958
+ from sage.matrix.args import SparseEntry
959
+ from sage.matrix.matrix_space import MatrixSpace
960
+ from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
961
+ import sage.rings.abc
962
+ poly_ring = LaurentPolynomialRing(base_ring, 't')
963
+ q = -poly_ring.gen()
964
+ MS = MatrixSpace(poly_ring, n, sparse=True)
965
+ one = MS.one()
966
+ # FIXME: Hack because there is no ZZ \cup \{ \infty \}: -1 represents \infty
967
+ if isinstance(base_ring, sage.rings.abc.UniversalCyclotomicField):
968
+ E = base_ring.gen
969
+
970
+ def val(x):
971
+ if x == -1:
972
+ return 2 * q
973
+ elif x == 1:
974
+ return 1 + q**2
975
+ else:
976
+ E2x = E(2 * x)
977
+ return q * (E2x + ~E2x)
978
+ elif isinstance(base_ring, sage.rings.abc.NumberField_quadratic):
979
+ from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
980
+ E = UniversalCyclotomicField().gen
981
+
982
+ def val(x):
983
+ if x == -1:
984
+ return 2 * q
985
+ elif x == 1:
986
+ return 1 + q**2
987
+ else:
988
+ return q * base_ring((E(2 * x) + ~E(2 * x)).to_cyclotomic_field())
989
+ else:
990
+ def val(x):
991
+ if x == -1:
992
+ return 2 * q
993
+ elif x == 1:
994
+ return 1 + q**2
995
+ elif x == 2:
996
+ return 0
997
+ elif x == 3:
998
+ return q
999
+ else:
1000
+ from sage.functions.trig import cos
1001
+ from sage.symbolic.constants import pi
1002
+ return q * base_ring(2 * cos(pi / x))
1003
+ index_set = data.index_set()
1004
+ gens = [one - MS([SparseEntry(i, j, val(coxeter_matrix[index_set[i], index_set[j]]))
1005
+ for j in range(n)])
1006
+ for i in range(n)]
1007
+ invs = [one - q**-2 * MS([SparseEntry(i, j, val(coxeter_matrix[index_set[i], index_set[j]]))
1008
+ for j in range(n)])
1009
+ for i in range(n)]
1010
+ return [gens, invs]
1011
+
701
1012
  Element = ArtinGroupElement
702
1013
 
703
1014
 
@@ -754,8 +1065,8 @@ class FiniteTypeArtinGroup(ArtinGroup):
754
1065
  sage: A.delta() # needs sage.rings.number_field
755
1066
  (s2*s1)^3
756
1067
 
757
- sage: B = BraidGroup(5)
758
- sage: B.delta()
1068
+ sage: B = BraidGroup(5) # needs sage.combinat
1069
+ sage: B.delta() # needs sage.combinat
759
1070
  s0*s1*s2*s3*s0*s1*s2*s0*s1*s0
760
1071
  """
761
1072
  return self._standard_lift(self._coxeter_group.long_element())