# Our primary approach to understanding the canonical map p : EX^* -> S^2 goes
# via hyperbolic uniformisation using the E_to_S_map class. The code in this
# file represents an attempt to understand p, or maps similar to p, by more
# direct and elementary means. The file sphere_quotients.mpl defines a map
# E_to_S2 : EX^* -> S^2 which has the expected equivariance and which induces
# a homeomorphism EX^*/<1,LL> -> S^2, but it fails quite badly to be conformal.
# Here we study maps which may be slightly better.
######################################################################
# The following function checks whether a map S : EX^* -> R^3 is equivariant,
# sends v[0], v[3] and v[6] to the right places, and is tangent to S^2
# at those points.
#@ map_to_S2_basic_test
map_to_S2_basic_test := proc(S)
local i,m,err;
if evalf(simplify(S(act_E[L](x)) -~ act_S2[L](S(x)))) <> [0. $3] then return false; fi;
if evalf(simplify(S(act_E[M](x)) -~ act_S2[M](S(x)))) <> [0. $3] then return false; fi;
if evalf(simplify(S(act_E[N](x)) -~ act_S2[N](S(x)))) <> [0. $3] then return false; fi;
if evalf(S(v_E0[3]) -~ v_S2[3]) <> [0. $3] then return false; fi;
if evalf(S(v_E0[6]) -~ v_S2[6]) <> [0. $3] then return false; fi;
for i in {0,3,6} do
if evalf(simplify(S(v_E0[i]) -~ v_S2[i])) <> [0. $3] then return false; fi;
m := `if`(i = 0,3,2);
err := evalf(simplify(convert(series(nm3(S(chart[0](e*s,e*t)))^2-1,e=0,m),polynom,e)));
if err <> 0. then return false; fi;
od;
true;
end:
# The following functions check whether a map S behaves conformally to the
# lowest relevant order at v[0], v[3], v[6] or v[11]. Each function returns
# a list of terms which should be zero.
#@ v0_conformal_test
v0_conformal_test := proc(S)
local aa,bb,cc,yy,zz,e,s,t;
yy := map(series,S(chart[0](e*s,e*t)),e=0,3);
yy := map(convert,yy,polynom,e);
zz := S2_to_C(yy);
zz := series(zz,e=0,3);
zz := subs(e=1,convert(zz,polynom,e));
aa := coeff(zz,s,2);
bb := coeff(coeff(zz,s,1),t,1);
cc := coeff(zz,t,2);
expand([aa+cc,(bb-2*I*aa)/I]);
end:
#@ v3_conformal_test
v3_conformal_test := proc(S)
local aa,bb,yy,zz,e,s,t;
yy := map(series,S(chart[3](e*s,e*t)),e=0,2);
yy := map(convert,yy,polynom,e);
zz := S2_to_C(yy);
zz := series(zz,e=0,2);
zz := subs(e=1,convert(zz,polynom,e));
aa := coeff(zz,s,1);
bb := coeff(zz,t,1);
expand(bb - I*aa);
end:
#@ v6_conformal_test
v6_conformal_test := proc(S)
local aa,bb,yy,zz,e,s,t;
yy := map(series,S(chart[6](e*s,e*t)),e=0,2);
yy := map(convert,yy,polynom,e);
zz := S2_to_C(yy);
zz := series(zz,e=0,2);
zz := subs(e=1,convert(zz,polynom,e));
aa := coeff(zz,s,1);
bb := coeff(zz,t,1);
expand((bb - I*aa)*(1+I)/sqrt(2));
end:
#@ v11_conformal_test
v11_conformal_test := proc(S)
local aa,bb,cc,dd,yy,e,s,t;
yy := map(series,S(chart[11](e*s,e*t)),e=0,2);
yy := map(convert,yy,polynom,e);
aa := subs(e=0,yy);
if map(coeff,yy,e,1) <> [0$3] then return FAIL; fi;
yy := subs(e = 1,yy -~ aa);
bb := map(coeff,yy,s,2);
cc := map(coeff,map(coeff,yy,s,1),t,1);
dd := map(coeff,yy,t,2);
expand([op(bb+~dd),dp3(aa,bb),dp3(aa,cc),dp3(bb,cc),dp3(aa,aa)-1]);
end:
# One can show that the map must be as follows, for some undetermined
# functions Pi and Qj.
#@ s2p_core
s2p_core := [
(x[2]^2-x[1]^2-(3/sqrt(2))*x[3]*x[4]),
2*x[1]*x[2],
-x[3]
]:
#@ s2p_multipliers
s2p_multipliers := [
(1+z[1]*P1(z[1])+(z[2]-1/2)*Q1(z[1],z[2])),
(1+z[1]*P2(z[1])+z[2]*Q2(z[1],z[2])),
(3/2-z[1]/2+(z[1]-1)^2*P3(z[1])+z[2]*Q3(z[1],z[2]))
]:
#@ s2p_pattern
s2p_pattern := s2p_core *~ s2p_multipliers;
#@ s2p_generic
s2p_generic := unapply(eval(subs(z=zx0,s2p_pattern)),x);
# Taking the functions Pi and Qj to be affine, we get the following pattern:
#@ s2p_poly_multipliers
s2p_poly_multipliers := subs({
P1(z[1]) = C[0] + C[1]*z[1],
P2(z[1]) = C[2] + C[3]*z[1],
P3(z[1]) = C[4] + C[5]*z[1],
Q1(z[1],z[2]) = C[6] + C[7]*z[1] + C[8]*z[2],
Q2(z[1],z[2]) = C[9] + C[10]*z[1] + C[11]*z[2],
Q3(z[1],z[2]) = C[12] + C[13]*z[1] + C[14]*z[2]
},s2p_multipliers
):
#@ s2p_poly_pattern
s2p_poly_pattern := s2p_core *~ s2p_poly_multipliers;
#@ s2p_poly
s2p_poly := unapply(eval(subs(z=zx0,s2p_poly_pattern)),x):
#@ s2p_conformal_poly_rels
s2p_conformal_poly_rels := {
C[6]=1/2-C[4],
C[7]=-C[2]-C[3]+1/2+2*C[0]+2*C[1]+C[4],
C[14] = -(1/3*(2*sqrt(6)*C[4]+sqrt(6)*C[12]+3*sqrt(6)-6*C[9]-3*C[11]-12))*sqrt(6)
};
#@ s2p_conformal_poly_multipliers
s2p_conformal_poly_multipliers :=
simplify(expand(subs(s2p_conformal_poly_rels,s2p_poly_multipliers)));
#@ s2p_conformal_poly_pattern
s2p_conformal_poly_pattern := s2p_core *~ s2p_conformal_poly_multipliers;
#@ s2p_conformal_poly
s2p_conformal_poly := unapply(eval(subs(z=zx0,s2p_conformal_poly_pattern)),x):
# Here are some numerical choices for the coefficients C[i], which
# give a reasonable map.
#@ s2p_approx
s2p_approx := {
C[0] = -1.6723,C[1] = 0.80475,C[2] = -1.3774,C[3] = 1.0570,C[4] = 0.60044,
C[5] = -0.35384,C[8] = -0.49899,C[9] = -0.41948,C[10] = 0.28319,
C[11] = -0.037759,C[12] = -0.53453,C[13] = 0.53090
}:
#@ s2p0_multipliers
s2p0_multipliers := evalf(subs(s2p_approx,s2p_conformal_poly_multipliers));
#@ s2p0_pattern
s2p0_pattern := evalf(s2p_core *~ s2p0_multipliers);
#@ s2p0
s2p0 := unapply(eval(subs(z=zx0,s2p0_pattern)),x):
# The following code calculates the Dirichlet energy of a map EX^* -> S^2,
# as a map EX^* -> R. This then needs to be integrated.
#@ find_E_to_S_energy_coeff
#@ E_to_S_energy_denom
#@ E_to_S_energy_coeff
#@ E_to_S_energy_coeff_string
find_E_to_S_energy_coeff := proc()
global E_to_S_energy_denom,E_to_S_energy_coeff,E_to_S_energy_coeff_string;
local i,j,k,s,u_vars,U,UU,PP,nn,sndg,E0,E1,E2,En,En_alt,DP;
UU := [seq(U[k](zx0[1],zx0[2]),k=1..3)];
PP := UU *~ s2p_core;
u_vars := [u[1],u[2],u[3],du[1,1],du[1,2],du[2,1],du[2,2],du[3,1],du[3,3]];
nn := dg0(xx);
sndg := square_norm_of_dg_z0(z);
for k from 1 to 3 do
for i from 1 to 4 do
DP[k,i] := subs({U[1](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[1],
U[2](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[2],
U[3](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[3],
(D[1](U[1]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[1,1],
(D[2](U[1]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[1,2],
(D[1](U[2]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[2,1],
(D[2](U[2]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[2,2],
(D[1](U[3]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[3,1],
(D[2](U[3]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[3,2]
},diff(PP[k],x[i]));
od;
od;
E0 := collect(NF_z0(add(add(DP[k,i]^2,i=1..4),k=1..3)),u_vars);
E1 := collect(NF_z0(add(add(add(DP[k,i]*DP[k,j]*x[i]*x[j],j=1..4),i=1..4),k=1..3)),u_vars);
E2 := collect(NF_z0(add(add(add(DP[k,i]*DP[k,j]*nn[i]*nn[j],j=1..4),i=1..4),k=1..3)),u_vars);
En := collect(expand(sndg*(E0-E1) - E2),u_vars);
E_to_S_energy_denom := sndg;
E_to_S_energy_coeff := table():
for k from 1 to 3 do
E_to_S_energy_coeff[k] := factor(coeff(En,u[k],2));
for i from 1 to 2 do
E_to_S_energy_coeff[k,i] := factor(coeff(coeff(En,u[k],1),du[k,i],1));
for j from 1 to 2 do
if i <> j then
E_to_S_energy_coeff[k,i,j] := factor(coeff(coeff(En,du[k,i],1),du[k,j],1));
else
E_to_S_energy_coeff[k,i,j] := factor(coeff(En,du[k,i],2));
fi;
od;
od;
od:
En_alt :=
add(E_to_S_energy_coeff[k] * u[k]^2,k=1..3) +
add(add(E_to_S_energy_coeff[k,i] * u[k] * du[k,i],i=1..2),k=1..3) +
add(add(E_to_S_energy_coeff[k,i,i] * du[k,i]^2,i=1..2),k=1..3) +
add(E_to_S_energy_coeff[k,1,2] * du[k,1] * du[k,2],k=1..3);
print(["check",expand(En - En_alt)]);
s := sprintf("E_to_S_energy_denom := %A;\n",sndg):
for k from 1 to 3 do
s := cat(s,sprintf("E_to_S_energy_coeff[%d] := %A;\n",k,E_to_S_energy_coeff[k]));
od:
for k from 1 to 3 do
for i from 1 to 2 do
s := cat(s,sprintf("E_to_S_energy_coeff[%d,%d] := %A;\n",k,i,E_to_S_energy_coeff[k,i]));
od;
od:
for k from 1 to 3 do
for i from 1 to 2 do
for j from i to 2 do
s := cat(s,sprintf("E_to_S_energy_coeff[%d,%d,%d] := %A;\n",k,i,j,E_to_S_energy_coeff[k,i,j]));
od;
od;
od:
E_to_S_energy_coeff_string := s;
NULL;
end:
E_to_S_energy_denom := (1+z[2])*(z[1]^2-4*z[1]+4);
E_to_S_energy_coeff[1] := -8*(2*z[2]-1)*(z[1]*z[2]-2*z[1]+2*z[2]+2);
E_to_S_energy_coeff[2] := -4*z[1]^4*z[2]^3+6*z[1]^4*z[2]^2-48*z[1]^3*z[2]^3+6*z[1]^4*z[2]+116*z[1]^3*z[2]^2-16*z[1]^2*z[2]^3-4*z[1]^4-104*z[1]^3*z[2]-144*z[1]^2*z[2]^2+20*z[1]^3+224*z[1]^2*z[2]+16*z[1]*z[2]^2-32*z[1]^2-160*z[1]*z[2]+32*z[2]^2+16*z[1]+32*z[2];
E_to_S_energy_coeff[3] := -(z[1]-2)^2*(z[1]*z[2]+z[1]-1);
E_to_S_energy_coeff[1,1] := -16*z[1]*z[2]*(2*z[2]-1)*(z[1]-2);
E_to_S_energy_coeff[1,2] := -32*z[2]*(2*z[2]-1)*(z[1]*z[2]-2*z[1]+2*z[2]+2);
E_to_S_energy_coeff[2,1] := -4*z[1]*(2*z[2]-1)*(z[1]-2)*(z[1]*z[2]+z[1]+2*z[2]-2)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_energy_coeff[2,2] := -16*z[2]*(2*z[2]-1)*(3*z[1]*z[2]-3*z[1]+2*z[2]+2)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_energy_coeff[3,1] := -4*z[1]*(z[1]-2)^2*(z[1]*z[2]+z[1]-1);
E_to_S_energy_coeff[3,2] := -8*z[1]*z[2]*(2*z[2]-1)*(z[1]-2);
E_to_S_energy_coeff[1,1,1] := -8*z[1]*z[2]*(z[1]-2)^2*(z[1]*z[2]+z[1]-1);
E_to_S_energy_coeff[1,1,2] := -32*z[1]*z[2]^2*(2*z[2]-1)*(z[1]-2);
E_to_S_energy_coeff[1,2,2] := -32*z[2]^2*(2*z[2]-1)*(z[1]*z[2]-2*z[1]+2*z[2]+2);
E_to_S_energy_coeff[2,1,1] := -2*z[1]*(2*z[2]-1)*(z[1]-2)^2*(z[1]*z[2]+z[1]-1)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_energy_coeff[2,1,2] := -8*z[1]*z[2]*(2*z[2]-1)^2*(z[1]-2)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_energy_coeff[2,2,2] := -8*z[2]*(2*z[2]-1)^2*(z[1]*z[2]-2*z[1]+2*z[2]+2)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_energy_coeff[3,1,1] := -4*z[1]^2*(z[1]-2)^2*(z[1]*z[2]+z[1]-1);
E_to_S_energy_coeff[3,1,2] := -16*z[1]^2*z[2]*(2*z[2]-1)*(z[1]-2);
E_to_S_energy_coeff[3,2,2] := -16*z[1]*z[2]*(2*z[2]-1)*(z[1]*z[2]-2*z[1]+2*z[2]+2);
# For the function below, u should be a list of three polynomials in z[1] and z[2].
# This corresponds to the map u *~ s2p_core.
#@ E_to_S_energy
E_to_S_energy := proc(u)
local i,k,du,En,E;
for k from 1 to 3 do
for i from 1 to 2 do
du[k,i] := diff(u[k],z[i]);
od;
od;
En :=
add(E_to_S_energy_coeff[k] * u[k]^2,k=1..3) +
add(add(E_to_S_energy_coeff[k,i] * u[k] * du[k,i],i=1..2),k=1..3) +
add(add(E_to_S_energy_coeff[k,i,i] * du[k,i]^2,i=1..2),k=1..3) +
add(E_to_S_energy_coeff[k,1,2] * du[k,1] * du[k,2],k=1..3);
E := En / E_to_S_energy_denom;
return unapply(E,z);
end;
######################################################################
#@ find_E_to_S_jacobian_coeff
#@ E_to_S_jacobian_coeff
#@ E_to_S_jacobian_coeff_string
find_E_to_S_jacobian_coeff := proc()
global E_to_S_jacobian_coeff,E_to_S_jacobian_coeff_string;
local i,j,k,l,s,U,UU,PP,DP,S3,S4,sg3,sg4,A,B,AB;
UU := [seq(U[k](zx0[1],zx0[2]),k=1..3)];
PP := UU *~ s2p_core;
for k from 1 to 3 do
for i from 1 to 4 do
DP[k,i] := subs({U[1](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[1],
U[2](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[2],
U[3](x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = u[3],
(D[1](U[1]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[1,1],
(D[2](U[1]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[1,2],
(D[1](U[2]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[2,1],
(D[2](U[2]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[2,2],
(D[1](U[3]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[3,1],
(D[2](U[3]))(x[3]^2, (1/8)*(3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2)^2) = du[3,2]
},diff(PP[k],x[i]));
od;
od;
PP := [seq(u[i] * s2p_core[i],i=1..3)];
S3 := combinat[permute](3):
S4 := combinat[permute](4):
sg3 := (u) -> signum(mul(mul(u[j]-u[i],j=i+1..3),i=1..2)):
sg4 := (u) -> signum(mul(mul(u[j]-u[i],j=i+1..4),i=1..3)):
A := Matrix(4,4):
for i from 1 to 4 do
for j from 1 to 4 do
A[i,j] := Determinant(Matrix([[seq(PP[k],k=1..3)],[seq(DP[k,i],k=1..3)],[seq(DP[k,j],k=1..3)]]));
od:
od:
B := Matrix(4,4):
for s in S4 do
B[s[1],s[2]] := B[s[1],s[2]] + sg4(s) * dg0(xx)[s[3]] * x[s[4]];
od:
AB := expand(NF_z0(add(add(A[i,j] * B[i,j]/2,j=1..4),i=1..4))):
E_to_S_jacobian_coeff := table():
E_to_S_jacobian_coeff[0] := factor(coeff(coeff(coeff(AB,u[1],1),u[2],1),u[3],1));
E_to_S_jacobian_coeff[1] := factor(coeff(coeff(coeff(AB,u[1],1),du[2,1],1),du[3,2],1)/2);
for i from 1 to 3 do
j,k := op({1,2,3} minus {i});
for l from 1 to 2 do
E_to_S_jacobian_coeff[i,l] :=
factor(coeff(coeff(coeff(AB,u[j],1),u[k],1),du[i,l],1)/2);
od;
od;
end:
E_to_S_jacobian_coeff[0] := (-12*z[1]^2*z[2]^2+20*z[1]^2*z[2]-4*z[1]^2-16*z[1]*z[2]+4);
E_to_S_jacobian_coeff[1] := 4*z[1]*z[2]*(2*z[2]-1)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_jacobian_coeff[1,1] := 2*z[1]*z[2]*(4*z[1]^2*z[2]-5*z[1]^2+8*z[1]-4);
E_to_S_jacobian_coeff[1,2] := -2*z[2]*(2*z[2]-1)*(z[1]^2*z[2]-2*z[1]^2+2);
E_to_S_jacobian_coeff[2,1] := -2*z[1]*(2*z[2]-1)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_jacobian_coeff[2,2] := -2*z[2]*(2*z[2]-1)*(z[1]^2*z[2]-2*z[1]^2+4*z[1]-2);
E_to_S_jacobian_coeff[3,1] := -4*z[1]*(z[1]*z[2]-z[1]+1)*(z[1]*z[2]+z[1]-1);
E_to_S_jacobian_coeff[3,2] := 4*z[1]*z[2]*(2*z[2]-1)*(z[1]*z[2]-2*z[1]+2);
#@ E_to_S_jacobian
E_to_S_jacobian := proc(u)
local i,k,du,s,S3,sg3,J;
S3 := combinat[permute](3):
sg3 := (u) -> signum(mul(mul(u[j]-u[i],j=i+1..3),i=1..2)):
for k from 1 to 3 do
for i from 1 to 2 do
du[k,i] := diff(u[k],z[i]);
od;
od;
J :=
E_to_S_jacobian_coeff[0] * u[1]*u[2]*u[3] +
E_to_S_jacobian_coeff[1] *
add(sg3(s)*u[s[1]]*(du[s[2],1]*du[s[3],2]-du[s[2],2]*du[s[3],1]),s in S3) +
(add(add(u[s[1]] * u[s[2]] * du[s[3],k] *
E_to_S_jacobian_coeff[s[3],k],k=1..2),s in S3));
J := J / sqrt(square_norm_of_dg_z0(z));
return unapply(J,z)
end:
#@ E_to_S_conformal_error
E_to_S_conformal_error := proc(u)
local E,J;
E := E_to_S_energy(u)(z);
J := E_to_S_jacobian(u)(z);
return unapply(E - 2*J,z);
end:
#@ s2p_plot
s2p_plot := proc(S,g)
display(seq(polygon(evalf(map(s2p0,map(p -> p["x"],g["faces"][i]["corner"])))),i=0..g["num_faces"]-1),
scaling=constrained,axes=none);
end:
# Let u be a positive smooth function of z[1] with u(1) = 1. Then the following
# multipliers give a map that is normalised and conformal on a first-order
# infinitesimal neighbourhood of C_1, with the correct behavious at the endpoints.
#@ p1_multipliers
p1_multipliers :=
[-(1-(1/2)*z[1])*(2*z[1]*(D(u))(z[1])-u(z[1]))/(u(z[1])^2+z[1]),
(u(z[1])^2-z[1])/((u(z[1])^2+z[1])*(1-z[1])),
2*u(z[1])/(u(z[1])^2+z[1])
]:
#@ s2p_p1
s2p_p1 := unapply(subs({z[1]=zx0[1],z[2]=zx0[2]},p1_multipliers *~ s2p_core),x);
# The following multipliers do the same for C_3 and C_5.
#@ p3_multipliers
p3_multipliers :=
[(u(z[1])^2-z[1])/(u(z[1])^2+z[1]),
-(1/3)*(2*z[1]*(D(u))(z[1])-u(z[1]))*sqrt(6)/(u(z[1])^2+z[1]),
2*u(z[1])/(u(z[1])^2+z[1])
]:
#@ s2p_p3
s2p_p3 := unapply(subs({z[1]=zx0[1],z[2]=zx0[2]},p3_multipliers *~ s2p_core),x);
#@ p5_multipliers
p5_multipliers :=
[(1/2)*(u(z[1])^2-z[1])*z[1]/((u(z[1])^2+z[1])*(1-z[1])),
z[1]*(-2*(D(u)(z[1]))*z[1]+u(z[1]))/(sqrt(3*z[1]^2-4*z[1]+2)*(u(z[1])^2+z[1])),
2*u(z[1])/(u(z[1])^2+z[1])
]:
#@ s2p_p5
s2p_p5 := unapply(subs({z[1]=zx0[1],z[2]=zx0[2]},p5_multipliers *~ s2p_core),x);
# For C_0 we have not found a general system of multiplers depending on a function
# u. We just have the following choice, with no free parameters.
#@ p0_multipliers
p0_multipliers := [1,1,2*sqrt(1+z[2])];
#@ s2p_p0
s2p_p0 := unapply(subs({z[1]=zx0[1],z[2]=zx0[2]},p0_multipliers *~ s2p_core),x);
######################################################################
# Here we make some specific choices of multipliers along the edges.
# With these choices we get maps f[i] : C_i -> S^2 that are conformal to
# first order and agree to first order at the corners. At v[0] and v[11]
# the maps f[1] and f[5] are conformal to second order and agree to
# second order.
#
# It should be possible in principle to find multipliers on the
# whole surface that agree on the curves C_i with the multipliers
# below, but we have not yet completed this. Note that p[0], p[1] and
# p[3] are the same, which is a start.
#
# With these multipliers, the point v[11] maps in C to
# 5 - 2*sqrt(6) = 0.101018, which is close to the value of a_P
# obtained by the numerical code.
#@ s2p_pp
#@ s2p_qq
s2p_qq := map(u -> NF_z0(u^2),s2p_core);
s2p_pp[0] := [ 1-1/2*z[1]-3/4*z[1]*z[2]+1/2*z[1]*z[2]^2,
1/sqrt(1+3/2*z[1]*z[2]),
2*sqrt(1+z[2])*sqrt(1+3/2*z[1]*z[2])
]/~(1+z[1]+5/2*z[1]*z[2]);
s2p_pp[1] := s2p_pp[0];
s2p_pp[3] := s2p_pp[0];
s2p_pp[5] := [(5/2-(3/4)*z[1]^2*z[2]+(3/2)*z[1]^2-3*z[1])/(2*(1+z[1]+(5/2)*z[1]*z[2])),
(6-4*z[1]- 2*z[2]+2*z[1]*z[2])/((1+z[1]+(5/2)*z[1]*z[2])*(1+z[2])*sqrt(6*z[1]*z[2]+4)),
2*sqrt(1+z[2])*sqrt(1+3/2*z[1]*z[2])/(1+z[1]+5/2*z[1]*z[2])];
## s2p_ff
for i in {0,1,3,5} do
s2p_ff[i] := unapply(eval(subs(z = zx0,s2p_pp[i])) *~ s2p_core,x);
od:
######################################################################
# Suppose we have a map f with multipliers m1,m2,m3. Then m3 does not
# affect the values of f on C_0, but there is a unique possible value
# of m3 on C_0 that ensures that f is conformal on a first order
# infinitesimal neighbourhood of C_0. This m3 is given by
# p0_conformal_factor([m1,m2,m3]), with the understanding that the
# functions mi have been restricted to C_0 and expressed as functions
# of z[1]. The story is similar for C_1, C_3 and C_5. Note however
# that z[2] is not constant on C_5, so taking the derivative of the
# restricted function with respect to z[1] is not the same as taking
# the partial derivative and then restricting.
#@ p0_conformal_factor
p0_conformal_factor := (m) ->
sqrt(1+z[2])*(2*m[1](z[2])*m[2](z[2])+
8*z[2]*(1/2-z[2])*(D(m[1])(z[2])*m[2](z[2])-m[1](z[2])*D(m[2])(z[2])));
#@ p1_conformal_factor
p1_conformal_factor := (m) ->
1/4*(2-z[1])*(-(1+z[1])*m[2](z[1])*m[3](z[1]) +
2*z[1]*(1-z[1])*(D(m[2])(z[1])*m[3](z[1])-D(m[3])(z[1])*m[2](z[1])));
#@ p3_conformal_factor
p3_conformal_factor := (m) ->
(2*z[1]*(D(m[1])(z[1])*m[3](z[1])-D(m[3])(z[1])*m[1](z[1]))-m[1](z[1])*m[3](z[1]))/sqrt(6);
#@ p5_conformal_factor
p5_conformal_factor := (m) ->
(-2*z[1]*(1-z[1])*(m[3](z[1])*D(m[1])(z[1])-D(m[3])(z[1])*m[1](z[1])) + (3-z[1])*m[1](z[1])*m[3](z[1]))/sqrt(3*z[1]^2-4*z[1]+2);