Use case: modular representation theory of semigroups

Nicolas M. Thiéry
LRI, Université Paris Sud

Run this live on binder:


Balthazar is starting a PhD in modular representation theory of semigroups

Mathematical context

  • Representation theory of groups: a grand old topic; 10k+ papers in a century
  • Representation theory of the symmetric group $\mathfrak{S}_n$: beautiful combinatorics
  • Modular representation theory of groups: 1k+ papers in the last 50 years
  • Representation theory of semigroups: dozens of papers in the last decades
  • Motto of semigroup theory: reduce to combinatorics + group theory


  • Implement a algorithm of 2010 in full generality
    Computing the Cartan Matrix of a semigroup
  • Adapt this algorithm to the modular</modular> case
  • Explore the representation theory of the transformation semigroup $T_n$
    beautiful combinatorics?


  • Program and explore
  • Take advantage of all the existing computational tools

Balthazar's Virtual Research Environment

Built from many tools in our toolkit :

In [1]:
import sage_annotations
from mygap import mygap

import sage_semigroups
import sage_combinat_widgets

from   sage_explorer import explore
from sage_explorer.sage_explorer import Settings
Settings.add_property('cardinality', predicate=Groups().Finite().__contains__)
Settings.add_property('conjugacy_classes', predicate=Groups().Finite().__contains__)
Settings.add_property('multiplication_table', predicate=Groups().Finite().__contains__)

%display unicode_art
tensor.symbol = " ⊗ "
%run style/

Semigroup theory</a>

In [ ]:
T5 = mygap.FullTransformationSemigroup(5)
In [ ]:
T3 = mygap.FullTransformationSemigroup(3)
graph = T3.cayley_graph()
In [ ]:
from francy_widget import FrancyWidget
from networkx import DiGraph
g = DiGraph()
g.add_edges_from([(e[0], e[1]) for e in graph.edges()])
In [ ]:
In [ ]:
d_classes = T5.d_classes()
for d_class in d_classes:
In [ ]:
G = d_classes[1].schutzenberger_group()

Modular representation of groups

In [ ]:
reps = G.irreducible_representations(GF(3))
for rho in reps:
    display([matrix(rho(g).gap()) for g in G.group_generators()])
In [ ]:
all( [ rho(g)*rho(h) == rho(g*h) for g in G for h in G ] )

Why is that impressive?

Diving behind the scene

  • Sage uses GAP for groups
  • GAP uses MeatAxe (C library)
    parallelism of MeatAxe64
  • Sage uses GAP's Semigroup packages for semigroups
    J. Mitchell et al.
  • Semigroups uses libsemigroups (C++ library)
    J. Mitchell, inspired by Semigroupe of J.-E. Pin
  • libsemigroups uses HPC Combi
    F. Hivert , with feedback from J. Mitchell

Low level interface to GAP: libgap

One of ODK case studies for interfacing with other systems

  • libgap used to be a fragile hard to maintain fork of GAP
    Volker Braun

  • libgap is now a standard feature of GAP
    M. Horn, A. Konovalov , M. Pfeiffer , J. Demeyer , E. M. Bray , N. Thiéry , D. Pasechnik
    GAP-Sage Days 2016, 2017, 2018

  • Made possible by GAP's build system refactoring
    M. Horn, A. Konovalov , ...

  • A major step for sustainable packaging of GAP and Sage


One of ODK case study for extracting independent low-level libraries C++

  • libsemigroups API design:
    J. Mitchell with F. Hivert and N. Thiéry: Cernay 2017, 2018

  • libsemigroups Python bindings
    J. Mitchell and N. Thiéry : Edinburgh, 2017, Cernay 2017, 2018

  • libsemibroups usable directly in Jupyter thanks to xeus-cling
    S. Corlay, J. Mabile, L. Gouarin

  • libsemigroups packaging
    J. Mitchell and N. Thiéry : Jupyter for Mathematics Workshop, Edinburgh, 2017

Sage-GAP lightweight Math-in-the-Middle interface

In action

In [ ]:
A = T5.algebra(QQ); A
In [ ]:
A.an_element() ^ 3

How it works

  • Enriched libgap handles with
  • Semantic carried over using
  • Alignments provided as annotations

    @semantic(mmt="Group", variant="multiplicative")
      class Groups:
          class ParentMethods:
              @semantic(gap="GeneratorsOfGroup", codomain=Family[Self])
              def group_generators(self):

That's not all!