# The following code is used in # "Rationality Problem for Algebraic Tori" # by Akinari Hoshi and Aiichi Yamasaki # Written by Aiichi Yamasaki RequirePackage("sonata"); Hminus1:= function(g) local m,gg,i,s,r; m:=[]; gg:=GeneratorsOfGroup(g); if gg=[] then return []; else for i in gg do; m:=Concatenation(m,i-Identity(g)); od; s:=SmithNormalFormIntegerMat(m); r:=Rank(s); return List([1..r],x->s[x][x]); fi; end; H0:= function(g) local m,s,r; m:=Sum(g); s:=SmithNormalFormIntegerMat(m); r:=Rank(s); return List([1..r],x->s[x][x]); end; H1:= function(g) local m,gg,i,s,r; m:=[]; gg:=GeneratorsOfGroup(g); if gg=[] then return []; else for i in gg do; m:=Concatenation(m,TransposedMat(i)-Identity(g)); od; m:=TransposedMat(m); s:=SmithNormalFormIntegerMat(m); r:=Rank(s); return List([1..r],x->s[x][x]); fi; end; CrystCatQClass:= function(G) local d,ch,cc,cg,s,q; d:=Length(Identity(G)); ch:=List(G,CharacteristicPolynomial); Sort(ch); for s in [1..NrCrystalSystems(d)] do for q in [1..NrQClassesCrystalSystem(d,s)] do cg:=MatGroupZClass(d,s,q,1); cc:=List(cg,CharacteristicPolynomial); Sort(cc); if cc=ch then return [d,s,q]; fi; od; od; end; CrystCatQClassCatalog:= function(G) return CrystCatQClass(G); end; CrystCatQClassNumber:= function(G) return CrystCatQClass(G); end; eigen31:= function(G) local ans,i; ans:=[]; for i in G do if CharacteristicPolynomial(i)=CharacteristicPolynomial(DiagonalMat([1,1,1,-1])) then ans:=Concatenation(ans,NullspaceIntMat(i+IdentityMat(4))); fi; od; return ans; end; eigen13:= function(G) local ans,i; ans:=[]; for i in G do if CharacteristicPolynomial(i)=CharacteristicPolynomial(DiagonalMat([1,-1,-1,-1])) then ans:=Concatenation(ans,NullspaceIntMat(i-IdentityMat(4))); fi; od; return ans; end; eigen22:= function(G) local l,i,j,ans; l:=[]; for i in G do if CharacteristicPolynomial(i)=CharacteristicPolynomial(DiagonalMat([1,1,-1,-1])) then if l=[] or (Length(l)=1 and i<>l[1]) then l:=Concatenation(l,[i]); fi; fi; od; ans:=[]; for i in [1,-1] do for j in [1,-1] do ans:=Concatenation(ans,LatticeBasis((IdentityMat(4)+i*l[1])*(IdentityMat(4)+j*l[2]))); od; od; return List(ans,x->x/Gcd(x)); end; eigen1:= function(G) local i,k,ans; ans:=[]; for i in G do k:=NullspaceIntMat(i-Identity(G)); if k<>[] and RankMat(k)=1 then ans:=Concatenation(ans,k); fi; od; return ans; end; mateigen2:= function(m) local ep,em; ep:=NullspaceIntMat(m-IdentityMat(Length(m))); em:=NullspaceIntMat(m+IdentityMat(Length(m))); return Concatenation(ep,em); end; CrystCatZClass:= function(G) local cat,hminus1,h0,h1,m,m1,m2,r,mr,h1a,h1b, l3,l4,l431,l422,l431s,l413s,l41s,l4d,l4a, i,j,k; cat:=CrystCatQClass(G); l3:=[[3, 4, 6], [3, 5, 2], [3, 5, 5]]; l4:=[[4, 4, 2], [4, 4, 3], [4, 4, 4], [4, 5, 1], [4, 5, 2], [4, 6, 1], [4, 6, 2], [4, 6, 3], [4, 7, 4], [4, 8, 2], [4, 8, 5], [4, 12, 1], [4, 12, 2], [4, 12, 3], [4, 12, 4], [4, 12, 5], [4, 13, 1], [4, 13, 2], [4, 13, 4], [4, 13, 5], [4, 13, 6], [4, 13, 7], [4, 13, 8], [4, 13, 9], [4, 13, 10], [4, 14, 1], [4, 14, 4], [4, 14, 5], [4, 14, 6], [4, 14, 7], [4, 14, 10], [4, 15, 10], [4, 16, 1], [4, 17, 2], [4, 18, 1], [4, 18, 2], [4, 18, 3], [4, 18, 4], [4, 18, 5], [4, 19, 4], [4, 20, 9], [4, 20, 10], [4, 20, 11], [4, 20, 12], [4, 20, 13], [4, 20, 16], [4, 20, 20], [4, 20, 21], [4, 21, 1], [4, 21, 2], [4, 21, 3], [4, 21, 4], [4, 22, 2], [4, 22, 5], [4, 22, 6], [4, 22, 7], [4, 22, 8], [4, 22, 9], [4, 22, 10], [4, 22, 11], [4, 23, 9], [4, 24, 2], [4, 24, 4], [4, 24, 5], [4, 25, 1], [4, 25, 3], [4, 25, 5], [4, 25, 6], [4, 25, 7], [4, 25, 8], [4, 25, 10], [4, 25, 11], [4, 29, 2], [4, 29, 3], [4, 29, 4], [4, 29, 5], [4, 29, 6], [4, 29, 7], [4, 29, 8], [4, 29, 9], [4, 30, 4], [4, 30, 12], [4, 31, 1], [4, 31, 2], [4, 31, 5], [4, 31, 6], [4, 31, 7], [4, 32, 2], [4, 32, 3], [4, 32, 6], [4, 32, 7], [4, 32, 8], [4, 32, 9], [4, 32, 12], [4, 32, 13], [4, 32, 14], [4, 32, 15], [4, 32, 17], [4, 33, 14]]; l431:=[[4, 6, 3], [4, 18, 5], [4, 25, 5], [4, 32, 13], [4, 32, 14]]; l422:=[[4, 5, 1], [4, 5, 2], [4, 6, 1], [4, 6, 2], [4, 12, 3], [4, 12, 4], [4, 12, 5], [4, 18, 3], [4, 24, 2], [4, 24, 4], [4, 24, 5], [4, 25, 1]]; l431s:=[[4, 8, 5], [4, 13, 7], [4, 14, 6], [4, 14, 10], [4, 15, 10], [4, 19, 4], [4, 20, 9], [4, 20 ,16], [4, 20, 20], [4, 22, 6], [4, 22, 9], [4, 22, 11], [4, 23, 9], [4, 25, 8], [4, 29, 9], [4, 30, 12], [4, 31, 7], [4, 33, 14]]; l413s:=[[4, 14, 7], [4, 22, 10], [4, 31, 5]]; l41s:=[[4, 12, 2], [4, 20, 13], [4, 29, 6], [4, 29, 8], [4, 31, 1], [4, 31, 2]]; l4d:=[[4, 25, 3], [4, 25, 6], [4, 25, 7], [4, 25, 10], [4, 25, 11], [4, 31, 6]]; l4a:=[[4, 17, 2], [4, 20, 11], [4, 22, 7]]; if NrZClassesQClass(cat[1],cat[2],cat[3])=1 then return Concatenation(cat,[1]); else if cat[1]=2 then h1:=H1(G); for i in [1..NrZClassesQClass(cat[1],cat[2],cat[3])] do if H1(MatGroupZClass(cat[1],cat[2],cat[3],i))=h1 then return Concatenation(cat,[i]); fi; od; fi; if cat[1]=3 then h1:=H1(G); hminus1:=Hminus1(G); h0:=H0(G); if cat in Set(l3) then m1:=Subgroups(G); h1a:=List(m1,H1); Sort(h1a); fi; for i in [1..NrZClassesQClass(cat[1],cat[2],cat[3])] do m:=MatGroupZClass(cat[1],cat[2],cat[3],i); if H1(m)=h1 then if Hminus1(m)=hminus1 then if H0(m)=h0 then if cat in Set(l3) then m2:=Subgroups(m); h1b:=List(m2,H1); Sort(h1b); if h1b=h1a then return Concatenation(cat,[i]); fi; else return Concatenation(cat,[i]); fi; fi; fi; fi; od; fi; if cat[1]=4 then h1:=H1(G); hminus1:=Hminus1(G); h0:=H0(G); if cat in Set(l4) then if cat in Set(l431) then m1:=eigen31(G); else if cat in Set(l422) then m1:=eigen22(G); else h1a:=List(G,x->H1(Group(x))); Sort(h1a); if cat in Set(l431s) then m1:=SmithNormalFormIntegerMat(eigen31(G)); else if cat in Set(l413s) then m1:=SmithNormalFormIntegerMat(eigen13(G)); else if cat in Set(l41s) then m1:=SmithNormalFormIntegerMat(eigen1(G)); else if cat in Set(l4d) then m1:=CrystCatZClass(DerivedSubgroup(G)); else if cat in Set(l4a) then m1:=Subgroups(G); h1b:=List(m1,H1); Sort(h1b); else if cat=[4,12,1] then m1:=CrystCatZClass(Group(Concatenation(GeneratorsOfGroup(G),[-Identity(G)]))); m2:=List(G,x->SmithNormalFormIntegerMat(mateigen2(x))); Sort(m2); fi; fi; fi; fi; fi; fi; fi; fi; fi; for i in [1..NrZClassesQClass(cat[1],cat[2],cat[3])] do m:=MatGroupZClass(cat[1],cat[2],cat[3],i); if H1(m)=h1 then if Hminus1(m)=hminus1 then if H0(m)=h0 then if cat in Set(l4) then if cat in Set(l431) then m2:=eigen31(m); for j in SymmetricGroup(4) do mr:=List([1..4],x->m1[x^j]); if (1/m2*mr in GL(4,Integers)) and (1/mr*m2 in GL(4,Integers)) then return Concatenation(cat,[i]); fi; od; else if cat in Set(l422) then m2:=eigen22(m); if -IdentityMat(4) in G then r:=MatGroupZClass(4,32,21,1); else r:=MatGroupZClass(4,25,7,1); fi; for j in r do mr:=j*m1; if (1/m2*mr in GL(4,Integers)) and (1/mr*m2 in GL(4,Integers)) then return Concatenation(cat,[i]); fi; od; else k:=List(m,x->H1(Group(x))); Sort(k); if k=h1a then if cat in Set(l431s) then if SmithNormalFormIntegerMat(eigen31(m))=m1 then return Concatenation(cat,[i]); fi; else if cat in Set(l413s) then if SmithNormalFormIntegerMat(eigen13(m))=m1 then return Concatenation(cat,[i]); fi; else if cat in Set(l41s) then if SmithNormalFormIntegerMat(eigen1(m))=m1 then return Concatenation(cat,[i]); fi; else if cat in Set(l4d) then if CrystCatZClass(DerivedSubgroup(m))=m1 then return Concatenation(cat,[i]); fi; else if cat in Set(l4a) then m2:=Subgroups(m); k:=List(m2,H1); Sort(k); if k=h1b then return Concatenation(cat,[i]); fi; else if cat=[4,12,1] then k:=List(m,x->SmithNormalFormIntegerMat(mateigen2(x))); Sort(k); if CrystCatZClass(Group(Concatenation(GeneratorsOfGroup(m),[-IdentityMat(4)])))=m1 and k=m2 then return Concatenation(cat,[i]); fi; else return Concatenation(cat,[i]); fi; fi; fi; fi; fi; fi; fi; fi; fi; else return Concatenation(cat,[i]); fi; fi; fi; fi; od; fi; fi; end; CrystCatZClassCatalog:= function(G) return CrystCatZClass(G); end; CrystCatZClassNumber:= function(G) return CrystCatZClass(G); end;