load "Subgroups/functions.txt";

G:=ChevalleyGroup("G",2,4);
Irr:=OrderByDimension(CompositionFactors(GModule(G)));
Append(~Irr,GModule(G,FrobeniusImage(Irr[2],1)));
S1:=Irr[1];
S61:=Irr[2];
S62:=Irr[3];
S36:=TensorProduct(S61,S62);
Irr:=AppendWithoutDuplicates(Irr,CompositionFactors(ExteriorSquare(S61)));
Append(~Irr,GModule(G,FrobeniusImage(Irr[4],1)));
S141:=Irr[4];
S142:=Irr[5];
Append(~Irr,S36);
Append(~Irr,TensorProduct(S141,S62));
S8421:=Irr[7];

labs:=["1","6_1","6_2","14_1","14_2","36","84_{2,1}"];


// Case 6.

A1:=BuildLargestModule(S61,[S1,S61,S62,S141]); DescribeLayers(A1,Irr,labs);
A2:=BuildLargestModule(S62,[S1,S61,S62,S141]); DescribeLayers(A2,Irr,labs);

Dimension(AHom(A1,S61)) eq 1 and Dimension(AHom(A1,S62)) eq 1;
Dimension(AHom(A2,S61)) eq 1 and Dimension(AHom(A2,S62)) eq 1;

A1a:=RemoveFromTop(A1,Irr,Irr,[2,3]);
A2a:=RemoveFromTop(A2,Irr,Irr,[2,3]);

E,rho:=Ext(Dual(A1a),S36); A1a:=Dual(MaximalExtension(Dual(A1a),S36,E,rho));
E,rho:=Ext(Dual(A2a),S36); A2a:=Dual(MaximalExtension(Dual(A2a),S36,E,rho));

DescribeLayers(A1a,Irr,labs); DescribeLayers(A2a,Irr,labs);

A1b:=BuildLargestModule(A1a,[S1]); DescribeLayers(A1b,Irr,labs);
A1c:=RemoveFromTop(A1b,Irr,Irr,[6]);
A1d:=BuildLargestModule(A1c,[S61]); DescribeLayers(A1d,Irr,labs);
A1e:=BuildLargestModule(A1c,[S62]); DescribeLayers(A1e,Irr,labs);


// Case 5.

"Socle 6_2+36";
B1:=BuildLargestModule(S62,[S1,S61,S141]); DescribeLayers(B1,Irr,labs);
B2:=BuildLargestModule(S36,[S1,S61,S141]); DescribeLayers(B2,Irr,labs);

"Socle 36";
B2a:=Dual(B2);
E,rho:=Ext(B2a,S62); B2a:=MaximalExtension(B2a,S62,E,rho);
E,rho:=Ext(B2a,S141); B2a:=MaximalExtension(B2a,S141,E,rho);
// As there is no extension between 14_1 and 6_1 or 1, no more 14_1s may be added.
B2a:=BuildLargestModule(Dual(B2a),[S1,S61]); 
B2b:=RemoveFromTop(B2a,Irr,Irr,[2,3]); DescribeLayers(B2b,Irr,labs);
B2c:=RemoveFromTop(B2b,Irr,Irr,[1,3,4,6]); DescribeLayers(B2c,Irr,labs);

"Socle 6_2";
B1a:=Dual(B1); E,rho:=Ext(B1a,S36); B1a:=MaximalExtension(B1a,S36,E,rho);
E,rho:=Ext(B1a,S141); B1a:=MaximalExtension(B1a,S141,E,rho);
B1a:=BuildLargestModule(Dual(B1a),[S1,S61]); 
B1b:=RemoveFromTop(B1a,Irr,Irr,[2,6]); DescribeLayers(B1b,Irr,labs);
Dimension(Fix(Dual(B1b))) eq 5;

"Socle 6_1+36";

B3:=BuildLargestModule(S61,[S1,S61,S62,S141]); DescribeLayers(B3,Irr,labs);
// For P(36) there are no more extensions with 14_1 so we just check that.
B4:=BuildLargestModule(B2a,[S1,S61,S62]); Dimension(Ext(S141,B4)) eq 0; DescribeLayers(B4,Irr,labs);

"Socle 6_1+6_1";

B5:=S61; E,rho:=Ext(B5,S1); B5:=MaximalExtension(B5,S1,E,rho); B5z:=B5; // Will need this later
"Extension with socle 1/6_1 and top 36";
E,rho:=Ext(B5,S36); B5a:=MaximalExtension(B5,S36,E,rho); DescribeLayers(Dual(B5a),Irr,labs);
E,rho:=Ext(B5,S62); B5:=MaximalExtension(B5,S62,E,rho);
E,rho:=Ext(B5,S1); B5:=MaximalExtension(B5,S1,E,rho); B5:=Dual(RemoveFromTop(Dual(B5),Irr,Irr,[3]));
// The well-defined extension:
DescribeLayers(Dual(B5),Irr,labs);
// No 36 on top:
Dimension(Ext(B5,S36)) eq 1;

E,rho:=Ext(B5,S141); B5:=MaximalExtension(B5,S141,E,rho);
E,rho:=Ext(B5,S36); B5:=MaximalExtension(B5,S36,E,rho); 
"Putting all 36s on top of the 14_1 added to the module:";
DescribeLayers(Dual(B5),Irr,labs);

E,rho:=Ext(B5,S1); B5:=MaximalExtension(B5,S1,E,rho); B5:=Dual(RemoveFromTop(Dual(B5),Irr,Irr,[6]));
DescribeLayers(Dual(B5),Irr,labs);

"Now place 84_{21} on top";

E,rho:=Ext(B5,S8421); B5b:=MaximalExtension(B5,S8421,E,rho);
E,rho:=Ext(B5z,S8421); B5c:=MaximalExtension(B5z,S8421,E,rho);
DescribeLayers(Dual(B5b),Irr,labs);
DescribeLayers(Dual(B5c),Irr,labs);

"Socle 6_1+6_2";

B6:=S62;
for i in [S141,S1,S36] do E,rho:=Ext(B6,i); B6:=MaximalExtension(B6,i,E,rho); end for;
"Full module with 14_1s and 36s:";
DescribeLayers(Dual(B6),Irr,labs);
E,rho:=Ext(B6,S1); B6:=MaximalExtension(B6,S1,E,rho); B6:=Dual(RemoveFromTop(Dual(B6),Irr,Irr,[6]));
DescribeLayers(Dual(B6),Irr,labs);

E,rho:=Ext(B6,S61); B6:=MaximalExtension(B6,S61,E,rho);
DescribeLayers(Dual(B6),Irr,labs);

"Socle 6_1";

// First make the module 1/6_2/1/6_1
B7:=RemoveFromTop(B3,Irr,Irr,[2,3,4]);
// As above, 14_1 can only be added on 6_2 and 36, so only need to do this adding two times.
E,rho:=Ext(Dual(B7),S141); B7:=Dual(MaximalExtension(Dual(B7),S141,E,rho));

B7all:=BuildLargestModule(B7,[S1,S61]);

E,rho:=Ext(Dual(B7all),S36); B7all:=MaximalExtension(Dual(B7all),S36,E,rho);
E,rho:=Ext(B7all,S141); B7all:=Dual(MaximalExtension(B7all,S141,E,rho));

B7all:=BuildLargestModule(B7all,[S1,S61]);
DescribeLayers(B7all,Irr,labs);


E,rho:=Ext(Dual(B7),S36); B7a:=Dual(MaximalExtension(Dual(B7),S36,E,rho));
B7a:=BuildLargestModule(B7a,[S1,S61]);
B7a:=RemoveFromTop(B7a,Irr,Irr,[2,6]);
DescribeLayers(B7a,Irr,labs);
// No non-trivial quotients
B7a eq RemoveFromTop(B7a,Irr,Irr,[2,3,4,6]);

B7b:=BuildLargestModule(B7,[S1,S61]);
E,rho:=Ext(Dual(B7b),S36); B7b:=Dual(MaximalExtension(Dual(B7b),S36,E,rho));
B7b:=BuildLargestModule(B7b,[S1]);
B7b:=RemoveFromTop(B7b,Irr,Irr,[2,6]);
DescribeLayers(B7b,Irr,labs);

// Case 3.

C1:=S36;
for i in [2,3,1,2,3,1,2,3] do E,rho:=Ext(C1,Irr[i]); C1:=MaximalExtension(C1,Irr[i],E,rho); DescribeLayers(Dual(C1),Irr,labs); end for;
for i in [1,2] do Dimension(Ext(C1,Irr[i])) eq 0; end for; // Don't need to test S62 as the module is Frobenius-invariant.
C21:=Dual(B3); C22:=RemoveFromTop(C21,Irr,Irr,[1,2,3]); C2:=Dual(C21/C22); DescribeLayers(C2,Irr,labs);

C3:=C1;
for i in [4,5,2,3,1,2,3] do E,rho:=Ext(C3,Irr[i]); C3:=MaximalExtension(C3,Irr[i],E,rho); DescribeLayers(Dual(C3),Irr,labs); end for;
for i in [1,2] do Dimension(Ext(C3,Irr[i])) eq 0; end for; // Don't need to test S62 as the module is Frobenius-invariant.
DescribeLayers(C3,Irr,labs);