\\ \\ short PARI/GP tutorial for using the companion list of unimodular lattices \\ unimodular_lattices.gp \\ and the scrips gathered in the auxilliary file \\ tools_unimodular_lattices.gp \\ \\ by Gaetan Chenevier, 14/07/2020 \\ \\ tested with GP/PARI version 2.11.2 \\ \\ (minor modifications 13/08/2020) allocatemem(2^30); \r unimodular_lattices.gp \r tools_unimodular_lattices.gp \\ the unimodular lattices of rank 20 without norm 1 vectors: for(i=1,#N20,print(N20[i])); \\ [2, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1], 0, 1/1275541328062914232320000, "D20", 1] \\ [4, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2], 0, 1/80343513169920000, "A15 D5", 1] \\ [5, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2], 0, 1/210691031040000, "2A1 2A9", 1/2] \\ [6, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 3; 3; 3; 3; 3; 3; 3; 3], 0, 1/5062877383753728000, "D12 D8", 1] \\ [6, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 3; 3; 3; 3; 3], 0, 1/1191909261312000, "A11 A3 E6", 1] \\ [6, [1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 3; 3; 3; 3; 3; 3; 3; 3], 0, 1/10228035118694400, "D4 2D8", 1/2] \\ [7, [1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 2; 3; 3; 3; 3; 3; 3; 3], 0, 1/12485394432000, "2A7 D5", 1/2] \\ [8, [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 2; 4; 4; 4; 4; 4; 4; 4], 0, 1/683488446806753280000, "D12 E8", 1] \\ [8, [1; 1; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 2; 2; 4; 4; 4; 4; 4; 4], 0, 1/388345708412928000, "D6 2E7", 1/2] \\ [8, [1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 2; 2; 3; 3; 4; 4; 4; 4; 4; 4], 0, 1/293534171136000, "2A1 3D6", 1/6] \\ [8, [1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 2; 3; 3; 3; 3; 3; 3; 4; 4; 4], 0, 1/4299816960000, "4A5", 1/8] \\ [10, [1; 1; 1; 1; 2; 2; 2; 2; 3; 3; 3; 3; 4; 4; 4; 4; 5; 5; 5; 5], 0, 1/31310311587840, "5D4", 1/120] \\ double check the (given) order of each of their isometry group: check_order_aut(20) \\ returns 1 after about 9 seconds \\ similarly, allocatemem(2^34); check_order_aut(26) \\ returns 1 after about 5h, 15min (CPU time) and \\ allocatemem(2^34); check_order_aut(27) \\ returns 1 after about 35h, 53min (CPU time) \\ compute a Gram matrix for the lattice N20[11] (with root system "4A5") G=nei(N20[11]); \\ G returns a not so decent Gram matrix, better use PARI's lll: lllgram(G) \\ which returns \\ \\ [ 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1] \\ [-1 2 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0] \\ [-1 1 2 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1] \\ [-1 1 1 2 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1] \\ [-1 1 1 1 2 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1] \\ [-1 1 0 1 1 3 2 2 2 1 2 -1 -1 0 0 0 0 2 1 1] \\ [-1 1 0 1 1 2 3 2 2 0 2 0 -1 1 1 1 1 1 0 0] \\ [-1 1 0 1 1 2 2 3 2 1 2 -1 -1 1 1 1 1 1 0 0] \\ [-1 1 0 1 1 2 2 2 3 0 2 0 -1 1 1 1 1 1 0 0] \\ [-1 0 0 0 0 1 0 1 0 3 0 -2 1 0 0 0 0 1 1 1] \\ [-1 1 0 1 1 2 2 2 2 0 3 0 -1 1 1 1 1 1 0 0] \\ [ 1 0 0 0 0 -1 0 -1 0 -2 0 3 -1 0 0 0 0 -1 -1 -1] \\ [-1 0 1 0 0 -1 -1 -1 -1 1 -1 -1 3 1 1 1 0 0 1 1] \\ [-1 1 1 1 1 0 1 1 1 0 1 0 1 3 2 2 1 0 0 0] \\ [-1 1 1 1 1 0 1 1 1 0 1 0 1 2 3 2 1 0 0 0] \\ [-1 1 1 1 1 0 1 1 1 0 1 0 1 2 2 3 1 0 0 0] \\ [-1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 1 3 0 -1 -1] \\ [-1 1 0 1 1 2 1 1 1 1 1 -1 0 0 0 0 0 3 1 1] \\ [-1 0 1 1 1 1 0 0 0 1 0 -1 1 0 0 0 -1 1 3 2] \\ [-1 0 1 1 1 1 0 0 0 1 0 -1 1 0 0 0 -1 1 2 3] \\ recompute the root system from a Gram matrix root_system(G) \\ returns of course "4A5" #N26 \\ there are 1901 unimodular lattices of rank 26 with no norm 1 vector number_unimodular_lattices(26) \\ the total number of unimodular lattices of rank 26 is 2566 \\ double check the (given) root system of each rank 26 unimodular lattice \\ with no norm 1 vector: check_root_systems(26) \\ returns 1 after about 15 seconds \\ similarly, check_root_systems(27) returns 1 after about 1min, 50s \\ list the unimodular lattices of rank 26 and root system 10A1 v=select(x->x[5]=="10A1",N26); for(i=1,#v,print(v[i])); \\ [32, [1; 1; 2; 2; 3; 4; 4; 5; 6; 6; 7; 8; 8; 9; 9; 10; 11; 12; 12; 13; 13; 14; 14; 15; 15; 16], 0, 1/98304, "10A1", 1/48] \\ [32, [1; 1; 2; 3; 4; 4; 5; 6; 6; 7; 7; 8; 8; 9; 9; 10; 10; 11; 11; 12; 12; 13; 14; 14; 15; 16], 0, 1/65536, "10A1", 1/32] \\ [32, [1; 1; 2; 3; 4; 4; 5; 6; 6; 7; 7; 8; 8; 9; 10; 10; 11; 12; 12; 13; 13; 14; 14; 15; 15; 16], 0, 1/98304, "10A1", 1/48] \\ [33, [1; 1; 2; 2; 3; 4; 4; 5; 5; 6; 7; 7; 8; 8; 9; 10; 10; 11; 12; 13; 13; 14; 14; 15; 16; 16], 0, 1/655360, "10A1", 1/320] \\ [38, [1; 1; 2; 4; 4; 6; 6; 7; 8; 8; 9; 10; 11; 11; 12; 13; 13; 14; 15; 15; 16; 16; 17; 18; 18; 19], 0, 1/12582912, "10A1", 1/6144] \\ [60, [1; 1; 2; 2; 4; 4; 7; 8; 9; 9; 10; 11; 12; 12; 13; 14; 15; 15; 16; 17; 19; 20; 22; 23; 30; 30], 0, 1/7549747200, "10A1", 1/3686400] \\ [82, [1; 1; 2; 2; 4; 4; 7; 7; 24; 24; 38; 36; 35; 33; 32; 10; 30; 12; 13; 27; 15; 16; 18; 19; 41; 41], 0, 1/95126814720, "10A1", 1/46448640] \\ check that all rank 26 lattices in the list N26 are non isomorphic: check_distinct_lattices(26) \\ returns 1 after about 9 minutes \\ similarly, check_distinct_lattices(27) returns 1 after about 5h, \\ and shows that all rank 27 lattices in the list N27 are non isomorphic \\ check that the total mass of the lattices in Ni coincides with \\ the mass formula for rank i unimodular lattices without norm 1 vectors vector(27,i,check_mass(i)) \\ returns [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] \\ list the unimodular lattices of rank 27 and empty root system v=select(x->x[5]=="",N27); for(i=1,#v,print(v[i])); \\ [55, [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27], 0, 1/7680, "", 1/3840] \\ [63, [1; 2; 3; 4; 5; 6; 8; 9; 10; 11; 12; 13; 15; 16; 17; 18; 19; 20; 22; 23; 24; 25; 26; 27; 29; 30; 31], 0, 1/3317760, "", 1/1658880] \\ [96, [1; 3; 5; 7; 9; 11; 13; 15; 16; 17; 19; 21; 23; 25; 27; 29; 31; 33; 35; 37; 38; 39; 41; 42; 43; 45; 47], 1, 1/1268047872, "", 1/634023936] \\ select the rank 27 unimodular lattices with root system "5A1 A2" v=select(x->x[5]=="5A1 A2",N27); #v \\ there are 16 such lattices check_distinct_invariants(v,5) \\ returns 0 : the depth 5 invariants of these 16 lattices \\ are not enough to distinguish them check_distinct_invariants(v,6,7) \\ returns 1 : their invariants of depth=6 and mod=7 are however distinct