Refactor Coxeter groups as matrix groups and non crystallographic root systems
Reported by: 
Nicolas M. Thiéry 
Owned by: 

Priority:

major

Milestone:

sage6.4

Component:

combinatorics

Keywords:

coxeter groups, days57

Cc:

Sage Combinat CC user, Travis Scrimshaw, JeanPhilippe Labbé, Vivien Ripoll, Tomer Bauer

Merged in:


Authors:

JeanPhilippe Labbé, Vivien Ripoll

Reviewers:

Nicolas M. Thiéry

Report Upstream:

N/A

Work issues:


Branch:

u/jipilab/refactor_coxeter_groups_as_matrix_groups_and_non_crystallographic_root_systems
(Commits, GitHub, GitLab) 
Commit:

09a1ff9ae3fe50ab4b1d4c31f0afe682ed5173e1

Dependencies:

#16120, #16126, #16130, #17798, #18152

Stopgaps:


This is a follow up to #9290.
 Experiment with the infrastructure scales and benchmark
 CoxeterGraph, see #16126
 Create a class similar to DynkinDiagram
Starter: an edgelabeled graph.
 Edge labels: m_{i,j}, possibly with number <1 for oo
 method dynkin_diagram() which builds the cartan matrix for the geometric representation
Starter: just make this a function
 Update DynkinDiagram to support non crystallographic case:
 Add an argument base_ring to the constructor
 Add a method base_ring
 Make add_edge honor this method when automatically adding edges
 Update cartan_matrix() to use the base_ring
 Add a method _test_base_ring that checks that all edge labels are
indeed in this base ring
 Implement is_crystallographic testing if the base ring is ZZ
 Add an argument symmetric=False to the constructor, and make
add_edge and symmetrizer use it.
 Add a method _test_dynkin_diagram that tests that the Dynkin
diagram indeed defines a proper root system. See in particular
cartan_matrix.is_generalized_cartan_matrix.
 adapt column() and row() method to give the labels in the base ring
 Update CartanMatrix, see #17798
 Add a base ring argument to the constructor
 Update is_crystallographic
 Update is_affine
 Update is_finite
 Update is_generalized_cartan_matrix
 CartanType
 Possibly update to accept appropriate data to build a CoxeterGraph (e.g. a matrix)
 Add a base_ring method?
 Decide on the semantic of is_crystallographic (symmetrizable or
not?), and if possibly add an is_... method to decide whether the
entries are integral or not.
 Provide a dynkin_diagram method that builds the Dynkin diagram
from the Coxeter diagram when available
 Test: H_3 and friends should have a working dynkin_diagram method
 RootSystem
 Decide on the meaning of root_lattice: either disable it in the
non integral case, or have it be the span of the roots over the
smallest available ring.
 RootLatticeRealizations:
 Feed this to RootSystem, and check that the root space and weight
space are built properly.
 Rename the weyl_group method to reflection_group, with an alias
from weyl_group; update the setting of the category.
 Define a new projection "transversal" to visualise root systems (and find a right name for it)
 Long run: stuff specific to the crystallographic case, starting
with this weyl_group method, should go in
RootLatticeRealizations.Crystallographic. That's for a follow up
ticket on using axioms for root systems; but let's not depend on
#10963 right now.
 RootSpace (for this ticket or some follow up):
 Define the inner product
 adapt the is_positive_root to make it work for any base ring
 Signature of the bilinear form
 CoxeterMatrixGroup and WeylGroup:
 Refactor WeylGroup to make it a subclass of CoxeterMatrixGroup,
and lift as many features as possible from WeylGroup to
CoxeterMatrixGroup.
 Check that, with a proper Dynkin diagram, the conversion to GAP
issue does not appear
 Now or later: we probably want the Weyl group elements to be
represented by Sage matrices, but keep a handle to the
corresponding Gap group. Currently one has to make a choice
between !MatrixGroup_generic and !MatrixGroup_gap.
 Plotting:
 add a family_of_points method in the projections to be used by the "transversal projection"
 Update WeylGroups:
 inversions: use the "root_lattice" by default?
Tests:
sage: C = CoxeterDiagram(...) # good name? or CartanDatum(coxeter_matrix=...) [1] ? or?
sage: L = RootSystem(C).root_space()
sage: W = L.reflection_group()
sage: W = CoxeterGroup(['H',3])
sage: W.domain()
Sage Days 57 in Cernay will be a good occasion to work on this.
Follow ups: #16087
[1]: Generally speaking, it's planned to rename CartanType to CartanDatum.
I believe I'm taking care of the inner product on the root space in #15384 (which I called
symmetric_form()
). Also for a followup ticket, we should implement/refactor things for symmetrizable and the nonsymmetrizable types (for when we get the hyperbolic types done).