Dynkin types #
The Cartan-Killing classification says that an irreducible reduced crystallographic finite root
system is described by one of a short list of combinatorial types. This file introduces those types
as a plain enumeration TauCeti.DynkinType, equips it with a rank, a validity predicate carving out
the rank ranges in which the types are pairwise distinct and irreducible, and attaches to each type
its standard integer Cartan matrix, taken from Mathlib's CartanMatrix family and numbered by
Bourbaki's node labels, with node i at index i - 1. The predicate
TauCeti.HasCartanType then says that the Cartan matrix of a base agrees with the standard matrix
of a given type under a single simultaneous relabelling of rows and columns.
The enumeration is deliberately plain: the rank ranges A n (1 ≤ n), B n (2 ≤ n), C n (3 ≤ n),
D n (4 ≤ n) are carried by TauCeti.DynkinType.Valid rather than baked into the constructors.
Those bounds remove two different kinds of redundancy. The rank-zero types A 0, B 0, C 0,
D 0 have empty Cartan matrices, and D 2 has the reducible matrix of A₁ × A₁, so none of these
names an irreducible root system at all. The other excluded types are low-rank coincidences: B 1,
C 1 and D 1 are A 1, C 2 is B 2, and D 3 is A 3, so each of them does name an
irreducible root system, but one the list already carries under a valid name. What the bounds
secure is therefore uniqueness of the type, not the existence of a root system realizing it. Note
in particular that Valid is not preserved by exchanging B n and C n: B 2 is valid while
C 2 is not, precisely because they name the same root system.
The matching in TauCeti.HasCartanType is oriented, using one relabelling e on both indices
rather than allowing the matrix to be transposed. This is what keeps Bₙ and Cₙ apart from rank
3 on, where they are different root systems whose standard Cartan matrices are transposes of one
another (CartanMatrix.B_transpose) and an unoriented match would identify them. At rank at most
2 the orientation carries no information about these matrices: relabelling by the swap of two
indices transposes the off-diagonal entries but exchanges the diagonal ones as well, and every
diagonal entry of a standard Cartan matrix is 2, so here transposition is itself a simultaneous
relabelling. Hence B 2 and C 2 match exactly the same bases, in keeping with their naming the
same root system; Valid keeps only B 2 of those two names.
Main definitions #
TauCeti.DynkinType: the enumerationA n,B n,C n,D n,E6,E7,E8,F4,G2.TauCeti.DynkinType.rank: the number of simple roots of a type.TauCeti.DynkinType.Valid: the rank ranges on which the types are the classification list.TauCeti.DynkinType.IsSimplyLaced: the typesA,D,Ewith only single edges.TauCeti.DynkinType.cartanMatrix: the standard integer Cartan matrix of a type.TauCeti.HasCartanType: a base whose Cartan matrix reindexes to a standard one.
Main results #
TauCeti.DynkinType.cartanMatrix_apply_sameandTauCeti.DynkinType.cartanMatrix_apply_le_zero_of_ne: the standard matrices have diagonal2and nonpositive off-diagonal entries.TauCeti.DynkinType.cartanMatrix_apply_eq_zero_iff_symm: their zero pattern is symmetric, so each is a generalized Cartan matrix.TauCeti.DynkinType.cartanMatrix_C_two_apply_eq_cartanMatrix_B_two: the matrices ofB 2andC 2are exchanged by the swap of the two Bourbaki nodes.TauCeti.DynkinType.isSimplyLaced_cartanMatrix_iff: the standard Cartan matrix of a type is simply laced exactly when the type is or has rank at most one; rank at most one also holds ofA 0,A 1,D 0andD 1, but the types the second alternative adds to the first are precisely the degenerateB 0,B 1,C 0andC 1, whose matrices have no off-diagonal entries to constrain.TauCeti.DynkinType.isSimplyLaced_cartanMatrix_iff_of_valid: among valid types the simply-laced Cartan matrices are therefore exactly those of typesA,DandE.TauCeti.HasCartanType.isSimplyLaced_iffandTauCeti.HasCartanType.isSimplyLaced_iff_of_valid: both statements transferred to a base of Cartan typet.TauCeti.HasCartanType.exists_supportEquiv_cartanMatrix_eq: two bases of the same Cartan type are related by a relabelling of their supports that matches their Cartan matrices.
References #
This file implements the DynkinType enumeration of Layer 5 of
TauCetiRoadmap/RepresentationTheory/RootSystems/README.md, following the target signatures in
TauCetiRoadmap/RepresentationTheory/RootSystems/Suggested.lean. See Bourbaki, Lie Groups and Lie
Algebras, Chapters 4-6, plates I-IX, and Humphreys, Introduction to Lie Algebras and
Representation Theory, Chapter 11, for the standard Cartan matrices.
The Dynkin types: the four classical families Aₙ, Bₙ, Cₙ, Dₙ, whose constructors accept
every natural number, together with the five exceptional types. The rank ranges on which these are
the types occurring in the Cartan-Killing classification are carried by
TauCeti.DynkinType.Valid, not by the constructors.
- A
(n : ℕ)
: DynkinType
Type
Aₙ, the type ofslₙ₊₁. - B
(n : ℕ)
: DynkinType
Type
Bₙ, the type ofso₂ₙ₊₁. - C
(n : ℕ)
: DynkinType
Type
Cₙ, the type ofsp₂ₙ. - D
(n : ℕ)
: DynkinType
Type
Dₙ, the type ofso₂ₙ. - E6 : DynkinType
The exceptional type
E₆. - E7 : DynkinType
The exceptional type
E₇. - E8 : DynkinType
The exceptional type
E₈. - F4 : DynkinType
The exceptional type
F₄. - G2 : DynkinType
The exceptional type
G₂.
Instances For
Equations
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A a) (TauCeti.DynkinType.A b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) (TauCeti.DynkinType.B n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) (TauCeti.DynkinType.C n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) (TauCeti.DynkinType.D n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) TauCeti.DynkinType.E6 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) TauCeti.DynkinType.E7 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) TauCeti.DynkinType.E8 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) TauCeti.DynkinType.F4 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.A n) TauCeti.DynkinType.G2 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) (TauCeti.DynkinType.A n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B a) (TauCeti.DynkinType.B b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) (TauCeti.DynkinType.C n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) (TauCeti.DynkinType.D n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) TauCeti.DynkinType.E6 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) TauCeti.DynkinType.E7 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) TauCeti.DynkinType.E8 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) TauCeti.DynkinType.F4 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.B n) TauCeti.DynkinType.G2 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) (TauCeti.DynkinType.A n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) (TauCeti.DynkinType.B n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C a) (TauCeti.DynkinType.C b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) (TauCeti.DynkinType.D n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) TauCeti.DynkinType.E6 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) TauCeti.DynkinType.E7 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) TauCeti.DynkinType.E8 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) TauCeti.DynkinType.F4 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.C n) TauCeti.DynkinType.G2 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) (TauCeti.DynkinType.A n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) (TauCeti.DynkinType.B n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) (TauCeti.DynkinType.C n_1) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D a) (TauCeti.DynkinType.D b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) TauCeti.DynkinType.E6 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) TauCeti.DynkinType.E7 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) TauCeti.DynkinType.E8 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) TauCeti.DynkinType.F4 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq (TauCeti.DynkinType.D n) TauCeti.DynkinType.G2 = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 (TauCeti.DynkinType.A n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 (TauCeti.DynkinType.B n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 (TauCeti.DynkinType.C n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 (TauCeti.DynkinType.D n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 TauCeti.DynkinType.E6 = isTrue ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 TauCeti.DynkinType.E7 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_45✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 TauCeti.DynkinType.E8 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_46✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 TauCeti.DynkinType.F4 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_47✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E6 TauCeti.DynkinType.G2 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_48✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 (TauCeti.DynkinType.A n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 (TauCeti.DynkinType.B n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 (TauCeti.DynkinType.C n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 (TauCeti.DynkinType.D n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 TauCeti.DynkinType.E6 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_53✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 TauCeti.DynkinType.E7 = isTrue ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 TauCeti.DynkinType.E8 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_54✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 TauCeti.DynkinType.F4 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_55✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E7 TauCeti.DynkinType.G2 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_56✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 (TauCeti.DynkinType.A n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 (TauCeti.DynkinType.B n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 (TauCeti.DynkinType.C n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 (TauCeti.DynkinType.D n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 TauCeti.DynkinType.E6 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_61✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 TauCeti.DynkinType.E7 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_62✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 TauCeti.DynkinType.E8 = isTrue ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 TauCeti.DynkinType.F4 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_63✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.E8 TauCeti.DynkinType.G2 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_64✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 (TauCeti.DynkinType.A n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 (TauCeti.DynkinType.B n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 (TauCeti.DynkinType.C n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 (TauCeti.DynkinType.D n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 TauCeti.DynkinType.E6 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_69✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 TauCeti.DynkinType.E7 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_70✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 TauCeti.DynkinType.E8 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_71✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 TauCeti.DynkinType.F4 = isTrue ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.F4 TauCeti.DynkinType.G2 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_72✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 (TauCeti.DynkinType.A n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 (TauCeti.DynkinType.B n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 (TauCeti.DynkinType.C n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 (TauCeti.DynkinType.D n) = isFalse ⋯
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 TauCeti.DynkinType.E6 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_77✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 TauCeti.DynkinType.E7 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_78✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 TauCeti.DynkinType.E8 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_79✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 TauCeti.DynkinType.F4 = isFalse TauCeti.instDecidableEqDynkinType.decEq._proof_80✝
- TauCeti.instDecidableEqDynkinType.decEq TauCeti.DynkinType.G2 TauCeti.DynkinType.G2 = isTrue ⋯
Instances For
The rank of a Dynkin type: the number of simple roots, equivalently the size of its Cartan
matrix. This is exposed because it appears in the type of TauCeti.DynkinType.cartanMatrix, so
even the statement (A n).cartanMatrix = CartanMatrix.A n needs Fin (A n).rank to reduce to
Fin n.
Equations
Instances For
The rank ranges on which the Dynkin types are pairwise distinct and irreducible. Outside them
the standard Cartan matrices are degenerate or coincide: B 1 = C 1 = A 1, C 2 is B 2
transposed, D 2 is A 1 × A 1 and D 3 is A 3 relabelled.
Equations
- (TauCeti.DynkinType.A n).Valid = (1 ≤ n)
- (TauCeti.DynkinType.B n).Valid = (2 ≤ n)
- (TauCeti.DynkinType.C n).Valid = (3 ≤ n)
- (TauCeti.DynkinType.D n).Valid = (4 ≤ n)
- TauCeti.DynkinType.E6.Valid = True
- TauCeti.DynkinType.E7.Valid = True
- TauCeti.DynkinType.E8.Valid = True
- TauCeti.DynkinType.F4.Valid = True
- TauCeti.DynkinType.G2.Valid = True
Instances For
Equations
- (TauCeti.DynkinType.A n).instDecidablePredValid = TauCeti.DynkinType.instDecidablePredValid._aux_1 n
- (TauCeti.DynkinType.B n).instDecidablePredValid = TauCeti.DynkinType.instDecidablePredValid._aux_3 n
- (TauCeti.DynkinType.C n).instDecidablePredValid = TauCeti.DynkinType.instDecidablePredValid._aux_5 n
- (TauCeti.DynkinType.D n).instDecidablePredValid = TauCeti.DynkinType.instDecidablePredValid._aux_7 n
- TauCeti.DynkinType.E6.instDecidablePredValid = isTrue TauCeti.DynkinType.instDecidablePredValid._proof_9
- TauCeti.DynkinType.E7.instDecidablePredValid = isTrue TauCeti.DynkinType.instDecidablePredValid._proof_10
- TauCeti.DynkinType.E8.instDecidablePredValid = isTrue TauCeti.DynkinType.instDecidablePredValid._proof_11
- TauCeti.DynkinType.F4.instDecidablePredValid = isTrue TauCeti.DynkinType.instDecidablePredValid._proof_12
- TauCeti.DynkinType.G2.instDecidablePredValid = isTrue TauCeti.DynkinType.instDecidablePredValid._proof_13
A valid Dynkin type has at least one simple root.
The simply-laced Dynkin types are those all of whose edges are single, namely A, D and the
exceptional E types; equivalently (isSimplyLaced_cartanMatrix_iff_of_valid) those valid types
whose standard Cartan matrix has all off-diagonal entries 0 or -1.
Equations
- (TauCeti.DynkinType.A n).IsSimplyLaced = True
- (TauCeti.DynkinType.D n).IsSimplyLaced = True
- TauCeti.DynkinType.E6.IsSimplyLaced = True
- TauCeti.DynkinType.E7.IsSimplyLaced = True
- TauCeti.DynkinType.E8.IsSimplyLaced = True
- (TauCeti.DynkinType.B n).IsSimplyLaced = False
- (TauCeti.DynkinType.C n).IsSimplyLaced = False
- TauCeti.DynkinType.F4.IsSimplyLaced = False
- TauCeti.DynkinType.G2.IsSimplyLaced = False
Instances For
Equations
- (TauCeti.DynkinType.A n).instDecidablePredIsSimplyLaced = isTrue ⋯
- (TauCeti.DynkinType.D n).instDecidablePredIsSimplyLaced = isTrue ⋯
- TauCeti.DynkinType.E6.instDecidablePredIsSimplyLaced = isTrue TauCeti.DynkinType.instDecidablePredIsSimplyLaced._proof_3
- TauCeti.DynkinType.E7.instDecidablePredIsSimplyLaced = isTrue TauCeti.DynkinType.instDecidablePredIsSimplyLaced._proof_4
- TauCeti.DynkinType.E8.instDecidablePredIsSimplyLaced = isTrue TauCeti.DynkinType.instDecidablePredIsSimplyLaced._proof_5
- (TauCeti.DynkinType.B n).instDecidablePredIsSimplyLaced = isFalse ⋯
- (TauCeti.DynkinType.C n).instDecidablePredIsSimplyLaced = isFalse ⋯
- TauCeti.DynkinType.F4.instDecidablePredIsSimplyLaced = isFalse TauCeti.DynkinType.instDecidablePredIsSimplyLaced._proof_8
- TauCeti.DynkinType.G2.instDecidablePredIsSimplyLaced = isFalse TauCeti.DynkinType.instDecidablePredIsSimplyLaced._proof_9
The standard integer Cartan matrix of a Dynkin type, indexed by Fin t.rank in the Bourbaki
node numbering, so that cartanMatrix t i j = ⟨αᵢ, αⱼ^∨⟩ for Bourbaki node i + 1 at index i.
The classical families and the exceptional matrices are Mathlib's CartanMatrix.A, .B, .C,
.D, .E₆, .E₇, .E₈ and .F₄, whose conventions agree with Bourbaki's plates.
Type G₂ is the one place where they do not. Mathlib's CartanMatrix.G₂ is documented as the
transpose of Bourbaki's plate IX matrix, so the Bourbaki numbering — node 1 short, node 2 long,
giving !![2, -1; -3, 2] — is CartanMatrix.G₂ᵀ. The transpose of a Cartan matrix is again one,
of the same diagram with the arrow reversed, and here it is the Bourbaki-numbered representative
that this enumeration pins.
Equations
- (TauCeti.DynkinType.A n).cartanMatrix = CartanMatrix.A n
- (TauCeti.DynkinType.B n).cartanMatrix = CartanMatrix.B n
- (TauCeti.DynkinType.C n).cartanMatrix = CartanMatrix.C n
- (TauCeti.DynkinType.D n).cartanMatrix = CartanMatrix.D n
- TauCeti.DynkinType.E6.cartanMatrix = CartanMatrix.E 6
- TauCeti.DynkinType.E7.cartanMatrix = CartanMatrix.E 7
- TauCeti.DynkinType.E8.cartanMatrix = CartanMatrix.E 8
- TauCeti.DynkinType.F4.cartanMatrix = CartanMatrix.F₄
- TauCeti.DynkinType.G2.cartanMatrix = CartanMatrix.G₂.transpose
Instances For
The two rank-two standard Cartan matrices differ only by the node numbering: exchanging
Bourbaki nodes 1 and 2 carries the matrix of B 2 to the matrix of C 2. This is the
low-rank coincidence that TauCeti.DynkinType.Valid records by keeping only the name B 2 of the
two. From rank three on there is no such relabelling, Bₙ and Cₙ being different root systems
whose matrices are transposes; at rank two transposition is itself a relabelling because both
diagonal entries are 2.
Every diagonal entry of a standard Cartan matrix is 2.
Every off-diagonal entry of a standard Cartan matrix is nonpositive.
The zero pattern of a standard Cartan matrix is symmetric: two simple roots are orthogonal in
one order exactly when they are in the other. With cartanMatrix_apply_same and
cartanMatrix_apply_le_zero_of_ne this says each standard matrix is a generalized Cartan matrix.
This is the DynkinType analogue of RootPairing.Base.cartanMatrix_apply_eq_zero_iff_symm.
A standard Cartan matrix is simply laced exactly when its type is, or the type has rank at
most one. The second alternative is not redundant. Rank at most one holds for A 0, A 1, D 0
and D 1 as well, but those types are simply laced anyway, so the types it adds to the first
alternative are precisely B 0, B 1, C 0 and C 1, whose matrices have no off-diagonal entries
at all and so are vacuously simply laced even though the types are not. Excluding those four is all
that isSimplyLaced_cartanMatrix_iff_of_valid needs.
Among valid Dynkin types the simply-laced Cartan matrices are exactly those of types A, D
and E. Validity is what rules out B 1 = A 1, whose matrix is simply laced.
A standard Cartan matrix that is simply laced is symmetric: its off-diagonal entries are 0
or -1, and by cartanMatrix_apply_eq_zero_iff_symm which of the two an entry is depends only on
the unordered pair of indices. By isSimplyLaced_cartanMatrix_iff the hypothesis holds for every
simply-laced type, and for the degenerate B 0, B 1, C 0, C 1 besides.
A base of a crystallographic root pairing has Cartan type t when its Cartan matrix agrees
with the standard Cartan matrix of t after a single simultaneous relabelling of rows and columns.
Matching without transposing is deliberate: from rank 3 on, Bₙ and Cₙ are different root
systems with transposed Cartan matrices (CartanMatrix.B_transpose), so an unoriented match would
identify them. It does not separate B 2 from C 2, which are the same root system;
TauCeti.DynkinType.Valid excludes C 2.
Equations
- TauCeti.HasCartanType P b t = ∃ (e : ↥b.support ≃ Fin t.rank), ∀ (i j : ↥b.support), b.cartanMatrix i j = t.cartanMatrix (e i) (e j)
Instances For
Having Cartan type t, unfolded to the relabelling it asserts to exist. The body of
TauCeti.HasCartanType is deliberately not exposed, so this is the interface through which
consumers in other modules build and destructure it.
Two bases of the same Cartan type are related by a relabelling matching their Cartan
matrices. Each of the two bases comes with a labelling of its support by the nodes of t, and
composing one with the inverse of the other identifies the supports; the two Cartan matrices then
agree because each agrees with the standard matrix of t.
This is the hypothesis of Mathlib's RootPairing.Base.equivOfCartanMatrixEq, and is pure
bookkeeping about the labellings: it needs neither finiteness nor reducedness of the two root
pairings, with the root-system content left to that theorem.
Having Cartan type t, expressed as a reindexing of matrices rather than entrywise.
The rank of the Cartan type of a base is its number of simple roots.
A base of Cartan type t is simply laced exactly when t is, or t has rank at most one.
The second alternative adds only the degenerate types B 0, B 1, C 0 and C 1: the remaining
types of rank at most one, namely A 0, A 1, D 0 and D 1, are simply laced already.
A base of valid Cartan type t is simply laced exactly when t is, that is, exactly when
t is one of A, D, E₆, E₇, E₈.