Supplementary Materials

This page contains supplementary materials for the paper "Dual bounds for the positive definite functions approach to mutually unbiased bases", which were also previously used for Nikolaus Doppelbauer's ETH Zurich master's thesis "Packing problems in groups, including mutually unbiased bases: symmetries and dual witnesses."


Part of the paper requires 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.

Code and Organization
All code is provided in this archive. After unzipping, the directory will have the following structure, consisting of three types of file:

Precomputed data:

  • data/
    • s_matrix_values_6_2.csv
    • s_matrix_values_6_3.csv

Library code:




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. While complete instructions are given below, for further details you may also look through the help strings of the scripts, by running commands like

    sage -python -h
Verification 1: Reduced List of Irreps

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 r_up_to 6 5

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

Verification 1.5: Double-Checking

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 1 1 0 0 -1 -1
Verification 2: Positivity for Remaining Irreps

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 6 2 --output_file="data/s_matrix_values_6_2.csv"
    sage -python 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

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 2 0 0 0 0 -2 --ssyt_basis_index=0
    sage -python 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 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 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 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 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 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.