This page contains supplementary materials that I prepared for Nikolaus Doppelbauer's ETH Zurich master's thesis **"Packing problems in groups, including mutually unbiased bases: symmetries and dual witnesses."**

Part of Nikolaus' project required verifying that some matrices, built by taking certain averages over irreducible representations (irreps) of \( U(d) \) with \(d = 6\), are positive semidefinite. The tools here are meant to check (a) that these matrices equal the identity or the identity shifted by a rank-one perturbation, and (b) that the resulting matrices are positive semidefinite, which reduces to a scalar computation. These are not numerical approximations; all scripts perform exact symbolic computations using SageMath.

Precomputed data:

- data/
- s_matrix_values_6_2.csv
- s_matrix_values_6_3.csv

Library code:

- irrep_dimension.py
- partition.py
- permutation.py
- settings.py
- sym_character.py
- s_matrix.py
- s_matrix_test.py
- tableau.py

Scripts:

- script_check_basis_zero.py
- script_check_positivity.py
- script_irrep_dimension.py
- script_merge_check_positivity_results.py
- script_s_matrix.py

The computer-assisted results in the thesis are verified by running the files in the scripts section, as described below. The library code is called by those scripts. The precomputed data is included for convenience, but may be recomputed if so desired, as described below.

The following computes the dimension of the subspace of an irrep of \(U(d)\) in which the perturbation, if any, must lie. We repeat this computation (using the r_up_to flag) for every irrep considered in the thesis. The below snippet prints all those irreps for which the dimension is greater than zero, reproducing Table 2.1.

sage -python script_irrep_dimension.py r_up_to 6 5

For those irreps not appearing in the output, the dimension is zero and the positivity condition holds trivially.

When the dimension is zero, then we expect the output of an associated projection operator applied to any basis element of the irrep, viewed per Weyl's classical construction as a subspace of tensors, to output the zero tensor. As a verification the above script, the following script performs this computation directly for a given irrep.

sage -python script_check_basis_zero.py 1 1 0 0 -1 -1

In the thesis, Nikolaus only considers further cases where the dimension equals one. In this case, checking the positivity constraint reduces to computing a scalar. We divide this computation up into two parts. First, we compute certain intermediate results associated to "\(\mathbf{S}\) matrices," and output them to a file used by the final routine. Since these computations are expensive, we include the outputs for the cases the thesis covers in the archive above. But, if so desired, the following commands will remove these results and recompute them.

rm data/*.csv sage -python script_s_matrix.py 6 2 --output_file="data/s_matrix_values_6_2.csv" sage -python script_s_matrix.py 6 3 --output_file="data/s_matrix_values_6_3.csv"

We have found parts of these computations to be especially subtle, so we include some tests of the consistency of the computations involved as well, which may be run as follows.

sage -python s_matrix_test.py

Finally, the following commands take as input the results of the \(\mathbf{S}\) matrix calculations and the index of the irreducible representation in question, and verify the positivity condition for each of the two irreps in question.

sage -python script_check_positivity.py 2 0 0 0 0 -2 --ssyt_basis_index=0 sage -python script_check_positivity.py 3 0 0 0 0 -3 --ssyt_basis_index=1

The ssyt_basis_index flag indicates an index in the relevant subspace basis, which is indexed by semistandard Young tableaux, to be used. When the chosen basis element projects to zero under the projection mentioned above, positivity cannot be verified using that element, which is why the flag must be changed in the second command.

Finally, since the last command above is very expensive (it runs in 3-4 days for me), we provide a simple mechanism to distribute the computation. To do this, we first run the following sequence of commands. The sizes of the "slices" below may be varied, and the number of these commands running on a given computer should not exceed the number of CPU cores the computer has. The computations may also be distributed across several computers and then collected with the help of a source control system like git.

mkdir out nohup sage -python script_check_positivity.py 3 0 0 0 0 -3 --ssyt_basis_index=1 --outer_slice=0:10 > out/pos_3_0_0_0_0_-3__0-10.out 2>&1 & nohup sage -python script_check_positivity.py 3 0 0 0 0 -3 --ssyt_basis_index=1 --outer_slice=10:20 > out/pos_3_0_0_0_0_-3__10-20.out 2>&1 & nohup sage -python script_check_positivity.py 3 0 0 0 0 -3 --ssyt_basis_index=1 --outer_slice=20:30 > out/pos_3_0_0_0_0_-3__20-30.out 2>&1 & ... nohup sage -python script_check_positivity.py 3 0 0 0 0 -3 --ssyt_basis_index=1 --outer_slice=170:180 > out/pos_3_0_0_0_0_-3__170-180.out 2>&1 & sage -python script_merge_check_positivity_results.py out/pos_3_0_0_0_0_-3__*.out

The last command above, provided the others have finished executing (as written they will run in the background), will produce the same final output as the non-distributed version from before.