`Class/Declare`(
"PK_subfield",
"An instance of this class represents a subfield of the field $PK$ of functions on $PX(a)$ generated by the functions $w$ and $z$",
["Field","stabiliser"::list,"The list of elements of the group $G_{16}$ that act as the identity on this subfield"],
["Field","generating_sets"::list,"A list of generating sets for the subfield"],
["Field","conversion_rules"::table,"In the $(i,j)$ slot this should have a list of equations expressing the elements of generating set $i$ in terms of generating set $j$. The $(i,i)$ slots can be left unset."],
["Method","check_stabiliser","",
proc(this)
local A,B,F,a,T,err,H;
A := {op(map(op,this["generating_sets"]))};
F := table():
for a in A do
for T in G8 do
err := simplify(act_PK[T](a) - a);
F[a,T] := evalb(err = 0);
od;
od;
for a in A do
for T in this["stabiliser"] do
if not(F[a,T]) then
printf("%A is not fixed by %A\n",a,T);
return false;
fi;
od;
od;
for B in this["generating_sets"] do
H := select(T -> (map(a -> F[a,T],{op(B)}) = {true}),G8);
if H <> this["stabiliser"] then
printf("stabiliser(%A) = %A\n",B,H);
return false;
fi;
od:
return true;
end
],
["Method","check_conversion","",
proc(this)
local i,j,n,A,B,C,R,E,e,err;
A := this["generating_sets"];
n := nops(A);
R := eval(this["conversion_rules"]);
for i from 1 to n do
for j from 1 to n do
if i <> j then
B := A[i];
C := A[j];
E := R[i,j];
if not(type(E,list(equation))) then
printf("rule (%d,%d) is not a list of equations \n",i,j);
return false;
fi;
if {op(map(lhs,E))} <> {op(B)} then
printf("rule (%d,%d) is not a list of equations for generating set %d\n",i,j,i);
return false;
fi;
if indets({op(map(rhs,E))}) minus {op(C)} <> {} then
printf("rule (%d,%d) does not express generating set %d in terms of generating set %d\n",i,j,i,j);
return false;
fi;
for e in E do
if not(PK_check_zero(lhs(e) - rhs(e))) then
printf("in rule (%d,%d), equation %A is incorrect\n",i,j,e);
return false;
fi;
od;
fi;
od;
od;
return true;
end
],
["Method","check","",
proc(this)
this["check_stabiliser"] and this["check_conversion"];
end
]
):
PK_subfields := table():
######################################################################
PK_subfields[ 1] := `new/PK_subfield`():
PK_subfields[ 1]["stabiliser"] := [1];
PK_subfields[ 1]["generating_sets"] := [[z,w],[t[0],u[0]]];
CR := table():
CR[1,2] := [z = t[0],w = u[0]];
CR[2,1] := [t[0] = z,u[0] = w];
PK_subfields[ 1]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 2] := `new/PK_subfield`():
PK_subfields[ 2]["stabiliser"] := [1,LL];
PK_subfields[ 2]["generating_sets"] := [[z],[t[0]]];
CR := table():
CR[1,2] := [z = t[0]];
CR[2,1] := [t[0] = z];
PK_subfields[ 2]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 3] := `new/PK_subfield`():
PK_subfields[ 3]["stabiliser"] := [1,L,LL,LLL];
PK_subfields[ 3]["generating_sets"] := [[t[1]]];
CR := table():
PK_subfields[ 3]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 4] := `new/PK_subfield`():
PK_subfields[ 4]["stabiliser"] := [1,M];
PK_subfields[ 4]["generating_sets"] := [[t[2],u[1]],[t[2],v[1]]];
CR := table():
CR[1,2] := [t[2] = t[2],u[1] = -v[1]*t[2]^3/(2+t[2])];
CR[2,1] := [t[2] = t[2],v[1] = -u[1]*(2+t[2])/t[2]^3];
PK_subfields[ 4]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 5] := `new/PK_subfield`():
PK_subfields[ 5]["stabiliser"] := [1,LM];
PK_subfields[ 5]["generating_sets"] := [[t[3],u[2]],[t[3],v[2]]];
CR := table():
CR[1,2] := [t[3] = t[3],u[2] = -(1-I)/sqrt(2)*v[2]*t[3]^3/(2+t[3])];
CR[2,1] := [t[3] = t[3],v[2] = -(1+I)/sqrt(2)*u[2]*(2+t[3])/t[3]^3];
PK_subfields[ 5]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 6] := `new/PK_subfield`():
PK_subfields[ 6]["stabiliser"] := [1,LLM];
PK_subfields[ 6]["generating_sets"] := [[t[2],u[3]],[t[2],v[3]]];
CR := table():
CR[1,2] := [t[2] = t[2],u[3] = -I*v[3]*t[2]^3/(2-t[2])];
CR[2,1] := [t[2] = t[2],v[3] = I*u[3]*(2-t[2])/t[2]^3];
PK_subfields[ 6]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 7] := `new/PK_subfield`():
PK_subfields[ 7]["stabiliser"] := [1,LLLM];
PK_subfields[ 7]["generating_sets"] := [[t[3],u[4]],[t[3],v[4]]];
CR := table():
CR[1,2] := [t[3] = t[3],u[4] = -(1+I)/sqrt(2)*v[4]*t[3]^3/(2-t[3])];
CR[2,1] := [t[3] = t[3],v[4] = -(1-I)/sqrt(2)*u[4]*(2-t[3])/t[3]^3];
PK_subfields[ 7]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 8] := `new/PK_subfield`():
PK_subfields[ 8]["stabiliser"] := [1,LL,M,LLM];
PK_subfields[ 8]["generating_sets"] := [[t[2]]];
CR := table():
PK_subfields[ 8]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[ 9] := `new/PK_subfield`():
PK_subfields[ 9]["stabiliser"] := [1,LL,LM,LLLM];
PK_subfields[ 9]["generating_sets"] := [[t[3]]];
CR := table():
PK_subfields[ 9]["conversion_rules"] := eval(CR):
##################################################
PK_subfields[10] := `new/PK_subfield`():
PK_subfields[10]["stabiliser"] := [1,L,LL,LLL,M,LM,LLM,LLLM];
PK_subfields[10]["generating_sets"] := [[t[4]]];
CR := table():
PK_subfields[10]["conversion_rules"] := eval(CR):