# Let K be the field of rational functions on EX^*, and let KT be the biquadratic
# extension generated by r[1] = sqrt(1 - y[2]/sqrt(2)) and r[2] = sqrt(1 + y[2]/sqrt(2)).
# This file defines many elements of KT and relations between them, which are
# useful for studying the Galois theory of various intermediate fields.
# The relevant Galois group is defined in the file group64.mpl
# These elements t[i] are used when studying torus quotients of EX^*
#@ tx
tx[1] := (r[1]+1/sqrt(2))*(1-r[1]*y[1])/x[1];
tx[2] := (r[2]+1/sqrt(2))*(1-r[2]*y[1])/x[2];
tx[3] := (r[1]+1/sqrt(2))*(1+r[1]*y[1])/x[1];
tx[4] := (r[2]+1/sqrt(2))*(1+r[2]*y[1])/x[2];
# These are expressions for t[i] in terms of y[1], r[1] and r[2].
# They are correct on F16 but have the wrong sign in some other places.
#@ tr
tr[1] := sqrt((r[1]+1/sqrt(2))*(1-r[1]*y[1])/((r[1]-1/sqrt(2))*(1+r[1]*y[1])));
tr[2] := sqrt((r[2]+1/sqrt(2))*(1-r[2]*y[1])/((r[2]-1/sqrt(2))*(1+r[2]*y[1])));
tr[3] := sqrt((r[1]+1/sqrt(2))*(1+r[1]*y[1])/((r[1]-1/sqrt(2))*(1-r[1]*y[1])));
tr[4] := sqrt((r[2]+1/sqrt(2))*(1+r[2]*y[1])/((r[2]-1/sqrt(2))*(1-r[2]*y[1])));
# Some further elements with nice transformation properties
#@ st
st[ 1] := t[3]*t[1]:
st[ 2] := t[4]*t[2]:
st[ 3] := t[3]/t[1]:
st[ 4] := t[4]/t[2]:
st[ 5] := st[1]/2+1/st[1]/2-2:
st[ 6] := st[2]/2+1/st[2]/2-2:
st[ 7] := st[3]/2+1/st[3]/2:
st[ 8] := st[4]/2+1/st[4]/2:
st[ 9] := (t[1]+1/t[1])/2:
st[10] := (t[2]+1/t[2])/2:
st[11] := (t[3]+1/t[3])/2:
st[12] := (t[4]+1/t[4])/2:
st[13] := t[1]*t[2] - t[3]*t[4]:
st[14] := t[1]/t[2] - t[3]/t[4]:
st[15] := t[2]/t[1] - t[4]/t[3]:
st[16] := 1/(t[1]*t[2]) - 1/(t[3]*t[4]):
# Expressions for s[i] in terms of y[1], y[2], r[1], r[2]
#@ sx
sx[ 1] := (r[1] + 1/sqrt(2))/(r[1] - 1/sqrt(2));
sx[ 2] := (r[2] + 1/sqrt(2))/(r[2] - 1/sqrt(2));
sx[ 3] := (1 + r[1]*y[1])/(1 - r[1]*y[1]);
sx[ 4] := (1 + r[2]*y[1])/(1 - r[2]*y[1]);
sx[ 5] := (1 + y[2]*sqrt(2))/(1 - y[2]*sqrt(2));
sx[ 6] := (1 - y[2]*sqrt(2))/(1 + y[2]*sqrt(2));
sx[ 7] := (1 + y[1]^2*(1 - y[2]/sqrt(2)))/(1 - y[1]^2*(1 - y[2]/sqrt(2)));
sx[ 8] := (1 + y[1]^2*(1 + y[2]/sqrt(2)))/(1 - y[1]^2*(1 + y[2]/sqrt(2)));
sx[ 9] := 2*r[1]*x[1]*(1-y[1]/sqrt(2))/((1 - y[1]^2*(1-y[2]/sqrt(2)))*(1-y[2]*sqrt(2)));
sx[10] := 2*r[2]*x[2]*(1-y[1]/sqrt(2))/((1 - y[1]^2*(1+y[2]/sqrt(2)))*(1+y[2]*sqrt(2)));
sx[11] := 2*r[1]*x[1]*(1+y[1]/sqrt(2))/((1 - y[1]^2*(1-y[2]/sqrt(2)))*(1-y[2]*sqrt(2)));
sx[12] := 2*r[2]*x[2]*(1+y[1]/sqrt(2))/((1 - y[1]^2*(1+y[2]/sqrt(2)))*(1+y[2]*sqrt(2)));
sx[13] := -2*y[1]*(r[1]+1/sqrt(2))*(r[2]+1/sqrt(2))*(r[1]+r[2])/(x[1]*x[2]);
sx[14] := -2*y[1]*(r[1]+1/sqrt(2))*(r[2]-1/sqrt(2))*(r[1]-r[2])/(x[1]*x[2]);
sx[15] := 2*y[1]*(r[1]-1/sqrt(2))*(r[2]+1/sqrt(2))*(r[1]-r[2])/(x[1]*x[2]);
sx[16] := 2*y[1]*(r[1]-1/sqrt(2))*(r[2]-1/sqrt(2))*(r[1]+r[2])/(x[1]*x[2]);
# Another family of elements with nice transformation properties
#@ ut
ut[ 1] := t[1]+t[3]:
ut[ 5] := t[1]-t[3]:
ut[ 9] := t[1]-1/t[3]:
ut[13] := t[1]+1/t[3]:
for i from 0 to 3 do
ut[4*i+2] := act_AT[L](ut[4*i+1]);
ut[4*i+3] := act_AT[A1](ut[4*i+1]);
ut[4*i+4] := act_AT[LA1](ut[4*i+1]);
od:
for i from 1 to 16 do
ux[i] := FNF_y0(eval(subs(t = tx,ut[i])));
od:
#@ tu
tu[ 1] := u[1]/2 + u[5]/2;
tu[ 2] := u[2]/2 + u[6]/2;
tu[ 3] := u[1]/2 - u[5]/2;
tu[ 4] := u[2]/2 - u[6]/2;
#@ su
su[ 1] := - u[ 1]/u[ 3];
su[ 2] := - u[ 2]/u[ 4];
su[ 3] := - u[15]/u[13];
su[ 4] := - u[16]/u[14];
su[ 5] := u[ 9]*u[11]/2 - 1;
su[ 6] := u[10]*u[12]/2 - 1;
su[ 7] := - u[ 1]*u[ 3]/2 - 1;
su[ 8] := - u[ 2]*u[ 4]/2 - 1;
su[ 9] := ( u[ 1] - u[11])/2;
su[10] := ( u[ 2] - u[12])/2;
su[11] := (-u[ 3] + u[11])/2;
su[12] := (-u[ 4] + u[12])/2;
su[13] := (u[ 1]*u[ 6]+u[ 2]*u[ 5])/2;
su[14] := - (u[ 4]*u[ 5]+u[ 1]*u[ 8])/2;
su[15] := - (u[ 3]*u[ 6]+u[ 2]*u[ 7])/2;
su[16] := (u[ 3]*u[ 8]+u[ 4]*u[ 7])/2;
#@ au
au[1] := factor(1/(1/u[1]+1/u[3]));
au[2] := factor(1/(1/u[6]+1/u[8]));
#@ bu
bu[1] := u[1]*u[3];
bu[2] := u[6]*u[8];
#@ bs
bs[1] := -2*(s[7]+1);
bs[2] := 2*(s[8]-1);
# Expressions for x[i], y[i], z[i], r[i] in terms of s[j]
zs[1] := (s[7]*s[8]-1)/((1+s[7])*(1+s[8])); #@ zs
ys[1] := sqrt(2)*(s[3]-1)/(s[3]+1)*(s[1]-1)/(s[1]+1); #@ ys
ys_alt[1] := sqrt(2)*(s[4]-1)/(s[4]+1)*(s[2]-1)/(s[2]+1); #@ ys_alt
ys[2] := sqrt(2)*(s[8]-s[7])/(s[7]*s[8]-1);
xs[1] := 2*sqrt(2)*t[3]/((s[1]-1)*(s[3]+1)); #@ xs
xs[2] := 2*sqrt(2)*t[4]/((s[2]-1)*(s[4]+1));
xs[3] := ys[1];
xs[4] := -ys[1]*ys[2];
rs[1] := (s[1]+1)/(s[1]-1)/sqrt(2); #@ rs
rs[2] := (s[2]+1)/(s[2]-1)/sqrt(2);
# Expressions for x[i], y[i], z[i], r[i] in terms of t[j]
zt[1] := eval(subs(s = st,zs[1] )): #@ zt
yt[1] := eval(subs(s = st,ys[1] )): #@ yt
yt_alt[1] := eval(subs(s = st,ys_alt[1])): #@ yt_alt
yt[2] := eval(subs(s = st,ys[2] )):
xt[1] := eval(subs(s = st,xs[1] )): #@ xt
xt[2] := eval(subs(s = st,xs[2] )):
xt[3] := eval(subs(s = st,xs[3] )):
xt[4] := eval(subs(s = st,xs[4] )):
rt[1] := eval(subs(s = st,rs[1] )): #@ rt
rt[2] := eval(subs(s = st,rs[2] )):
# Relations among the elements t[i]
#@ t_rels
t_rels[ 1] := t[1]^2*t[2]^2*t[3]^2*t[4]^2-4*t[1]^2*t[2]*t[3]^2*t[4]-4*t[1]*t[2]^2*t[3]*t[4]^2+t[1]^2*t[3]^2+12*t[1]*t[2]*t[3]*t[4]+t[2]^2*t[4]^2-4*t[1]*t[3]-4*t[2]*t[4]+1;
t_rels[ 2] := t[1]^2*t[2]*t[3]*t[4]^2-t[1]*t[2]^2*t[3]^2*t[4]+t[1]^2*t[2]*t[3]-t[1]*t[2]^2*t[4]-t[1]*t[3]^2*t[4]+t[2]*t[3]*t[4]^2-t[1]*t[4]+t[2]*t[3];
#@ ts_rels
ts_rels[1] := tan_sum(t[1], t[3]) + ((t[1]+t[3])*(r[1]-1/sqrt(2))/sqrt(2));
ts_rels[2] := tan_sum(t[2], t[4]) + ((t[2]+t[4])*(r[2]-1/sqrt(2))/sqrt(2));
ts_rels[3] := tan_sum(t[1],-t[3]) - ((t[1]-t[3])*(r[1]-1/sqrt(2))/r[1]/2);
ts_rels[4] := tan_sum(t[2],-t[4]) - ((t[2]-t[4])*(r[2]-1/sqrt(2))/r[2]/2);
# Relations among the elements s[i]
#@ s_rels
s_rels[ 1] := s[5]*s[6]-1;
s_rels[ 2] := s[5]*((s[7]-2)*(s[8]+2)+3) - ((s[7]+2)*(s[8]-2)+3);
s_rels[ 3] := s[6]*((s[7]+2)*(s[8]-2)+3) - ((s[7]-2)*(s[8]+2)+3);
s_rels[ 4] := s[9]/s[11]-s[10]/s[12];
s_rels[ 5] := s[1]*s[2]*s[3]-s[1]*s[2]*s[4]+s[1]*s[3]*s[4]-s[2]*s[3]*s[4]-s[1]+s[2]-s[3]+s[4];
s_rels[ 6] := s[1]^2*s[2]^2-4*s[1]^2*s[2]-4*s[1]*s[2]^2+s[1]^2+12*s[1]*s[2]+s[2]^2-4*s[1]-4*s[2]+1;
s_rels[ 7] := s[13]*s[14]*s[15] + s[13]*s[14]*s[16] + s[13]*s[15]*s[16] + s[14]*s[15]*s[16];
s_rels[ 8] := (s[13]-s[14]-s[15]+s[16])^2 + 8*(s[13]+s[14]+s[15]+s[16])^2 - 8*(s[13]-s[16])^2 - 8*(s[14]-s[15])^2;
s_rels[ 9] := ((1-4*s[1]+s[1]^2)*(s[2]-2) - 2*s[1])^2 - (1 - s[1])^2*(3*s[1]-1)*(s[1]-3);
s_rels[10] := ((1-4*s[2]+s[2]^2)*(s[1]-2) - 2*s[2])^2 - (1 - s[2])^2*(3*s[2]-1)*(s[2]-3);
s_rels[11] := s[1]*s[2]*s[16] + s[13];
s_rels[12] := s[1]*s[15] + s[2]*s[14];
# Quadratic relations for t[i] over K
#@ qt_rels
qt_rels[1] := t[1]^2 -2*sqrt(2)*x[1]*(1-sqrt(2)*y[1]*(1-y[2]/sqrt(2)))/((1-y[2]*sqrt(2))*(1-y[1]^2*(1-y[2]/sqrt(2)))) * t[1] - 1;
qt_rels[2] := t[2]^2 -2*sqrt(2)*x[2]*(1-sqrt(2)*y[1]*(1+y[2]/sqrt(2)))/((1+y[2]*sqrt(2))*(1-y[1]^2*(1+y[2]/sqrt(2)))) * t[2] - 1;
qt_rels[3] := t[3]^2 -2*sqrt(2)*x[1]*(1+sqrt(2)*y[1]*(1-y[2]/sqrt(2)))/((1-y[2]*sqrt(2))*(1-y[1]^2*(1-y[2]/sqrt(2)))) * t[3] - 1;
qt_rels[4] := t[4]^2 -2*sqrt(2)*x[2]*(1+sqrt(2)*y[1]*(1+y[2]/sqrt(2)))/((1+y[2]*sqrt(2))*(1-y[1]^2*(1+y[2]/sqrt(2)))) * t[4] - 1;
# The relations u_lin_rels[i] and u_quad_rels[i] depend only on the expressions
# for the u[i] in terms of the t[j], not on the relations among the t[j]
#@ u_lin_rels
u_lin_rels := {
u[ 1] + u[ 3] - u[ 9] - u[11],
u[ 1] + u[ 5] - u[ 9] - u[13],
u[ 1] + u[ 7] - u[11] - u[13],
u[ 2] + u[ 4] - u[10] - u[12],
u[ 2] + u[ 6] - u[10] - u[14],
u[ 2] + u[ 8] - u[12] - u[14],
u[ 3] + u[ 5] - u[ 9] - u[15],
u[ 3] + u[ 7] - u[11] - u[15],
u[ 4] + u[ 6] - u[10] - u[16],
u[ 4] + u[ 8] - u[12] - u[16],
u[ 5] + u[ 7] - u[13] - u[15],
u[ 6] + u[ 8] - u[14] - u[16]
}:
#@ u_quad_rels
u_quad_rels := {
u[ 1]*u[ 3] + u[ 5]*u[ 7] + 4,
u[ 2]*u[ 4] + u[ 6]*u[ 8] + 4,
u[ 9]*u[11] + u[13]*u[15] + 4,
u[10]*u[12] + u[14]*u[16] + 4,
u[ 1]*u[ 7] + u[ 3]*u[ 5],
u[ 2]*u[ 8] + u[ 4]*u[ 6],
u[ 9]*u[15] + u[11]*u[13],
u[10]*u[16] + u[12]*u[14]
}:
# These additional relations depend on relations among the t[j].
#@ u_rels
u_rels[1] := 1/(u[9]*u[11]) + 1/(u[10]*u[12]) - 1/2;
u_rels[2] := u[1]*u[4]-u[4]*u[11]+u[11]*u[2]-u[2]*u[3]+u[3]*u[12]-u[12]*u[1];
u_rels[3] := (u[9]*u[11]+u[10]*u[12]-8)*(1/2+1/(u[1]*u[3])+1/(u[2]*u[4]))+2*(u[9]*u[11]-u[10]*u[12])*(1/(u[1]*u[3])-1/(u[2]*u[4]));
#@ ab_rels
ab_rels[1] := expand((b[1]+2*a[1]^2)*(b[2]-6*a[2]^2) + 4*a[1]^2*a[2]^2);
ab_rels[2] := 8*a[2]^2*b[1]-b[1]*b[2]+2*b[1]+2*b[2]+8;
ab_rels[3] := ((1+a[2]^2)*(3+2*a[1]^2+b[1])- (1+a[1]^2))^2 - (a[1]^2-3*a[2]^2-2)^2 - 4*a[1]^2*a[2]^2*(1+a[1]^2)*(1+a[2]^2);
ab_rels[4] := ((1+a[1]^2)*(1+6*a[2]^2-b[2])-3*(1+a[2]^2))^2 - (a[1]^2-3*a[2]^2-2)^2 - 4*a[1]^2*a[2]^2*(1+a[1]^2)*(1+a[2]^2);
ab_rels[5] := (1+a[1]^2)*b[2] + (1+a[2]^2)*b[1] + 4*(1 - a[1]^2*a[2]^2);
ab_rels[6] := a[1]^2 + (1/4)*b[1]*(b[1]*b[2]+6*b[1]+6*b[2]+24)/(b[1]*b[2]+2*b[1]+2*b[2]+8);
ab_rels[7] := a[2]^2 - (1/8)*(b[1]*b[2]-2*b[1]-2*b[2]-8)/b[1];
#@ extra_galois_rels
extra_galois_rels := [
tan_sum(t[1], t[3]) - 1/(1/u[1] + 1/u[3]),
tan_sum(t[2],-t[4]) - 1/(1/u[6] + 1/u[8]),
u[6]*u[8] - 2*(s[8]-1),
(u[6]-u[8])^2 - 8*(s[8]-1)*(s[7]*s[8]-1)/(s[7]*s[8]-2*s[7]+2*s[8]-1),
(u[6]+u[8])^2 - 16*(s[8]-1)^2*(s[7]+1) /(s[7]*s[8]-2*s[7]+2*s[8]-1)
];
#@ s_to_t
s_to_t := {seq(s[i]=st[i],i=1..16),seq(u[i]=ut[i],i=1..16)}:
#@ t_to_xyz
t_to_xyz := {seq(t[i]=tx[i],i=1..4),seq(s[i]=sx[i],i=1..16),seq(u[i]=ux[i],i=1..16),r[1]=ry[1],r[2]=ry[2]}:
#@ t_reduce
t_reduce := (a) -> FNF_y0(factor(subs(root_rule,expand(rationalize(simplify(a))))));
#@ t_xyz_reduce
t_xyz_reduce := (a) -> t_reduce(subs(t_to_xyz,a));
# SNB is a basis for KT over R(s[7],s[8]).
# The function VNB converts its argument to the list of coefficients with respect to the basis SNB
#@ SNB
SNB := [seq(seq(seq(seq(seq(s[1]^i*s[2]^j*s[3]^k*t[1]^l*t[2]^m,m=0..1),l=0..1),k=0..1),j=0..1),i=0..1)];
#@ VNB
VNB := (u) -> [seq(seq(seq(seq(seq(
coeff(coeff(coeff(coeff(coeff(u,
s[1],i),s[2],j),s[3],k),t[1],l),t[2],m),
m=0..1),l=0..1),k=0..1),j=0..1),i=0..1)];
# The following relations can be used to express things in terms of SNB
#@ sn_rels
sn_rels[1] := s[1]^2 - ((2*(3*s[7]*s[8]+2*s[7]-2*s[8]-3))/(s[7]*s[8]+2*s[7]-2*s[8]-1))*s[1] + 1:
sn_rels[2] := s[2]^2 - ((2*(3*s[7]*s[8]-2*s[7]+2*s[8]-3))/(s[7]*s[8]-2*s[7]+2*s[8]-1))*s[2] + 1:
sn_rels[3] := s[3]^2 - 2*s[7]*s[3] + 1:
sn_rels[4] := s[4] - ((1/8)*(s[1]*s[2]*s[3]*s[7]^2*s[8]^2-s[1]*s[2]*s[7]^3*s[8]^2-3*s[1]*s[3]*s[7]^2*s[8]^2+3*s[1]*s[7]^3*s[8]^2-3*s[2]*s[3]*s[7]^2*s[8]^2+3*s[2]*s[7]^3*s[8]^2-4*s[1]*s[2]*s[3]*s[7]^2+6*s[1]*s[2]*s[3]*s[7]*s[8]-4*s[1]*s[2]*s[3]*s[8]^2+4*s[1]*s[2]*s[7]^3-6*s[1]*s[2]*s[7]^2*s[8]+4*s[1]*s[2]*s[7]*s[8]^2-4*s[1]*s[3]*s[7]^2*s[8]+4*s[1]*s[3]*s[7]*s[8]^2+4*s[1]*s[7]^3*s[8]-4*s[1]*s[7]^2*s[8]^2+4*s[2]*s[3]*s[7]^2*s[8]-4*s[2]*s[3]*s[7]*s[8]^2-4*s[2]*s[7]^3*s[8]+4*s[2]*s[7]^2*s[8]^2+9*s[3]*s[7]^2*s[8]^2-s[7]^3*s[8]^2+4*s[1]*s[3]*s[7]^2-2*s[1]*s[3]*s[7]*s[8]+4*s[1]*s[3]*s[8]^2-4*s[1]*s[7]^3+2*s[1]*s[7]^2*s[8]-4*s[1]*s[7]*s[8]^2+4*s[2]*s[3]*s[7]^2-2*s[2]*s[3]*s[7]*s[8]+4*s[2]*s[3]*s[8]^2-4*s[2]*s[7]^3+2*s[2]*s[7]^2*s[8]-4*s[2]*s[7]*s[8]^2+s[1]*s[2]*s[3]-s[1]*s[2]*s[7]+4*s[1]*s[3]*s[7]-4*s[1]*s[3]*s[8]-4*s[1]*s[7]^2+4*s[1]*s[7]*s[8]-4*s[2]*s[3]*s[7]+4*s[2]*s[3]*s[8]+4*s[2]*s[7]^2-4*s[2]*s[7]*s[8]-4*s[3]*s[7]^2-10*s[3]*s[7]*s[8]-4*s[3]*s[8]^2+4*s[7]^3+2*s[7]^2*s[8]-4*s[7]*s[8]^2-3*s[1]*s[3]+3*s[1]*s[7]-3*s[2]*s[3]+3*s[2]*s[7]+9*s[3]-9*s[7]+8*s[8])/((s[7]-1)*(s[7]+1)*(s[7]*s[8]-1))):
sn_rels[5] := t[1]^2 - s[1]*(2*s[7] - s[3]):
sn_rels[6] := t[2]^2-((1/8)*(-3*s[1]*s[2]*s[3]*s[7]^2*s[8]^2+3*s[1]*s[2]*s[7]^3*s[8]^2-4*s[1]*s[2]*s[3]*s[7]^2*s[8]+4*s[1]*s[2]*s[3]*s[7]*s[8]^2+4*s[1]*s[2]*s[7]^3*s[8]-4*s[1]*s[2]*s[7]^2*s[8]^2+s[1]*s[3]*s[7]^2*s[8]^2-s[1]*s[7]^3*s[8]^2+9*s[2]*s[3]*s[7]^2*s[8]^2-s[2]*s[7]^3*s[8]^2+4*s[1]*s[2]*s[3]*s[7]^2-2*s[1]*s[2]*s[3]*s[7]*s[8]+4*s[1]*s[2]*s[3]*s[8]^2-4*s[1]*s[2]*s[7]^3+2*s[1]*s[2]*s[7]^2*s[8]-4*s[1]*s[2]*s[7]*s[8]^2-3*s[3]*s[7]^2*s[8]^2+3*s[7]^3*s[8]^2+4*s[1]*s[2]*s[3]*s[7]-4*s[1]*s[2]*s[3]*s[8]-4*s[1]*s[2]*s[7]^2+4*s[1]*s[2]*s[7]*s[8]-4*s[1]*s[3]*s[7]^2+6*s[1]*s[3]*s[7]*s[8]-4*s[1]*s[3]*s[8]^2+4*s[1]*s[7]^3-6*s[1]*s[7]^2*s[8]+4*s[1]*s[7]*s[8]^2-4*s[2]*s[3]*s[7]^2-10*s[2]*s[3]*s[7]*s[8]-4*s[2]*s[3]*s[8]^2+4*s[2]*s[7]^3+2*s[2]*s[7]^2*s[8]-4*s[2]*s[7]*s[8]^2+4*s[3]*s[7]^2*s[8]-4*s[3]*s[7]*s[8]^2-4*s[7]^3*s[8]+4*s[7]^2*s[8]^2-3*s[1]*s[2]*s[3]+3*s[1]*s[2]*s[7]+4*s[3]*s[7]^2-2*s[3]*s[7]*s[8]+4*s[3]*s[8]^2-4*s[7]^3+2*s[7]^2*s[8]-4*s[7]*s[8]^2+s[1]*s[3]-s[1]*s[7]+9*s[2]*s[3]-9*s[2]*s[7]+8*s[2]*s[8]-4*s[3]*s[7]+4*s[3]*s[8]+4*s[7]^2-4*s[7]*s[8]-3*s[3]+3*s[7])/((s[7]-1)*(s[7]+1)*(s[7]*s[8]-1))):
sn_rels[7] := t[3] - t[1]*s[3]:
sn_rels[8] := t[4] - ((1/8)*t[2]*(s[1]*s[2]*s[3]*s[7]^2*s[8]^2-s[1]*s[2]*s[7]^3*s[8]^2-3*s[1]*s[3]*s[7]^2*s[8]^2+3*s[1]*s[7]^3*s[8]^2-3*s[2]*s[3]*s[7]^2*s[8]^2+3*s[2]*s[7]^3*s[8]^2-4*s[1]*s[2]*s[3]*s[7]^2+6*s[1]*s[2]*s[3]*s[7]*s[8]-4*s[1]*s[2]*s[3]*s[8]^2+4*s[1]*s[2]*s[7]^3-6*s[1]*s[2]*s[7]^2*s[8]+4*s[1]*s[2]*s[7]*s[8]^2-4*s[1]*s[3]*s[7]^2*s[8]+4*s[1]*s[3]*s[7]*s[8]^2+4*s[1]*s[7]^3*s[8]-4*s[1]*s[7]^2*s[8]^2+4*s[2]*s[3]*s[7]^2*s[8]-4*s[2]*s[3]*s[7]*s[8]^2-4*s[2]*s[7]^3*s[8]+4*s[2]*s[7]^2*s[8]^2+9*s[3]*s[7]^2*s[8]^2-s[7]^3*s[8]^2+4*s[1]*s[3]*s[7]^2-2*s[1]*s[3]*s[7]*s[8]+4*s[1]*s[3]*s[8]^2-4*s[1]*s[7]^3+2*s[1]*s[7]^2*s[8]-4*s[1]*s[7]*s[8]^2+4*s[2]*s[3]*s[7]^2-2*s[2]*s[3]*s[7]*s[8]+4*s[2]*s[3]*s[8]^2-4*s[2]*s[7]^3+2*s[2]*s[7]^2*s[8]-4*s[2]*s[7]*s[8]^2+s[1]*s[2]*s[3]-s[1]*s[2]*s[7]+4*s[1]*s[3]*s[7]-4*s[1]*s[3]*s[8]-4*s[1]*s[7]^2+4*s[1]*s[7]*s[8]-4*s[2]*s[3]*s[7]+4*s[2]*s[3]*s[8]+4*s[2]*s[7]^2-4*s[2]*s[7]*s[8]-4*s[3]*s[7]^2-10*s[3]*s[7]*s[8]-4*s[3]*s[8]^2+4*s[7]^3+2*s[7]^2*s[8]-4*s[7]*s[8]^2-3*s[1]*s[3]+3*s[1]*s[7]-3*s[2]*s[3]+3*s[2]*s[7]+9*s[3]-9*s[7]+8*s[8])/((s[7]-1)*(s[7]+1)*(s[7]*s[8]-1))):
# This is a basis for KT over R(z[1],z[2])
#@ BXYR
BXYR := [seq(seq(seq(seq(seq(seq(
x[1]^i*x[2]^j*y[1]^k*y[2]^l*r[1]^m*r[2]^n,
i=0..1),j=0..1),k=0..1),l=0..1),m=0..1),n=0..1)];
# The action of G[64] on KT preserves the above basis up to sign, with orbits as follows.
# These are enumerated so that the first 16 orbits have size one, and the actions on these
# orbits give the 16 one-dimensional characters of G[64]. The remaining 24 orbits all have
# size two, and so give two-dimensional characters of G[64]. These are all irreducible, and
# each character occurs twice. Orbits with the same character are adjacent in the list.
#@ BXYR_orbits
BXYR_orbits := [
seq(seq(seq(seq([y[2]^i*y[1]^j*(x[1]*x[2])^k*(r[1]*r[2])^l],i=0..1),j=0..1),k=0..1),l=0..1),
seq(seq(seq(y[2]^i*y[1]^j*(r[1]*r[2])^l*~[x[1],x[2]],i=0..1),j=0..1),l=0..1),
seq(seq(seq(y[2]^i*y[1]^j*(x[1]*x[2])^l*~[r[1],r[2]],i=0..1),j=0..1),l=0..1),
seq(seq(y[2]^i*y[1]^j*~[r[1]*x[1],r[2]*x[2]],i=0..1),j=0..1),
seq(seq(y[2]^i*y[1]^j*~[r[1]*x[2],r[2]*x[1]],i=0..1),j=0..1)
];
# Characters of G64
#@ orb_char
orb_char := proc(o)
local c,T,eqs1,eqs2,sol1,sol2,p,q;
if nops(o) = 1 then
return map(T -> factor(act_AT[T](o[1])/o[1]),G64);
fi;
c := [];
for T in G64 do
eqs1 := {coeffs(act_AT[T](o[1]) - p * o[1] - q*o[2],{x[1],x[2],y[1],y[2],r[1],r[2]})};
eqs2 := {coeffs(act_AT[T](o[2]) - p * o[1] - q*o[2],{x[1],x[2],y[1],y[2],r[1],r[2]})};
sol1 := solve(eqs1,{p,q});
sol2 := solve(eqs2,{p,q});
c := [op(c),subs(sol1,p) + subs(sol2,q)];
od;
return c;
end:
#@ BXYR_chars
BXYR_chars := map(orb_char,BXYR_orbits):
#@ G64_chars
G64_chars := [
seq(BXYR_chars[i],i=1..16),
seq(BXYR_chars[16+2*i],i=1..12)
];
#@ iso_AT
iso_AT := (a,i) -> add(act_AT[G64[j]](a) * G64_chars[i][j] * G64_chars[i][1]/64,j = 1..64);
galois_check_zero := proc(a,n_)
local n,x0,y0,z0,t0,s0,r0,u0;
n := `if`(nargs > 1, n_, 26);
x0 := inner_quasirational_points[n];
y0 := combine(simplify(y_proj0(x0)));
z0 := y0 ^~ 2;
t0 := combine(simplify(expand(E_to_TTP(x0))));
s0 := combine(simplify(expand(rationalize(eval(subs(t = t0,[seq(st[i],i=1..16)]))))));
u0 := combine(simplify(expand(rationalize(eval(subs(t = t0,[seq(ut[i],i=1..16)]))))));
r0[1] := combine(simplify(expand(sqrt(1 - y0[2]/sqrt(2)))));
r0[2] := combine(simplify(expand(sqrt(1 + y0[2]/sqrt(2)))));
return evalb(combine(simplify(eval(subs({x=x0,y=y0,z=z0,t=t0,s=s0,r=r0,u=u0},a)))) = 0);
end: