\\ \\ 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.