Auslander-Reiten Quivers#
- class sage.quivers.ar_quiver.AuslanderReitenQuiver(quiver)#
Bases:
UniqueRepresentation
,Parent
The Auslander-Reiten quiver.
Let \(Q = (Q_0, Q_1)\) be a finite acyclic quiver. The Auslander-Reiten quiver (AR quiver) \(\Gamma_Q\) is the quiver whose vertices correspond to the indecompositible modules of \(Q\) (equivalently its path algebra over an algebraically closed field) and edges are irreducible morphisms.
In this implementation, we denote the vertices of \(\Gamma_Q\) as certain pairs \(\langle v, k \rangle\), where \(v \in Q_0\) and \(k \in \ZZ \setminus \{0\}\) is called the level. When \(k > 0\) (resp. \(k < 0\)), then it corresponds to a preprojective (resp. postinjective) module. When the quiver is a finite type Dynkin quiver, we consider all modules to be preprojectives and denoted by a positive level.
Note
We use the terminology postinjective instead of preinjective given that they follow from injectives by AR translation.
ALGORITHM:
We compute the dimension vectors of a projective \(\langle v, 1 \rangle\) by counting the number of (directed) paths \(u \to v\) in \(Q\). We then proceed inductively to compute all of the dimension vectors of level \(k\) by using the translation equation
\[dim \langle v, k-1 \rangle + \dim \langle v, k \rangle = \sum_{u,k'} \dim \langle u, k' \rangle,\]where the sum is over all paths from \(\langle v, k-1 \rangle\) to \(\langle v, k \rangle\) in \(\Gamma_Q\). More specifically, for each edge \((u, v, \ell) \in Q_1\) (resp. \((v, u, \ell) \in Q_1\)), we have \(\langle u, k-1 \rangle\) (resp. \(\langle u, k \rangle\)) in the sum (assuming the node is in the AR quiver).
The algorithm for postinjectives is dual to the above.
Todo
This only is implemented for the preprojectives and postinjectives when the quiver is not a finite type Dynkin quiver.
Todo
Implement this for general Artinian algebras.
EXAMPLES:
We create the AR quivers for finite type \(A_3\) Dynkin quivers:
sage: DA = DiGraph([[1, 2], [2, 3]]) sage: AR = DA.auslander_reiten_quiver() sage: AR.digraph().edges(labels=False) [(<1, 1>, <2, 2>), (<2, 1>, <1, 1>), (<2, 1>, <3, 2>), (<3, 1>, <2, 1>), (<2, 2>, <3, 3>), (<3, 2>, <2, 2>)] sage: DA = DiGraph([[1, 2], [3, 2]]) sage: AR = DA.auslander_reiten_quiver() sage: AR.digraph().edges(labels=False) [(<1, 1>, <2, 2>), (<2, 1>, <1, 1>), (<2, 1>, <3, 1>), (<3, 1>, <2, 2>), (<2, 2>, <1, 2>), (<2, 2>, <3, 2>)] sage: DA = DiGraph([[2, 1], [2, 3]]) sage: AR = DA.auslander_reiten_quiver() sage: AR.digraph().edges(labels=False) [(<1, 1>, <2, 1>), (<2, 1>, <1, 2>), (<2, 1>, <3, 2>), (<3, 1>, <2, 1>), (<1, 2>, <2, 2>), (<3, 2>, <2, 2>)] sage: DA = DiGraph([[2, 1], [3, 2]]) sage: AR = DA.auslander_reiten_quiver() sage: AR.digraph().edges(labels=False) [(<1, 1>, <2, 1>), (<2, 1>, <3, 1>), (<2, 1>, <1, 2>), (<3, 1>, <2, 2>), (<1, 2>, <2, 2>), (<2, 2>, <1, 3>)]
An example for the type \(D_5\) Dynkin quiver:
sage: DD = DiGraph([[5,3], [4,3], [3,2], [2,1]]) sage: AR = DD.auslander_reiten_quiver() sage: AR Auslander-Reiten quiver of a ['D', 5] Dynkin quiver sage: len(list(DD)) 5
An \(E_8\) Dynkin quiver:
sage: DE = DiGraph([[8,7], [7,6], [5,6], [5,3], [3,4], [3,2], [2,1]]) sage: AR = DE.auslander_reiten_quiver() sage: AR Auslander-Reiten quiver of a ['E', 8] Dynkin quiver sage: len(list(AR)) 120 sage: len(list(RootSystem(['E', 8]).root_lattice().positive_roots())) 120
The Kronecker quiver:
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: for i in range(1, 5): ....: for v in D.vertices(): ....: pp = AR(v, i) ....: pi = AR(v, -i) ....: print(pp, pp.dimension_vector(), " ", pi, pi.dimension_vector()) <1, 1> v1 + 2*v2 <1, -1> v1 <2, 1> v2 <2, -1> 2*v1 + v2 <1, 2> 3*v1 + 4*v2 <1, -2> 3*v1 + 2*v2 <2, 2> 2*v1 + 3*v2 <2, -2> 4*v1 + 3*v2 <1, 3> 5*v1 + 6*v2 <1, -3> 5*v1 + 4*v2 <2, 3> 4*v1 + 5*v2 <2, -3> 6*v1 + 5*v2 <1, 4> 7*v1 + 8*v2 <1, -4> 7*v1 + 6*v2 <2, 4> 6*v1 + 7*v2 <2, -4> 8*v1 + 7*v2
- class Element(parent, vertex, level)#
Bases:
Element
A node in the AR quiver.
- dimension_vector()#
Return the dimension vector of
self
.EXAMPLES:
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: node = AR(2, -4) sage: node.dimension_vector() 8*v1 + 7*v2
- inverse_translation()#
Return the inverse AR translation of
self
.EXAMPLES:
sage: DA = DiGraph([[2,3], [2,1]]) sage: AR = DA.auslander_reiten_quiver() sage: node = AR(1, 1) sage: node.inverse_translation() <1, 2> sage: node = AR(1, 2) sage: node.inverse_translation() is None True sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: AR(2, -1).inverse_translation() is None True
- level()#
Return the level of
self
.EXAMPLES:
sage: DA = DiGraph([[2,3], [2,1]]) sage: AR = DA.auslander_reiten_quiver() sage: node = AR(1, 2) sage: node.level() 2
- translation()#
Return the AR translation of
self
.EXAMPLES:
sage: DA = DiGraph([[4,3], [3,2], [2,1]]) sage: AR = DA.auslander_reiten_quiver() sage: node = AR(1, 1) sage: node.translation() is None True sage: node = AR(1, 2) sage: node.translation() <1, 1>
- vertex()#
Return the vertex of the quiver corresponding to
self
.EXAMPLES:
sage: DA = DiGraph([[2,3], [2,1]]) sage: AR = DA.auslander_reiten_quiver() sage: node = AR(1, 2) sage: node.vertex() 1
- digraph(with_translations=False)#
Return the diagraph of
self
.INPUT:
with_translations
– (default:False
) ifTrue
, then include the arrows corresponding to the translations.
EXAMPLES:
sage: DA = DiGraph([[1,2]]) sage: AR = DA.auslander_reiten_quiver() sage: G = AR.digraph(); G Digraph on 3 vertices sage: G.edges() [(<1, 1>, <2, 2>, None), (<2, 1>, <1, 1>, None)] sage: GT = AR.digraph(with_translations=True) sage: GT.edges() [(<1, 1>, <2, 2>, None), (<2, 1>, <1, 1>, None), (<2, 2>, <2, 1>, 'ART')]
- digraph_postinjectives(max_depth, with_translations=False)#
Return the diagraph of postinjectives of
self
up tomax_depth
.EXAMPLES:
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: G = AR.digraph_postinjectives(3) sage: [node.dimension_vector() for node in G] [5*v1 + 4*v2, 6*v1 + 5*v2, 3*v1 + 2*v2, 4*v1 + 3*v2, v1, 2*v1 + v2] sage: AR.digraph_postinjectives(0) Digraph on 0 vertices
- digraph_preprojectives(max_depth, with_translations=False)#
Return the diagraph of preprojectives of
self
up tomax_depth
.EXAMPLES:
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: G = AR.digraph_preprojectives(3) sage: [node.dimension_vector() for node in G] [v1 + 2*v2, v2, 3*v1 + 4*v2, 2*v1 + 3*v2, 5*v1 + 6*v2, 4*v1 + 5*v2] sage: AR.digraph_preprojectives(0) Digraph on 0 vertices
- dimension_vectors_of_level(k)#
Return a
Family
of dimension vectors of levelk
.EXAMPLES:
sage: DA = DiGraph([[4,3], [2,3], [2,1]]) sage: AR = DA.auslander_reiten_quiver() sage: AR.dimension_vectors_of_level(1) {1: v1, 2: v1 + v2 + v3, 3: v3, 4: v3 + v4} sage: AR.dimension_vectors_of_level(3) {1: v4, 3: v2} sage: AR.dimension_vectors_of_level(10) {} sage: AR.dimension_vectors_of_level(-1) {1: v1 + v2, 2: v2, 3: v2 + v3 + v4, 4: v4} sage: AR.dimension_vectors_of_level(-2) {1: v3 + v4, 2: v1 + v2 + v3 + v4, 3: v1 + v2 + v3, 4: v2 + v3} sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: AR.dimension_vectors_of_level(1) {1: v1 + 2*v2, 2: v2} sage: AR.dimension_vectors_of_level(3) {1: 5*v1 + 6*v2, 2: 4*v1 + 5*v2} sage: AR.dimension_vectors_of_level(-1) {1: v1, 2: 2*v1 + v2} sage: AR.dimension_vectors_of_level(-3) {1: 5*v1 + 4*v2, 2: 6*v1 + 5*v2}
- injectives()#
Return the injectives of
self
.EXAMPLES:
sage: DE = DiGraph([[7,6], [6,5], [5,3], [4,3], [2,3], [1,2]]) sage: AR = DE.auslander_reiten_quiver() sage: AR.injectives() Finite family {1: <1, 9>, 2: <2, 9>, 3: <3, 9>, 4: <4, 9>, 5: <5, 9>, 6: <6, 9>, 7: <7, 9>}
- options = Current options for AuslanderReitenQuiver - latex: node#
- projectives()#
Return the projectives of
self
.EXAMPLES:
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: AR = D.auslander_reiten_quiver() sage: AR.projectives() Finite family {1: <1, 1>, 2: <2, 1>}
- quiver()#
Return the quiver defining
self
.EXAMPLES:
sage: DE = DiGraph([[7,8], [7,6], [5,6], [3,5], [4,3], [2,3], [1,2]]) sage: AR = DE.auslander_reiten_quiver() sage: AR.quiver() == DE True
- simples()#
Return the simples of
self
.EXAMPLES:
sage: DE = DiGraph([[7,8], [7,6], [5,6], [3,5], [4,3], [2,3], [1,2]]) sage: AR = DE.auslander_reiten_quiver() sage: AR.simples() Finite family {1: <1, 15>, 2: <1, 14>, 3: <8, 4>, 4: <4, 15>, 5: <8, 3>, 6: <6, 1>, 7: <7, 15>, 8: <8, 1>}
- sage.quivers.ar_quiver.detect_dynkin_quiver(quiver)#
Determine if
quiver
is a finite type Dynkin quiver.EXAMPLES:
sage: from sage.quivers.ar_quiver import detect_dynkin_quiver sage: D = DiGraph([[1,2], [2,3], [3, 4], [4,0], ['a','b'], ['b','c'], ['c','d'], ['c','e']]) sage: detect_dynkin_quiver(D) D5xA5 sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True) sage: detect_dynkin_quiver(D) is None True sage: D = DiGraph([[1, 2], [2, 3], [1, 3]]) sage: detect_dynkin_quiver(D) is None True sage: D = DiGraph([[1,2], [1,3], [1,4], [1,5]]) sage: detect_dynkin_quiver(D) is None True sage: D = DiGraph([[1,2], [2,3], [2,4], [4,5], [6,4]]) sage: detect_dynkin_quiver(D) is None True sage: D = DiGraph([[1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [7,8], [8,9], [0,3]]) sage: detect_dynkin_quiver(D) is None True sage: D = DiGraph([[1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [0,4]]) sage: detect_dynkin_quiver(D) is None True