path:="/disk/global1/silviu/prun_2bit/";
S1:=Group((3,4),(3,9),(3,14));
S2:=Group((17,12,7,1)(13,8,2,18)(19,15,10,5)(20,16,11,6),(14,3)(13,7)(17,2)(12,8)(1,18)(20,5)(6,19)(10,16)(15,11));
aR:=(1,5,3,6);
aL:=aR^-1;
aD:=(2,5,4,6);
aU:=aD^-1;
bR:=(3,10,8,11);
bL:=bR^-1;
bD:=(7,10,9,11);
bU:=bD^-1;
dR:=(18,19,14,20);
dL:=dR^-1;
dD:=(4,19,17,20);
dU:=dD^-1;
cR:=(14,15,12,16);
cL:=cR^-1;
cD:=(9,15,13,16);
cU:=cD^-1;

gens:=[aU,aD,aL,aR,bU,bD,bL,bR,cU,cD,cL,cR,dU,dD,dL,dR];

k1:= (19,20);
k2:= (1,7,12,17)(2,8,13,18)(3,9,14,4)(5,10,15,19)(6,11,16,20);
k3:= (1,13)(2,12)(3,9)(4,14)(5,15)(6,16)(7,8)(17,18);

M:=Group(k1,k2,k3);

cmetrick:=Group(gens);

grp2:=Group( [ (11,15,13,14), (5,6), (5,13), (5,15,12,14), (5,16), (4,10,6,9), (3,10,5,9), 
  (3,20,19,18,17) ]);
grp1:=Group( [ (9,15,13,14), (3,4), (3,13), (3,15,12,14), (3,16), (2,8,4,7), (1,8,3,7), 
  (1,20,19,18,17) ]);


setm:=[];
for x in M do
if ConjugateGroup(grp1,x)=grp1 then AddSet(setm,x);fi;
od;

M_target:=Group(setm);
rmt:=RightTransversal(M,M_target);






Print("Group_11\n");

#Movetable 11#

set_11:=[];
r:=RightTransversal(cmetrick,grp1);
for x in r do
AddSet(set_11,CanonicalRightCosetElement(grp1,x));
od;

mv_11:=[];

for x in [1..Size(gens)] do
mv_11[x]:=[];
od;


for x in [1..Size(gens)] do
for y in [1..Size(r)] do
mv_11[x][y]:=PositionSet(set_11,CanonicalRightCosetElement(grp1,set_11[y]*gens[x]));
od;
od;

#Symtable 11#

sm_11:=[];

for x in [1..Size(setm)] do
sm_11[x]:=[];
od;

for x in [1..Size(setm)] do
for y in [1..Size(r)] do
sm_11[x][y]:=PositionSet(set_11,CanonicalRightCosetElement(grp1,set_11[y]^setm[x]));
od;
od;

Print("Group_12\n");

#Movetable 12#

set_12:=[];
r:=RightTransversal(cmetrick,grp2);
for x in r do
AddSet(set_12,CanonicalRightCosetElement(grp2,x));
od;

mv_12:=[];

for x in [1..Size(gens)] do
mv_12[x]:=[];
od;

for x in [1..Size(gens)] do
for y in [1..Size(r)] do
mv_12[x][y]:=PositionSet(set_12,CanonicalRightCosetElement(grp2,set_12[y]*gens[x]));
od;
od;

#Symtable 12#

sm_12:=[];

for x in [1..Size(setm)] do
sm_12[x]:=[];
od;

for x in [1..Size(setm)] do
for y in [1..Size(r)] do
sm_12[x][y]:=PositionSet(set_12,CanonicalRightCosetElement(grp2,set_12[y]^setm[x]));
od;
od;


#selector structures
quot1:=Size(cmetrick)/Size(grp1);
quot2:=Size(cmetrick)/Size(grp2);
A:=[];
for x in [1..Size(setm)+3] do
A[x]:=[];
od;

bv:=[];
for x in [1..quot1] do
bv[x]:=0;
od;


cnt1:=1;
for I in [1..quot1] do
	if bv[I]=0 then 
		min:=quot1+1;
   		for m in [1..Size(setm)] do
			if sm_11[m][I]<min then
				min:=sm_11[m][I];
			fi;
		od;
		for m in [1..Size(setm)] do
			bv[sm_11[m][I]]:=1;
			cnt2:=0;
			for m2 in [1..Size(setm)] do
				if sm_11[m2][sm_11[m][I]]=min then 
					A[cnt2+1][sm_11[m][I]]:=m2;
					cnt2:=cnt2+1;
				fi;
			od;
			A[Size(setm)+1][sm_11[m][I]]:=cnt2;
                  A[Size(setm)+2][sm_11[m][I]]:=min;
                  A[Size(setm)+3][sm_11[m][I]]:=cnt1;
 		od;
		cnt1:=cnt1+1;
	fi;
od;
quot_size:=cnt1-1;

Print("Actual size ",Size(cmetrick)/Size(grp1)," Quot size ",quot_size,"\n");



OutputLogTo(Concatenation(path,"mv_11.txt"));
for x in [1..16] do
for y in [1..116280] do
Print(mv_11[x][y],"\n");
od;
od;
OutputLogTo();
OutputLogTo(Concatenation(path,"mv_12.txt"));
for x in [1..16] do
for y in [1..116280] do
Print(mv_12[x][y],"\n");
od;
od;
OutputLogTo();
OutputLogTo(Concatenation(path,"sm_11.txt"));
for x in [1..32] do
for y in [1..116280] do
Print(sm_11[x][y],"\n");
od;
od;
OutputLogTo();


OutputLogTo(Concatenation(path,"sm_12.txt"));
for x in [1..32] do
for y in [1..116280] do
Print(sm_12[x][y],"\n");
od;
od;
OutputLogTo();

OutputLogTo(Concatenation(path,"M_inv(x)_y.txt"));
for x in [1..Size(setm)] do
for y in [1..Size(setm)] do
Print(Position(setm,setm[x]^-1*setm[y]),"\n");
od;
od;
OutputLogTo();

OutputLogTo(Concatenation(path,"sm_inv_twist.txt"));
for x in [1..16] do
for y in [1..Size(setm)] do
Print(Position(gens,setm[y]*gens[x]*setm[y]^-1),"\n");
od;
od;
OutputLogTo();

OutputLogTo(Concatenation(path,"sm_inv_twist_dir.txt"));
for x in [1..16] do
for y in [1..4] do
Print(Position(gens,rmt[y]*gens[x]*rmt[y]^-1),"\n");
od;
od;
OutputLogTo();

SaveWorkspace("tables");