\\
\\ short PARI/GP tutorial for checking the list of rank 28 unimodular lattices
\\
\\ by Bill Allombert and Gaetan Chenevier, 13/11/2020
\\
\\ tested with GP/PARI version 2.13
\\
default(parisize,"1G");
\\ load the array L28 of rank 28 unimodular lattices,
\\ and print its number of elements
L28=readvec("L28");
print( #L28 );
\\ returns 357003
\\
\\ load the gp scripts tool file and prepare for parallel computations
\r tools_L28.gp
exportall();
\\ print the mass of the rank 28 unimodular lattices with no norm 1 element
print( no1_mass(28) );
\\ returns
\\ a/b with
\\ a=1722914776839913679032185321786744287148737,
\\ b=16573175467523436999761427022479360000000.
\\
\\ check the mass formula
print( no1_mass(28)==vecsum(vector(#L28,u,L28[u][4])) );
\\ returns 1
\\
\\ check that all the elements of L28 are non isomorphic
\\ we actually check that they have distinct HBV invariants
\\ WARNING : requires about 14d 5h (CPU time) and 40 GB of memory
res=parapply( x->HBV(nei(x)), L28);
print( #res==#Set(res) );
\\ returns 1
\\
\\ construct L28_i2
\\ and checks that this is the same as the content of the file L28_i2
L28_i2=parselect( x->2==imax(x[5]), L28);
print( L28_i2==readvec("L28_i2") );
\\ print the multiset of lattices in L28_i2 with root system nA1
matreduce(vector(#L28_i2,u,L28_i2[u][5]))~
\\ select the exceptional lattices in L28, i.e. having a characteristic vector
\\ of norm 4, and print their number (takes about 40min CPU time).
L28ex=parselect( x->is_exceptional(nei(x)), L28);
print(#L28ex);
\\ there are 16381 exceptional lattices in L28
\\
\\ various other checks
\\ check that each lattice in L28 is integral, unimodular and of rank 28
\\ (takes about 6 min CPU time)
res=parapply( x->check_int_un_dim(nei(x),28), L28);
print( res==vector(#res,u,1) );
\\ returns 1
\\
\\ check that the given root systems are correct for all elements in L28
\\ (takes about 59min CPU time)
res=parapply( x->root_system(nei(x))==x[5], L28);
print(res==vector(#res,u,1));
\\ check that the given order of isometry groups are correct,
\\ say for the 55585 lattices in L28_i5
\\ WARNING : takes about 13d 11h CPU time (on a fast machine)
L28_i5=readvec("L28_i5");
res=parapply( x->order_aut(nei(x))==1/x[4], L28_i5);
print( res==vector(#res,u,1) );
\\ the same check for all elements in L28 takes about 90d of CPU time
\\
\\ -- For the lattices in L28_ik with k>=6, it is faster to choose the default
\\ flag for qfauto (an option in order_aut), rather than [5,2].
\\
\\ -- For the unique element of L28_i28, order_aut requires insane memory.
\\ However, this case is actually trivial : this lattice is one of the two
\\ (isomorphic) lattices containing D_28 and different from I_28. Its
\\ automorphism group is the full Weyl group of D_28, whose order is 28!*2^27.