# The functions y_1 and y_2 generate the ring of invariants on X for
#@ yx
yx[1] := x[3];
yx[2] := (x[2]^2 - x[1]^2 - (a_E+1/a_E)*x[3]*x[4])/(2*a_E);
# u_i is an expression for x_i^2 in terms of y_1 and y_2
#@ uy
uy[1] := (1-2*a_E*y[2])/2 - (y[2]-a_E)*(y[2]-1/a_E)*y[1]^2/2;
uy[2] := (1+2*a_E*y[2])/2 - (y[2]+a_E)*(y[2]+1/a_E)*y[1]^2/2;
# xy[i] is an expression for x[i] in terms of y[1] and y[2], valid when x[1],x[2] >= 0
#@ xy
xy[1] := sqrt(uy[1]);
xy[2] := sqrt(uy[2]);
xy[3] := y[1];
xy[4] := - y[1] * y[2];
# u_3 is an expression for 4 x_1^2 x_2^2, and u_3 is an expression for x_1^2 + x_2^2
#@ uz
uz[3] := (1 - z[1] - z[1]*z[2])^2 - z[2] * ((a_E+1/a_E)*z[1]-2*a_E)^2;
uz[4] := 1 - z[1] - z[1]*z[2];
#@ uf
uf[1] := unapply(uy[1],y);
uf[2] := unapply(uy[2],y);
# The functions z_1 and z_2 generate the ring of invariants on X for G
#@ zy
zy[1] := y[1]^2;
zy[2] := y[2]^2;
#@ zx
zx[1] := yx[1]^2;
zx[2] := yx[2]^2;
#@ yz
yz[1] := sqrt(z[1]);
yz[2] := sqrt(z[2]);
# Some additional invariant functions
#@ zx
zx[3] := x[1]^2 + x[2]^2;
zx[4] := x[4]^2;
zx[5] := (x[2]^2-x[1]^2)*x[3]*x[4]-(a_E+1/a_E)*x[3]^2*x[4]^2;
# The functions w_1 and w_2 give a homeomorphism X/G -> [0,1]^2
#@ wz
wz[1] := z[1]*(1+(a_E+1/a_E)*sqrt(z[2])+z[2])/(1+2*a_E*sqrt(z[2]));
wz[2] := sqrt(z[2])*(2*a_E*(1-z[1])+z[1]*sqrt(z[2]))/(1-z[1]+(1/a_E-a_E)*z[1]*sqrt(z[2]));
#@ wy
#@ wx
for i from 1 to 2 do
# wy[i] := subs({z[1]=y[1]^2,z[2]=y[2]^2},subs(sqrt(z[2]) = abs(y[2]),wz[i]));
wy[i] := subs({z[1]=y[1]^2,z[2]=y[2]^2},wz[i]);
wx[i] := subs({y[1]=yx[1],y[2]=yx[2]},wy[i]);
od:
# Gradient operators
grad_x := (u) -> add(diff(u,x[i]) * dx[i],i=1..4); #@ grad_x
grad_y := (u) -> add(diff(u,y[i]) * dy[i],i=1..2); #@ grad_y
grad_z := (u) -> add(diff(u,z[i]) * dz[i],i=1..2); #@ grad_z
#@ dyx
#@ dzx
#@ dzy
#@ dyz
for i from 1 to 2 do
dyx[i] := grad_x(yx[i]);
dzx[i] := grad_x(zx[i]);
dzy[i] := grad_y(zy[i]);
dyz[i] := grad_z(yz[i]);
od:
#@ dxy
for i from 1 to 4 do
dxy[i] := grad_y(xy[i]);
od:
#@ dzx
for i from 3 to 5 do # i = 1 to 2 already done
dzx[i] := grad_x(zx[i]);
od:
# Projections from EX(a) to the y-plane and the z-plane
y_proj := unapply([seq(yx[i],i=1..2)],x); #@ y_proj
z_proj := unapply([seq(zx[i],i=1..2)],x); #@ z_proj
# Sections of y_proj and z_proj
y_lift := (y) -> [sqrt(uf[1](y)),sqrt(uf[2](y)),y[1],-y[1]*y[2]]; #@ y_lift
z_lift := (z) -> y_lift([sqrt(z[1]),sqrt(z[2])]); #@ z_lift
######################################################################
# Various Grobner bases
x_vars := lexdeg([z[1],z[2]],[y[1],y[2]],[x[1],x[2],x[3],x[4]]); #@ x_vars
y_vars := lexdeg([x[1],x[2],x[3],x[4]],[z[1],z[2]],[y[1],y[2]]); #@ y_vars
z_vars := lexdeg([x[1],x[2],x[3],x[4]],[y[1],y[2]],[z[1],z[2]]); #@ z_vars
#@ x_rels
x_rels := Basis(
expand([y[1]-yx[1],y[2]-yx[2],
z[1]-zx[1],z[2]-zx[2],
rho(xx)-1,g(xx)] *~ a_E^4),
x_vars
);
#@ y_rels
y_rels := Basis(
expand([z[1]-zy[1],z[2]-zy[2],
y[1]-yx[1],y[2]-yx[2],
x[1]^2-uy[1],x[2]^2-uy[2],
x[4]+y[1]*y[2]] *~ a_E^4),
y_vars
);
#@ z_rels
z_rels := Basis([op(y_rels),z[1]-zy[1],z[2]-zy[2]],z_vars);
# NF_x(u) rewrites u in terms of x[1],...,x[4]
# NF_y(u) rewrites u as a linear combination of {1,x[1],x[2],x[1]*x[2]}
# over R[y[1],y[2]].
# NF_z(u) rewrites u as a linear combination of
# {x[1]^i*x[2]^j*y[1]^k*y[2]^l | 0 <= i,j,k,l <= 1}
# over R[z[1],z[2]].
NF_x := (u) -> NormalForm(u,x_rels,x_vars); #@ NF_x
NF_y := (u) -> NormalForm(u,y_rels,y_vars); #@ NF_y
NF_z := (u) -> NormalForm(u,z_rels,z_vars); #@ NF_z
# List of monomials in x[1],..,x[4] that are reduced wrt the Grobner
# basis x_rels. This relies on the fact that the leading monomials
# for the elements of the Grobner basis are x[4]^2, x[3]^2*x[4] and
# x[3]^4.
#@ x_reduced_basis
x_reduced_basis := proc(d)
local i1,i2,i3,i4;
[seq(seq(seq(seq(x[1]^i1*x[2]^i2*x[3]^i3*x[4]^i4,
i4=0..min(d-i1-i2-i3,1-floor(i3/2))),
i3=0..min(d-i1-i2,3)),
i2=0..d-i1),
i1=0..d)];
end:
######################################################################
# Action on the ring of polynomial functions on R4
#@ act_A_rule
#@ act_A
#@ R4_matrix
for T in G16 do
act_A_rule[T] := {seq(x[i] = act_R4[G_inv(T)](xx)[i],i=1..4)};
act_A_rule[T] := {op(act_A_rule[T]),op(subs(x=dx,act_A_rule[T]))};
act_A[T] := (u) -> subs(act_A_rule[T],u);
act_A_rule[T] := {op(act_A_rule[T]),
seq(y[i] = factor(act_A[T](yx[i])/yx[i]) * y[i],i = 1..2),
seq(dy[i] = factor(act_A[T](yx[i])/yx[i]) * dy[i],i = 1..2)
};
act_A[T] := (u) -> subs(act_A_rule[T],u);
R4_matrix[T] := Matrix([seq([seq(coeff(act_R4[T](xx)[i],x[j],1),j=1..4)],i=1..4)]);
od:
# For some reason we had trouble making the definitions below in a loop
act_A[1] := (u) -> subs(act_A_rule[1],u):
act_A[L] := (u) -> subs(act_A_rule[L],u):
act_A[LL] := (u) -> subs(act_A_rule[LL],u):
act_A[LLL] := (u) -> subs(act_A_rule[LLL],u):
act_A[M] := (u) -> subs(act_A_rule[M],u):
act_A[LM] := (u) -> subs(act_A_rule[LM],u):
act_A[LLM] := (u) -> subs(act_A_rule[LLM],u):
act_A[LLLM] := (u) -> subs(act_A_rule[LLLM],u):
act_A[N] := (u) -> subs(act_A_rule[N],u):
act_A[LN] := (u) -> subs(act_A_rule[LN],u):
act_A[LLN] := (u) -> subs(act_A_rule[LLN],u):
act_A[LLLN] := (u) -> subs(act_A_rule[LLLN],u):
act_A[MN] := (u) -> subs(act_A_rule[MN],u):
act_A[LMN] := (u) -> subs(act_A_rule[LMN],u):
act_A[LLMN] := (u) -> subs(act_A_rule[LLMN],u):
act_A[LLLMN] := (u) -> subs(act_A_rule[LLLMN],u):
#@ check_char
check_char := proc(u)
local Q,i;
Q := [seq(factor(act_A[T](u)/u),T in G16)];
for i from 0 to 7 do
if Q = [seq(character[i][T],T in G16)] then
return i;
fi;
od;
return FAIL;
end:
#@ G16_average
G16_average := (u) -> add(act_A[T](u),T in G16)/16;
#@ G16_twisted_average
G16_twisted_average := (k,u) -> add(character[k][T] * act_A[T](u),T in G16)/16;
# Action of G on the y-plane
#@ act_hex
act_hex[1] := (y) -> [ y[1], y[2]];
act_hex[L] := (y) -> [ y[1],-y[2]];
act_hex[LL] := (y) -> [ y[1], y[2]];
act_hex[LLL] := (y) -> [ y[1],-y[2]];
act_hex[M] := (y) -> [-y[1], y[2]];
act_hex[LM] := (y) -> [-y[1],-y[2]];
act_hex[LLM] := (y) -> [-y[1], y[2]];
act_hex[LLLM] := (y) -> [-y[1],-y[2]];
act_hex[N] := (y) -> [ y[1], y[2]];
act_hex[LN] := (y) -> [ y[1],-y[2]];
act_hex[LLN] := (y) -> [ y[1], y[2]];
act_hex[LLLN] := (y) -> [ y[1],-y[2]];
act_hex[MN] := (y) -> [-y[1], y[2]];
act_hex[LMN] := (y) -> [-y[1],-y[2]];
act_hex[LLMN] := (y) -> [-y[1], y[2]];
act_hex[LLLMN]:= (y) -> [-y[1],-y[2]];
# Invariants for the action twisted by a linear character (as listed in group.mpl)
# These twisted invariants form a module over the ring of untwisted
# invariants, with generators as listed below.
#@ twisted_invariant
twisted_invariant[0] := 1;
twisted_invariant[1] := yx[2];
twisted_invariant[2] := yx[1];
twisted_invariant[3] := yx[1]*yx[2];
twisted_invariant[4] := x[1]*x[2]:
twisted_invariant[5] := x[1]*x[2]*yx[2]:
twisted_invariant[6] := x[1]*x[2]*yx[1]:
twisted_invariant[7] := x[1]*x[2]*yx[1]*yx[2]:
######################################################################
#@ square_norm_of_dg_z
square_norm_of_dg_z := (z) ->
(1+z[2])*(((1/a_E^2-1)*z[1])^2+(2/a_E^2-8)*z[1]+4)+
(1-z[2])*z[1]*2*(2-1/a_E^2);
#@ curvature_z
curvature_z := (z) ->
1 - 16*(1/a_E^2+(3*a_E^2-1)^2/(4*a_E^6)*z[1]^2-4*z[2]
-(3*a_E^2-1)/a_E^4*z[1]+4*(a_E^(-2)-1)*z[1]*z[2]
+4*(2-a_E^(-2))*z[1]^2*z[2]^2+(3+4*a_E^(-2)-3*a_E^(-4))*z[1]^2*z[2])/
square_norm_of_dg_z(z)^2;
######################################################################
#@ z_to_w
z_to_w := unapply([wz[1],wz[2]],z);
# The map z_to_w involves quotients of functions that are visibly
# continuous. One denominator vanishes at the point z = [1,0].
# The function below is the unique continuous extension.
#@ z_to_wa
z_to_wa := proc(z)
if z[1] = 1 and z[2] = 0 then return([1,0]) else return(z_to_w(z)); fi;
end:
w_proj := unapply(z_to_w(zx),x): #@ w_proj
w_proja := (x) -> z_to_wa(z_proj(x)): #@ w_proj_a
y_to_w := (y) -> z_to_w([y[1]^2,y[2]^2]); #@ y_to_w
# To find y with y |-> w we first solve p_0(y[2])/p_1(y[2]) = w[2] (where p_0 and p_1
# are as defined below),
#@ w_to_y_p_0
w_to_y_p_0 := (t,w1) -> t*((1+w1)*t^2+(1/a_E+a_E+(1/2/a_E-2*a_E)*w1)*t+(1-w1));
#@ w_to_y_p_1
w_to_y_p_1 := (t,w1) -> (1/2/a_E+w1*(1/a_E-a_E))*t^2 + 1/2*((1/a_E^2-1)*(1+w1)+2*(1-w1))*t + 1/2/a_E*(1-w1);
#@ w_to_y_p
w_to_y_p := (t,w1) -> w_to_y_p_0(t,w1)/w_to_y_p_1(t,w1);
#@ w_to_y_q
w_to_y_q := (t,w1,w2) -> w2 * w_to_y_p_1(t,w1) - w_to_y_p_0(t,w1);
#@ w_to_y_y_1
w_to_y_y_1 := (w1,y2) -> sqrt(w1*(1+2*a_E*y2)/((y2+1/a_E)*(y2+a_E)));
# Coefficients of t in the numerator of the derivative of w_to_y_p.
#@ w_to_y_dpc[0]
w_to_y_dpc[0] := (1-w1)^2/(2*a_E);
#@ w_to_y_dpc[1]
w_to_y_dpc[1] := (1-w1)*((3/2/a_E^2-1)*w1+(1/a_E^2+1)*(1-w1));
#@ w_to_y_dpc[2]
w_to_y_dpc[2] := (1-a_E^2)/a_E^3*(1-w1)/2 +
(1-a_E^2)*(3/2-a_E^2)/a_E^3*w1^2 +
(1+2*a_E^2)*(5-a_E^2)/4/a_E^3*w1*(1-w1) +
(5+a_E^2)/2/a_E*(1-w1)^2;
#@ w_to_y_dpc[3]
w_to_y_dpc[3] := (1+w1)/a_E^2*(2*(1-a_E^2)*w1+(1+a_E^2)*(1-w1));
#@ w_to_y_dpc[4]
w_to_y_dpc[4] := (1+w1)*(1+2*(1-a_E^2)*w1)/(2*a_E);
#@ w_to_y1
w_to_y1 := proc(w)
option remember;
local p,t,tt,y1,y2;
p := subs(a_E=a_E1,w_to_y_q(t,w[1],w[2]));
tt := select(t -> (t^2 <= 1/a_E1-a_E1),[fsolve(p=0,t)]);
if tt = [] then return [FAIL,tt]; fi;
y2 := max(0,op(tt));
y1 := evalf(subs(a_E=a_E1,w_to_y_y_1(w[1],y2)));
return([y1,y2]);
end:
#@ w_lift1
w_lift1 := (w) -> map(Re,evalf(subs(a_E=a_E1,y_lift(w_to_y1(w)))));
protect('uf','uz','wy','wz','xy','yx','yz','zx','zy','dxy','dyx','dyz','dzx','dzx','dzy');