April 21: In addition to emb_updater2, another modernization
to our implementation emb_updater of Prof. Shimada’s 2013 embedding
update procedure will be released as emb_updater3
We now explain how to update an embedding
thus induced is contained in
- Fundamental concepts & notations.
- Understanding why we need to provide the Borcherds’ method with an initial
-chamber contained in . - Embedding update: A battle fought at the scale of the
-chamber structure. - Preliminary work & testing nondegeneracy with degentest
- Program emb_updater
- Program emb_updater2
Fundamental concepts & Notations
We start by quickly reviewing the background regarding the fundamental concepts and notations.
We denote by
We define a chamber structure on
The elements of this chamber structure are called
Understanding why we need to provide the Borcherds’ method with an initial
The Borcherds’ method needs a starting point to start exploring and processing the chamber structure over
For each of the three possible even hyperbolic ambient lattices mentioned in this table, a suitable Weyl vector
Assuming that the
Obtaining such a chamber is essential: Indeed, if you provide the Borcherds’ method with an initial

You don’t want to be stuck like the Hamster pictured above. Indeed, let’s consider that this Hamster represents Borcherds’ method. It is forever stuck outside of the chamber structure over
The Borcherds’ method relies on the RatDetect to avoid crossing such adjacencies. As indicated by its name, the procedure RatDetect, from section 1.7.1 of our thesis, detects such walls and enables the Borcherds’ method to avoid crossing these dangerous adjacencies.
Section 1.8 of our thesis contains all the details on the procedures that can be enforced to update an embedding so that a suitable initial chamber is obtained.
In this section, we start by presenting the idea outlined by Professor Shimada to do so in his 2013 article and then introduce our version of Prof. Shimada’s procedures, which solves all the problems and limitations of Shimada’s original ideal.
Embedding update procedure
A battle fought at the level of the
Updating an embedding is a battle fought at the level of the
Indeed, asserting the
This happens when either
belongs to a wall of , that is, to the boundary of or when
Remark : Note that we always know at least one element contained in the interior of a
Making the additional assumption that
We also assume that
This assumption is crucial because all the limitations of Shimada’s original procedure arise from a situation in which
When

Shimada’s idea original idea regarding an embedding update procedure for nondegeneracy consists in enumerating the walls in
As displayed on the above figure, we assume that this set is made of
Shimada’s then applies to the initial embedding
NB: As soon as an updated embedding has been obtained, you have to re-define the initial environment required to execute the Borcherds’ method in the framework of this new embedding. Everything is 100% automated with our programs.
Shimada’s idea embodies the core mechanics that should be used to update an embedding and obtain nondegeneracy, but the procedure that enforces these mechanics has many flaws. As indicated by Shimada himself, a successful outcome to this procedure may require many attempts. Shimada recommends using another ample class as input data whenever the procedure fails, without any precise explanation.
We identified all the limitations of Prof. Shimada’s original embedding update procedure and built on our findings to produce a modernized embedding update procedure from which the “lottery” aspect has been entirely removed. Our approach is more in line with the spirit of dynamic programming: Instead of applying many reflections to the initial embedding in one go, we proceed step by step.
Section 1.8 of our thesis contains more details and explanations regarding this matter.
Preliminary work & testing nondegeneracy with degentest
We now proceed to the computer-based side of our study, and explain how to update an embedding by studying an example. Load the input data we provide for the study of the
INPUT_DATA = load('INPUT_DATA/DIAG_PICARD_THREE/INPUT_DATA_DIAG_PICARD_THREE_case_2.sobj')
Load the program init_emb.sage :
load('init_emb.sage')

We already discussed in this section how to determine with ker_checker whether the Borcherds’ method will return a generating set of
Note that the input data list INPUT_DATA contains a class in

This class is ample and will play the role of the class
When loaded, the program init_emb automatically assigns the variable amp0 to INPUT_DATA[2], i.e., to the above ample class.
Note that the variable Weyl has been assigned by init_emb to a row matrix element of

which will play the role of the Weyl vector
As indicated by Shimada in his 2013 article, this Weyl vector is the Weyl vector of an initial
The program degentest will thus determine whether
load('degentest.sage')

Other than a visual indication, the output of degentest is consists of two booleans BOOL_DEGEN and BOOL_STUCK.
The value False is assigned to BOOL_DEGEN whenever the nondegeneracy test fails. When the chamber under study can be asserted as nondegenerate, BOOL_TEST will receive the value True.
If the image of the ample class
These booleans are checked by the program borcherds_direct.
This program automatically executes all the required checks and launches the Borcherds’ method when all the conditions required to do so are met.
Note that an additional warning is displayed when BOOL_STUCK is true :

To make sure that everything is clear regarding cases in which

When such a situation occurs, you have no leeway. The mechanics of the embedding update procedure rely on the application of reflections with respect to walls crossing the path between
Regarding the case under study, we see that the program degentest indicates that the initial chamber
We thus have to update our embedding. Since BOOL_STUCK is false, all lights are green to start updating our embedding. We provide two means to do so :
- The program emb_updater follows the guidelines provided by Shimada in his 2013 article.
This is one of the few sections of our code involving Magma. We do so by using the Sage / Magma interface, which provides a gateway to bring Magma’s features into the world of Python. More precisely, we used Magma in our program ShiChecker (based on an algorithm by Prof. Shimada) to compute the set
- We also provide a modernized version of Shimada’s embedding update procedure, which will enable you to deal with the cases for which emb_updater cannot obtain an embedding under which the nondegeneracy for
can be asserted : emb_updater2.sage
Program emb_updater
Let’s start with emb_updater :
load('emb_updater.sage')

This program produces an updated embedding. You then have to rerun degentest in order to determine whether this embedding is such that
Let’s see if the resulting updated embedding suits our needs :
load('degentest.sage')

Great ! Do not forget to verify that
You are now ready to run the Borcherds’ method!
Program emb_updater2
The program emb_updater2 is a modernized version of emb_updater: An updated embedding is computed by proceeding step-by-step: Each wall separating
That is, instead of applying many transformations in one go to the initial embedding, emb_updater2 proceeds obstruction by obstruction and updates the list of obstructions as soon as the embedding is updated.
This program follows the basic principles of dynamic programming :
- A system is in an initial state A.
- An agent takes a decision and makes a move.
- This move has an impact on the state of the system.
- The system is now in state B.
- The agent takes the new parameters of the system into account before making a decision and making its next move.
- Etc…
The program, therefore, takes the parameters of the new configuration into account before making a decision and making its next move. This is the general idea behind emb_updater2.
We provide more details about this matter in section 1.8.3 of our thesis.
To use emb_updater2 you can proceed exactly as we indicated previously when we provided guidelines for using emb_updater. Let’s launch
load('emb_updater2.sage')
with
Since the embedding used as input data already enables us to assert nondegenereacy for

To illustrate the inner workings of this program, we reload the initial embedding specified by the vectors in INPUT_DATA[1] :
load('init_emb.sage');
The program emb_updater2.sage starts its execution and performs as many iterations as needed to remove the obstructions while taking into account the whole new configuration after each update of the embedding :

Note that emb_updater2 obtains the same embedding as emb_updater. The same embedding as our implementation emb_updater of Shimada’s original embedding update procedure.
However, emb_updater2 obtained this result by applying only

Remember that emb_updater2 will be a valuable resource when emb_updater cannot satisfactorily update an embedding.