Commit 22c45fa9 authored by Gonzalo Tornaría's avatar Gonzalo Tornaría

test 353 with precomputed fields and galois groups

parent a9e51c58
This source diff could not be displayed because it is too large. You can view the blob instead.
// Galois theory for C353
// faster but conditional
// SetClassGroupBounds("GRH");
load "ex.m";
//load "polys.m";
ZZ := IntegerRing();
ZZx<x> := PolynomialRing(ZZ);
load "all-353.m";
f18 := DefiningPolynomial(R1);
gal, r, s := GaloisGroup(f18);
b, rho := IsIsomorphic(gal, G5);
assert b;
// we know Frob5
Frob5cycle :=
Reverse(Sort([<x,Multiplicity(s, x)> : x in Set(s)]))
where s is ([ Degree(f[1])
: f in Factorization(ChangeRing(f18,GF(5))) ]);
Frob5 := [c[3] : c in ConjugacyClasses(gal)
| CycleStructure(c[3]) eq Frob5cycle ];
assert(#Frob5 eq 1);
Frob5 := Frob5[1];
// we expect Tr(Frob5) = 1
if Trace(rho(Frob5)) ne 1 then
// fix it by composing rho with the outer automorphism
rho := rho * a
where a is autg`FpGroup[2](outg.1 @@ m)
where outg, m is OuterFPGroup(autg)
where autg is AutomorphismGroup(G5);
print ".";
end if;
// We expect Tr(Frob5) = 1
// Make sure this is right
assert Trace(rho(Frob5)) eq 1;
f353_R1 := GaloisSubgroup(s, H5 @@ rho);
//R1 := NumberField(f353_R1);
P2 := Radical(2*Integers(R1));
S0 := Radical(353*Integers(R1));
S5 := P2^5 * S0;
//gal, r, s := GaloisGroup(f353_R1);
function quad_ext(S, inf)
ray, m := RayClassGroup(S, inf);
return
[ AbelianExtension(Inverse(mq)*m)
where _, mq is quo<ray | Q>
where Q is QQ`subgroup
: QQ in Subgroups(ray : Quot:=[2])];
end function;
//qexts := quad_ext(S5, [1..#RealPlaces(R1)]);
//AttachSpec("mod/mod.spec");
//////////////////////////////////////////////////
GSp4 := Sp(4,2);
ex_skip := false;
// S5(B)
if not ex_skip or not assigned(G1) then
// printf ".";
G1 := [H`subgroup
: H in Subgroups(GSp4 : OrderEqual:=120)
| &and [Trace(x) eq 1 : x in order36]
where order36 := [x : x in H`subgroup | Order(x) in [3,6]]
];
assert #G1 eq 1; G1 := G1[1];
H1 := [H`subgroup
: H in Subgroups(G1 : OrderEqual:=12)
| #ConjugacyClasses(H`subgroup) eq 6 ];
assert #H1 eq 1; H1 := H1[1];
assert IsIsomorphic(H1, DihedralGroup(6));
assert IsTrivial(&meet Conjugates(G1,H1));
end if;
// S5(A)
if not ex_skip or not assigned(G2) then
// printf ".";
G2 := [H`subgroup
: H in Subgroups(GSp4 : OrderEqual:=120)
| &and [Trace(x) eq 0 : x in order36]
where order36 := [x : x in H`subgroup | Order(x) in [3,6]]
];
assert #G2 eq 1; G2 := G2[1];
H2 := [H`subgroup
: H in Subgroups(G2 : OrderEqual:=6)
| &+ [#Conjugates(G2, x) : x in H`subgroup] eq 86];
assert #H2 eq 1; H2 := H2[1];
assert IsIsomorphic(H2, SymmetricGroup(3));
assert #Conjugates(G2,ConjugacyClasses(H2)[2][3]) eq 15;
assert IsTrivial(&meet Conjugates(G2,H2));
end if;
// S6
if not ex_skip or not assigned(G3) then
// printf ".";
G3 := GSp4;
H3 := [H`subgroup
: H in Subgroups(G3 : OrderEqual:=36)
| not IsEmpty(order6)
and &and [Trace(x) eq 1 : x in order6]
where order6 := [x : x in H`subgroup | Order(x) eq 6]
];
assert #H3 eq 1; H3 := H3[1];
assert GroupName(H3) eq "S3^2";
assert IsTrivial(&meet Conjugates(G3,H3));
end if;
// A6
if not ex_skip or not assigned(G4) then
// printf ".";
G4 := Subgroups(GSp4:OrderEqual:=360);
assert #G4 eq 1; G4 := G4[1]`subgroup;
H4 := [H`subgroup
: H in Subgroups(G4:OrderEqual:=18)];
assert #H4 eq 1; H4 := H4[1];
assert GroupName(H4) eq "C3:S3";
assert IsTrivial(&meet Conjugates(G4,H4));
end if;
// S3wrC2
if not ex_skip or not assigned(G5) then
// printf ".";
G5 := Subgroups(GSp4:OrderEqual:=72);
assert #G5 eq 1; G5 := G5[1]`subgroup;
H5 := [H`subgroup
: H in Subgroups(G5:OrderEqual:=4)
| #&meet [ Kernel( hom<gl4->gl4 |
[h*a-a*h : a in OrderedGenerators(gl4)]> )
: h in Generators(H`subgroup) ] eq 64 ]
where gl4 is RMatrixSpace(GF(2), 4, 4);
assert #H5 eq 1; H5 := H5[1];
assert GroupName(H5) eq "C2^2";
assert IsTrivial(&meet Conjugates(G5,H5));
end if;
// A5(B)
if not ex_skip or not assigned(G6) then
// printf ".";
G6 := [H`subgroup
: H in Subgroups(GSp4:OrderEqual:=60)
| IsAbsolutelyIrreducible(H`subgroup)];
assert #G6 eq 1; G6 := G6[1];
H6 := Subgroups(G6:OrderEqual:=6);
assert #H6 eq 1; H6 := H6[1]`subgroup;
assert IsTrivial(&meet Conjugates(G6,H6));
end if;
// S3^2(A)
if not ex_skip or not assigned(G7) then
// printf ".";
G7 := [H`subgroup
: H in Subgroups(GSp4 : OrderEqual:=36)
| not IsEmpty(order6)
and &and [Trace(x) eq 0 : x in order6]
where order6 := [x : x in H`subgroup | Order(x) eq 6]
];
assert #G7 eq 1; G7 := G7[1];
H7 := [H`subgroup
: H in Subgroups(G7:OrderEqual:=2)
| #Centralizer(G7, H`subgroup) eq 4];
assert #H7 eq 1; H7 := H7[1];
assert IsTrivial(&meet Conjugates(G7,H7));
end if;
// C3:S3.C2
if not ex_skip or not assigned(G8) then
// printf ".";
G8 := [H`subgroup
: H in Subgroups(GSp4 : OrderEqual:=36)
| IsEmpty(order6)
where order6 := [x : x in H`subgroup | Order(x) eq 6]
];
assert #G8 eq 1; G8 := G8[1];
H8 := Subgroups(G8 : OrderEqual:=2);
assert #H8 eq 1; H8 := H8[1]`subgroup;
assert IsTrivial(&meet Conjugates(G8,H8));
end if;
// F5
if not ex_skip or not assigned(G9) then
// printf ".";
G9 := Subgroups(GSp4 : OrderEqual:=20);
assert #G9 eq 1; G9 := G9[1]`subgroup;
H9 := Subgroups(G9 : OrderEqual:=2);
assert #H9 eq 1; H9 := H9[1]`subgroup;
assert IsTrivial(&meet Conjugates(G9,H9));
end if;
//print "";
Gs := [G1, G2, G3, G4, G5, G6, G7, G8, G9];
Hs := [H1, H2, H3, H4, H5, H6, H7, H8, H9];
AttachSpec("mod.spec");
ZZ := IntegerRing();
ZZx<x> := PolynomialRing(ZZ);
//load "ex.m";
load "ex-353.m";
/// DATA for C353
load "../Brumer_G72/TR36v";
load "../Brumer_G72/test353Gal36";
m := ModNew(R1, rho);
PS := Multiset([]);
time for i := 1 to #all do
R2:=NumberField(Polynomial(R1, [-all[i], 0, 1]));
proj, phis := ModPhis(m, R2);
dim := Integers() ! Log(2, #Domain(phis[1])/#G5);
ps := [ ModPrimes( m, R2, proj, phi
: check_residual:=[<5,1>] ) : phi in phis ];
for p in ps do
Include(~PS, p);
end for;
printf "%4o: dim =%2o, %o\n", i, dim, Sort(ps);
K0 := NumberField(CAND353_18[1,3]);
residual_traces := [<5,1>];
if i mod 10 eq 0 then
printf "\n%o\n\n", PS;
end if;
num_fields := #CAND353_18[2];
fields := func<i | NumberField(CAND353_18[2,i])>;
gals := func<i | TR36v[CAND353_18[3,i]]>;
end for;
printf "\n\nFINAL: %o\n\n", PS;
load "run-test.m";
......@@ -33,8 +33,6 @@ end for;
assert #rhos eq 1;
rho := rhos[1];
assert IsConjugate(Sp(4,2), Image(rho), G1);
tr := func<g | g[1,5]+g[2,6]+g[3,7]+g[4,8]>;
tr1 := func<g | g[1,1]+g[2,2]+g[3,3]+g[4,4]>;
......@@ -62,7 +60,7 @@ time for i := 1 to num_fields do
/////
dim := Integers() ! Log(2, #Domain(phis[1])/#G1);
dim := Integers() ! Log(2, #gal2/#gal);
ps := [];
for phi in phis do
......@@ -96,6 +94,10 @@ time for i := 1 to num_fields do
continue;
end if;
pat := <m`frobR1[p], FrobeniusStructure(R2, p)>;
if not IsDefined(fc, pat) then
Append(~ps, -p);
continue phi;
end if;
all_classes := fc[pat];
bad_classes := [ c : c in all_classes | tr(phi(c)) eq 0 ];
if bad_classes eq [] then
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment