Here are the code snippets that was discussed Chapter 12 and the Appendix of my PhD thesis "A toolbox for left-orders of low complexity" available at: https://arxiv.org/pdf/2512.07035.
This package does GAP computations for the family of groups
The numerical experiment is set up as follows. Take the kernel equation
We use GAP to compute the kernel
Here's an example prompt to obtain the abelian rank of ker_phi(n,m):
gap> n := 2;; m :=3 ;;
gap> H := ker_phi(n,m);
Group(<fp, no generators known>)
gap> AbH := abelianization(H);
Group([ f1*f2*f3^-1, f3, f2^-1*f3 ])
gap> rank(AbH);
3
We can also make tables varying n and m.
gap> n_range := [1..20];; m_range := [1..10];;
gap> data := compute_abelian_ranks(n_range, m_range);;
Another straightforward-but-informative computation we can do is to probe what the structure of these abelianised kernels look like. Using the compute_abelian_kernels function, we may view what the abelian kernels for fixed m. For example, this is how we would get the data for m=3.
gap> n_range := [1..20];; m :=3;;
gap> data := compute_abelian_kernels(n_range, 3);;
Computes normal forms for n=2.
An example use case normalising
gap> w := b^-1*a*b^3;;
gap> normalize(w);
a^2*b^4
If one wishes to verify an entire list at once, such as the generating set
gap> Y := [ a*b^2, b^-1*a*b^3, b^-2*a*b^4, b^-3*a*b^5, b^-4*a, b^-5*a*b, b^6 ];;
gap> Apply(Y, y -> normalize(y));
gap> Y;
[ a*b^2, a^2*b^4, a*(a*b)^2*b^4, a*(a*b)^3*b^5, a*(a*b)^4, a*(a*b)^5*b, b^6 ]
gap> psi_Y := [x, y*x*z^-1, x^-1*y*x*z^-1, x^-1*y^-1*x^-1*y*x,x^-1*y^-1*z^2 ,x^-1*y^-1*x*z^2, y^-1*x^-1*y*x*z^-1];;
gap> Apply(psi_Y, y -> normalize(y));
gap> psi_Y;
[ a*b^2, a^2*b^4, a*(a*b)^2*b^4, a*(a*b)^3*b^5, a*(a*b)^4, a*(a*b)^5*b, b^6 ]
gap> Y = psi_Y;
true
This project was done as part of my PhD research, which couldn't have happened without the guidance of my supervisor Yago Antolín.