set_a_E0(1/sqrt(2));
#@ ry
ry[1] := sqrt(1-y[2]/sqrt(2));
ry[2] := sqrt(1+y[2]/sqrt(2));
#@ rx
rx[1] := subs(y[2] = yx0[2],ry[1]);
rx[2] := subs(y[2] = yx0[2],ry[2]);
#@ y2r
y2r[1] := sqrt(2)*(1-r[1]^2);
y2r[2] := sqrt(2)*(r[2]^2-1);
#@ y_vars
y_vars := lexdeg([r[1], r[2]],
[x[1], x[2], x[3], x[4]],
[z[1], z[2]],
[y[1], y[2]]);
#@ y_rels0
y_rels0 := Basis([r[1]^2-ry[1]^2,r[2]^2-ry[2]^2,op(y_rels0)],y_vars);
#@ z_vars
z_vars := lexdeg([r[1], r[2]],
[x[1], x[2], x[3], x[4]],
[y[1], y[2]],
[z[1], z[2]]);
#@ z_rels0
z_rels0 := Basis([r[1]^2-ry[1]^2,r[2]^2-ry[2]^2,op(z_rels0)],z_vars);
#@ root_rule
root_rule := {
sqrt(1-y[2]/sqrt(2)) = r[1],
sqrt(1+y[2]/sqrt(2)) = r[2],
sqrt(4-2*sqrt(2)*y[2]) = 2 * r[1],
sqrt(4+2*sqrt(2)*y[2]) = 2 * r[2],
sqrt(sqrt(2)*(sqrt(2)-y[2])) = (sqrt(2) * r[1]),
sqrt(sqrt(2)*(sqrt(2)+y[2])) = (sqrt(2) * r[2]),
(sqrt(2)*(sqrt(2)-y[2]))^(3/2) = 2*sqrt(2)*(1-y[2]/sqrt(2))*r[1],
(sqrt(2)*(sqrt(2)+y[2]))^(3/2) = 2*sqrt(2)*(1+y[2]/sqrt(2))*r[2],
sqrt( 3*sqrt(2)*x[3]*x[4]+2*x[1]^2-2*x[2]^2+4) = 2*r[1],
sqrt(-3*sqrt(2)*x[3]*x[4]-2*x[1]^2+2*x[2]^2+4) = 2*r[2],
sqrt(1 - y[2]^2/2) = r[1] * r[2],
sqrt(4 - 2*y[2]^2) = 2 * r[1] * r[2],
sqrt(-18*x[3]^2*x[4]^2-12*sqrt(2)*x[1]^2*x[3]*x[4]+12*sqrt(2)*x[2]^2*x[3]*x[4]-4*x[1]^4+8*x[1]^2*x[2]^2-4*x[2]^4+16)=4*r[1]*r[2]
};
#@ FNF_y0
FNF_y0 := proc(u)
local uu,nu,du,t;
if type(u,list) or type(u,set) then
return map(FNF_y0,u);
fi;
uu := simplify(u);
uu := factor(subs(root_rule,uu));
nu := NF_y0(subs(root_rule,numer(u)));
du := NF_y0(subs(root_rule,denom(u)));
uu := factor(nu/du);
for t in [x[1],x[2],r[1],r[2]] do
if has(du,t) then
nu := NF_y0(expand(nu * subs(t = -t,du)));
du := NF_y0(expand(du * subs(t = -t,du)));
uu := factor(nu/du);
nu := numer(uu);
du := denom(uu);
fi;
od:
return uu;
end:
#@ FNF_z0
FNF_z0 := proc(u)
local uu,nu,du,t;
if type(u,list) or type(u,set) then
return map(FNF_y0,u);
fi;
uu := simplify(u);
uu := factor(subs(root_rule,uu));
nu := NF_z0(subs(root_rule,numer(u)));
du := NF_z0(subs(root_rule,denom(u)));
uu := factor(nu/du);
for t in [x[1],x[2],y[1],y[2],r[1],r[2]] do
if has(du,t) then
nu := NF_z0(expand(nu * subs(t = -t,du)));
du := NF_z0(expand(du * subs(t = -t,du)));
uu := factor(nu/du);
nu := numer(uu);
du := denom(uu);
fi;
od:
return uu;
end:
z_to_t := (z) -> [2*z[1]-z[1]^2+z[1]^2*z[2]/2,2*z[2]]; #@ z_to_t
t_proj := unapply(z_to_t(z_proj0(x)),x); #@ t_proj
#@ t_to_z
t_to_z := (t) -> [(2*(-2+sqrt(t[1]*t[2]-4*t[1]+4)))/(t[2]-4), (1/2)*t[2]];
#@ t_lift
t_lift := (t) -> [
(1/2)*sqrt(2)*sqrt((1-sqrt(t[2]))*(sqrt(t[1]*t[2]-4*t[1]+4)+sqrt(t[2]))/(2+sqrt(t[2]))),
(1/2)*sqrt(2)*sqrt((1+sqrt(t[2]))*(sqrt(t[1]*t[2]-4*t[1]+4)-sqrt(t[2]))/(2-sqrt(t[2]))),
sqrt(2)*sqrt((2-sqrt(t[1]*t[2]-4*t[1]+4))/(4-t[2])),
-sqrt((2-sqrt(t[1]*t[2]-4*t[1]+4))/(4-t[2]))*sqrt(t[2])
]:
# The following quadratic vanishes on C[5] and C[7]:
oval_g := (x) -> x[3]*x[4]/sqrt(2)+x[1]^2+x[4]^2; #@ oval_g
oval_h := (z) -> z[1]^2*(z[2]-2) + 4*z[1] -2; #@ oval_h
# The vectors oval_e[i] form an orthonormal basis, and oval_g(x) is the
# sum of oval_m[i] ^2.
#@ oval_e
oval_e[1] := [1,0,0,0];
oval_e[2] := [0,1,0,0];
oval_e[3] := [0,0,sqrt(1/2+1/sqrt(6)),-sqrt(1/2-1/sqrt(6))];
oval_e[4] := [0,0,sqrt(1/2-1/sqrt(6)), sqrt(1/2+1/sqrt(6))];
#@ oval_m
oval_m[1] := 1;
oval_m[2] := 0;
oval_m[3] := -(sqrt(6)-2)/4;
oval_m[4] := (sqrt(6)+2)/4;
# The function c_alt[k] is an alternative parametrisation of C[k].
alpha_E := 5+2*sqrt(6); #@ alpha_E
beta_E := sqrt(3) + sqrt(2); #@ beta_E
#@ c_alt
c_alt[5] := (t) -> [
sin(t)/beta_E,
0,
(1+beta_E^2)*(sqrt(1-sin(t)^2/beta_E^4)+cos(t)/beta_E^2)/12,
(cos(t)-sqrt(1-sin(t)^2/beta_E^4))*sqrt(3)/6
];
c_alt[ 6] := unapply(simplify(act_E[ L](c_alt[5](t))),t);
c_alt[ 7] := unapply(simplify(act_E[ M](c_alt[5](t))),t);
c_alt[ 8] := unapply(simplify(act_E[LM](c_alt[5](t))),t);
c_alt_approx[5] := (t) -> [
sin(t)/beta_E,
0,
(1+beta_E^2)*(1+cos(t)/beta_E^2)/12,
(cos(t)-1)*sqrt(3)/6
];
for k from 0 to 4 do
c_alt[k] := eval(c_E0[k]):
od:
# We can also describe C[k] (for k in {5,6,7,8}) as part of an elliptic curve.
#@ elliptic_a_poly
elliptic_a_poly := (t,u) -> u^2-(1-(1-t)/(2*alpha_E^2))*(1-t^2);
#@ c_elliptic_a[5]
c_elliptic_a[5] := unapply([(sqrt(2)+sqrt(3))*alpha_E*u,0,(alpha-(1-t)/2)^2,-sqrt(8)*alpha_E*(1-t)]/~(alpha_E^2-(1+t)^2/4),t,u);
#@ c_trig[5]
c_trig[5] := unapply(c_elliptic_a[5](cos(t),sin(t)*sqrt(1-(1+cos(t))/2/alpha_E^2)),t);
c_elliptic_a[ 6] := unapply(simplify(act_E[ L](c_elliptic_a[5](t,u))),t,u);
c_elliptic_a[ 7] := unapply(simplify(act_E[ M](c_elliptic_a[5](t,u))),t,u);
c_elliptic_a[ 8] := unapply(simplify(act_E[LM](c_elliptic_a[5](t,u))),t,u);
c_trig[ 6] := unapply(simplify(act_E[ L](c_trig[5](t))),t);
c_trig[ 7] := unapply(simplify(act_E[ M](c_trig[5](t))),t);
c_trig[ 8] := unapply(simplify(act_E[LM](c_trig[5](t))),t);
#@ elliptic_b_poly
elliptic_b_poly := tu -> tu[2]^2 - tu[1]^3 + 10*tu[1]^2 - tu[1];
#@ elliptic_b_proj
elliptic_b_proj := (x) -> [x[1]^2,x[1]*(x[4]^2-(5/2)*sqrt(2)*x[3]*x[4]-1)];
# The next function finds a Fourier series approximation to c[k]
# It seems that the Fourier coefficients are 1/Pi times rational
# combinations of EllipticK and EllipticE of 1/sqrt(3). We have
# not worked out the details of this.
#@ find_c_fourier
find_c_fourier := proc()
global c_fourier;
local a,k,p,c;
a[0] := int(1/sqrt(10 - 2*cos(t)),t=0..Pi)/Pi;
for k from 1 to 10 do
a[k] := int(cos(k*t)/sqrt(10 - 2*cos(t)),t=0..Pi)/Pi;
od:
p := add(a[k] * cos(k*t),k = 0..10);
c_fourier[ 5] := unapply(combine([p * sin(t)/2,0,sqrt(2)*p,-sin(t/2)^2*p]),t);
end:
#@ set_c_fourier
set_c_fourier := proc()
global c_fourier;
local B,C,p;
B := [20/3, 44, 348, 20660/7, 1635748/63, 161901340/693, 19230235292/9009,
177658107628/9009, 28136843691100/153153, 263857298489132/153153];
C := [-8, -160/3, -6328/15, -75136/21, -9914776/315, -196266848/693,
-116560420904/45045, -215368179200/9009, -34109227409288/153153,
-6077419529883040/2909907];
p := (2/3)*sqrt(3)*EllipticK((1/3)*sqrt(3))/Pi +
add((B[k]*EllipticK(1/sqrt(3)) + C[k]*EllipticE(1/sqrt(3)))*sqrt(3)/Pi*cos(k*t),k=1..10);
c_fourier[ 5] := unapply(combine([p * sin(t)/2,0,sqrt(2)*p,-sin(t/2)^2*p]),t);
end:
#@ propagate_c_fourier
propagate_c_fourier := proc()
global c_fourier,c_fourier0;
local k;
c_fourier[ 6] := unapply(simplify(act_E[ L](c_fourier[5](t))),t);
c_fourier[ 7] := unapply(simplify(act_E[ M](c_fourier[5](t))),t);
c_fourier[ 8] := unapply(simplify(act_E[LM](c_fourier[5](t))),t);
for k from 5 to 8 do
c_fourier0[k] := unapply(evalf(c_fourier[k](t)),t);
od:
end:
set_c_fourier();
propagate_c_fourier();
# Stereographic projection away from various vertices
#@ v_stereo
v_stereo[ 0] := (x) -> [x[1],x[2],x[4]] /~ (1 + x[3]);
v_stereo[ 3] := (x) -> [x[1],x[3],x[4]] /~ (1 + x[2]);
v_stereo[ 6] := (x) -> [(x[2]-x[1])/sqrt(2),x[3],x[4]] /~ (1+(x[1]+x[2])/sqrt(2));
v_stereo[11] := (x) -> [x[1],x[2],x[3]*sqrt(1/3)+x[4]*sqrt(2/3)] /~ (1+x[3]*sqrt(2/3)-x[4]*sqrt(1/3));
# Stereographic projection centred at a point near the middle of F16
#@ F16_stereo
proc()
local a1,a2,a3,a4,x,xx;
global F16_stereo;
xx := [seq(x[i],i=1..4)];
a1 := evalf([85/198, 623/990, (13/30)*sqrt(2), -104/495]):
a2 := dg0(a1):
a2 := simplify(a2 /~ sqrt(dp4(a2,a2))):
a3 := simplify(subs(a_E=a_E0,tangent_u(a1))):
a3 := simplify(expand(rationalize(a3 /~ sqrt(dp4(a3,a3))))):
a4 := cross_product4(a1,a2,a3):
F16_stereo := unapply([dp4(xx,a2),dp4(xx,a3),dp4(xx,a4)]/~(1+dp4(xx,a1)),x);
end():
# Tangent fields that are nowhere zero on F16
# The following definition would work after loading square_diffeo.mpl:
# tangent_a := unapply(simplify(expand(cross_product4(xx,dg0(xx),[seq(diff(square_diffeo_E0(x)[2],x[i]),i=1..4)]))),x);
# However, we just record the result inline here, so that it works
# without loading square_diffeo.mpl. Note that the enties in this
# field are homogeneous quartic polynomials.
#@ tangent_a
tangent_a := (x) -> [-x[3]^4+3*x[1]^2*sqrt(2)*x[3]*x[4]-3*x[2]^2*sqrt(2)*x[3]*x[4]-4*sqrt(2)*x[2]^3*x[4]-(3/2)*x[3]*x[1]^3*sqrt(2)+2*x[1]^3*sqrt(2)*x[4]-sqrt(2)*x[3]^3*x[4]-(3/2)*x[2]*x[4]^3*sqrt(3)+8*sqrt(2)*x[3]*x[4]^3+(3/2)*x[4]*sqrt(3)*x[2]^3+(3/4)*sqrt(2)*x[1]*x[3]^3-sqrt(2)*x[1]*x[2]^3+x[1]^3*x[2]*sqrt(2)-4*x[2]^2*x[1]^2+2*x[1]^2*x[3]^2+2*x[1]^2*x[4]^2-x[2]^2*x[3]^2-4*x[4]^2*x[2]^2+8*x[3]^2*x[4]^2+4*x[1]*x[2]^2*x[3]-4*x[1]^2*x[2]*x[3]+(3/2)*x[1]*x[2]^2*x[4]+16*x[1]*x[3]*x[4]^2-(3/4)*sqrt(2)*x[2]*x[1]^2*sqrt(3)*x[3]-(15/2)*x[2]*x[3]*x[4]^2*sqrt(2)*sqrt(3)+4*x[1]*x[2]*sqrt(2)*x[3]*x[4]+20*x[2]*x[3]*x[4]^2+3*x[1]*x[2]*x[3]^2+2*x[1]*x[2]*x[4]^2+6*x[1]*x[2]*x[3]*x[4]+4*x[1]^3*x[2]-(3/2)*x[1]^3*x[4]-2*x[1]*x[3]^3+4*x[3]*x[1]^3-4*x[2]^3*x[3]+2*x[2]*x[3]^3+2*x[1]*x[2]*x[3]^2*sqrt(2)-6*sqrt(2)*x[1]*x[3]*x[4]^2+12*x[2]*x[3]^2*x[4]*sqrt(2)+4*sqrt(2)*x[2]*x[1]^2*x[4]-2*sqrt(2)*x[1]*x[2]^2*x[4]-(39/4)*x[2]*x[3]^2*x[4]*sqrt(3)+(3/4)*sqrt(2)*x[2]^3*sqrt(3)*x[3]-(9/2)*x[2]*x[4]*sqrt(3)*x[1]^2-(3/2)*x[2]*x[3]^3*sqrt(2)*sqrt(3)-(3/2)*sqrt(2)*x[1]*x[3]*x[2]^2, -4*x[1]^4-x[3]^4-4*x[1]^2*x[3]*x[4]+2*x[2]^2*x[3]*x[4]-5*x[1]^2*sqrt(2)*x[3]*x[4]+x[2]^2*sqrt(2)*x[3]*x[4]+6*x[2]*x[3]*x[4]^2*sqrt(2)+(9/2)*x[4]*sqrt(3)*x[1]^3+(3/2)*x[1]*x[4]^3*sqrt(3)+(3/2)*sqrt(2)*x[2]^3*x[3]+2*x[3]^2*sqrt(2)*x[1]^2+x[1]^2*sqrt(2)*x[4]^2-x[2]^2*sqrt(2)*x[4]^2-(3/4)*x[2]*x[3]^3*sqrt(2)+2*sqrt(2)*x[2]^3*x[4]-3*x[3]*x[1]^3*sqrt(2)-4*x[1]^3*sqrt(2)*x[4]-sqrt(2)*x[3]^3*x[4]+8*sqrt(2)*x[3]*x[4]^3+(3/2)*sqrt(2)*x[1]*x[3]^3+7*x[1]^2*x[3]^2+2*x[2]^2*x[3]^2-2*x[4]^2*x[2]^2+8*x[3]^2*x[4]^2+4*x[1]*x[2]^2*x[3]-4*x[1]^2*x[2]*x[3]+3*x[1]*x[2]^2*x[4]-20*x[1]*x[3]*x[4]^2+(3/2)*x[1]^2*x[2]*x[4]+sqrt(2)*x[1]^2*x[2]^2-sqrt(2)*x[1]^4+8*x[1]*x[2]*sqrt(2)*x[3]*x[4]-(3/4)*sqrt(2)*x[1]*x[2]^2*sqrt(3)*x[3]+(21/2)*sqrt(2)*x[1]*x[3]*x[4]^2*sqrt(3)-16*x[2]*x[3]*x[4]^2-5*x[1]*x[2]*x[3]^2+2*x[1]*x[2]*x[4]^2+(3/2)*sqrt(2)*x[2]*x[3]*x[1]^2+12*x[1]*x[3]^2*x[4]*sqrt(2)-(9/4)*x[1]*x[3]^2*x[4]*sqrt(3)+(3/4)*x[1]^3*sqrt(2)*sqrt(3)*x[3]-(3/2)*x[1]*x[4]*sqrt(3)*x[2]^2-(3/2)*sqrt(2)*x[1]*x[3]^3*sqrt(3)+4*x[1]^3*x[2]-3*x[1]^3*x[4]-2*x[1]*x[3]^3+4*x[3]*x[1]^3-4*x[2]^3*x[3]+2*x[2]*x[3]^3-x[3]^3*x[4]-(3/2)*x[2]^3*x[4]+8*x[3]*x[4]^3-12*sqrt(2)*x[1]*x[3]*x[4]^2-2*sqrt(2)*x[2]*x[1]^2*x[4]+4*sqrt(2)*x[1]*x[2]^2*x[4]-3*sqrt(2)*x[1]*x[3]*x[2]^2, -4*x[1]^4+4*x[2]^4+3*x[1]^2*x[3]*x[4]+3*x[2]^2*x[3]*x[4]-2*x[1]*x[4]^3*sqrt(2)-2*x[2]*x[4]^3*sqrt(2)+(3/4)*x[3]^2*sqrt(2)*x[2]^2-4*x[1]^2*sqrt(2)*x[3]*x[4]-4*x[2]^2*sqrt(2)*x[3]*x[4]+2*x[2]*x[3]*x[4]^2*sqrt(2)-(3/4)*x[3]^2*sqrt(2)*x[1]^2+(3/2)*x[1]^2*sqrt(2)*x[4]^2-(3/2)*x[2]^2*sqrt(2)*x[4]^2-2*sqrt(2)*x[2]^3*x[4]-2*x[1]^3*sqrt(2)*x[4]+3*sqrt(2)*x[1]*x[2]^3+3*x[1]^3*x[2]*sqrt(2)+2*x[1]^2*x[3]^2-4*x[1]^2*x[4]^2-2*x[2]^2*x[3]^2+4*x[4]^2*x[2]^2+6*x[1]*x[2]^2*x[3]-10*x[1]^2*x[2]*x[3]-6*x[1]*x[3]*x[4]^2-2*x[1]^2*x[2]*x[4]+x[2]*x[3]^2*x[4]+3*x[1]*x[2]*x[3]^2*sqrt(2)*sqrt(3)+12*x[1]*x[2]*x[4]*sqrt(3)*x[3]+(3/2)*sqrt(2)*x[1]^4-(3/2)*sqrt(2)*x[2]^4+3*x[1]*x[2]*sqrt(2)*x[4]^2-16*x[1]*x[2]*sqrt(2)*x[3]*x[4]+2*x[2]*x[3]*x[4]^2-6*x[1]*x[2]*x[3]*x[4]-4*sqrt(2)*x[2]*x[3]*x[1]^2-x[1]*x[3]^2*x[4]*sqrt(2)+x[1]*x[3]^3-2*x[3]*x[1]^3-2*x[2]^3*x[3]+x[2]*x[3]^3-2*x[2]^3*x[4]-2*x[2]*x[4]^3-(3/2)*x[1]*x[2]*x[3]^2*sqrt(2)+3*x[2]*x[3]^2*x[4]*sqrt(2)-2*sqrt(2)*x[2]*x[1]^2*x[4]-2*sqrt(2)*x[1]*x[2]^2*x[4], (3/2)*x[1]^4+(3/2)*x[2]^4-12*x[1]^2*x[3]*x[4]+12*x[2]^2*x[3]*x[4]+4*x[3]^2*sqrt(2)*x[2]^2+(9/2)*x[1]^2*sqrt(2)*x[3]*x[4]-(9/2)*x[2]^2*sqrt(2)*x[3]*x[4]-6*x[2]*x[3]*x[4]^2*sqrt(2)+sqrt(2)*x[2]^3*x[3]+4*x[3]^2*sqrt(2)*x[1]^2-2*x[2]*x[3]^3*sqrt(2)+sqrt(2)*x[2]^3*x[4]-x[3]*x[1]^3*sqrt(2)+2*sqrt(2)*x[1]*x[3]^3-3*x[2]^2*x[1]^2-3*x[1]^2*x[3]^2-3*x[2]^2*x[3]^2+2*x[1]*x[2]^2*x[4]-2*x[1]^2*x[2]*x[4]-10*x[2]*x[3]^2*x[4]-2*x[1]*x[3]^2*x[4]+4*sqrt(2)*x[1]^2*x[2]^2-2*sqrt(2)*x[1]^4-2*sqrt(2)*x[2]^4+9*x[1]*x[2]*sqrt(2)*x[3]*x[4]-6*x[2]*x[3]*x[4]^2+6*x[1]*x[2]*x[3]^2-3*x[1]*x[2]*sqrt(2)*x[3]*x[4]*sqrt(3)+3*sqrt(2)*x[2]*x[3]*x[1]^2+3*x[1]^3*x[2]-2*x[1]^3*x[4]+2*x[2]^3*x[4]-3*x[1]*x[2]^3-8*x[1]*x[2]*x[3]^2*sqrt(2)-6*sqrt(2)*x[1]*x[3]*x[4]^2-2*x[2]*x[3]^2*x[4]*sqrt(2)-sqrt(2)*x[2]*x[1]^2*x[4]-3*sqrt(2)*x[1]*x[3]*x[2]^2]:
#@ unit_tangent_a
unit_tangent_a := proc(x)
local u;
u := tangent_a(x);
u := evalf(u /~ nm4(u));
return u;
end:
#@ full_frame_a
full_frame_a := proc(x::[numeric,numeric,numeric,numeric])
local n,r,u,v;
n := evalf(dg0(x));
n := n /~ nm4(n);
u := unit_tangent_a(x);
v := cross_product4(x,n,u);
return [x,n,u,v];
end:
#@ tangent_frame_a
tangent_frame_a := proc(x::[numeric,numeric,numeric,numeric])
local f;
f := full_frame_a(x);
return [f[3],f[4]];
end:
# This function projects a fixed vector u0 = [-1,18,-13,10] into
# the tangent plane to get a vector u. With this choice of u0,
# it works out that |u|/|u0| is always at least 0.7 or so, for
# all choices of x in F16. With more obvious choices of u0 we
# would find that |u|/|u0| would be very small or zero for some
# choices of x.
#@ full_frame_b
full_frame_b := proc(x::[numeric,numeric,numeric,numeric])
local n,r,u,v;
n := evalf(dg0(x));
n := n /~ nm4(n);
u := [-1,18,-13,10];
u := evalf(u -~ dp4(u,x) *~ x);
u := evalf(u -~ dp4(u,n) *~ n);
u := u /~ nm4(u);
v := cross_product4(x,n,u);
return [x,n,u,v];
end:
#@ unit_tangent_b
unit_tangent_b := (x::[numeric,numeric,numeric,numeric]) -> full_frame_b(x)[3];
#@ tangent_frame_b
tangent_frame_b := proc(x::[numeric,numeric,numeric,numeric])
local f;
f := full_frame_b(x);
return [f[3],f[4]];
end:
######################################################################
#@ cubic_chart0
proc()
local gg,aa,bb,nn,yy,t,tt,i,j,k;
global cubic_chart0;
tt := [seq(t[i],i=1..4)]:
for i from 1 to 4 do
for j from 1 to 4 do
for k from 1 to 4 do
gg[i,j,k] := diff(diff(diff(g0(xx),x[i]),x[j]),x[k])/6:
od:
od:
od:
aa := add(add(add(add(add(gg[i,j,k]*gg[k,l,m]*x[i]*t[j]*x[l]*x[m],m=1..4),l=1..4),k=1..4),j=1..4),i=1..4):
bb := dp4(dg0(tt),xx):
nn := square_norm_of_dg0(xx):
yy := (1 - dp4(tt,tt)/2) *~ xx +~ tt +~ ((18 * aa - nn) * bb / nn^2 - g0(tt)/nn) *~ dg0(xx):
cubic_chart0 := unapply(yy,x,t):
end():
######################################################################
#@ annular_chart0
for i from 0 to 2 do
annular_chart0[i] :=
unapply(subs(csgn(cos(s[1])^2-2) = -1,
simplify(subs(a_E=a_E0,annular_chart[i](s)))),s);
od:
annular_chart0[3] := unapply(subs({t=s[1],u=s[2]},
[(44*cos(2*t)*u^3+cos(4*t)*u^3+115*u^3+60*cos(2*t)*u-3*cos(4*t)*u-153*u)/
(-3*cos(4*t)-153+60*cos(2*t)),
sin(t)-(1/2)*sin(t)*u^2,
(-u^2*sqrt(6)*cos(3*t)-7*u^2*sqrt(6)*cos(t)+2*sqrt(6)*cos(3*t)-18*sqrt(6)*cos(t))/
(12*cos(2*t)-60),
(-41*cos(t)*sqrt(3)*u^2+cos(3*t)*sqrt(3)*u^2+18*cos(t)*sqrt(3)-2*cos(3*t)*sqrt(3))/
(12*cos(2*t)-60)]),s);
annular_chart0[4] := unapply(act_R4[L](annular_chart0[3](s)),s);
annular_chart0[5] := unapply(subs({t=s[1],u=s[2]},[
(1/2)*sin(t)*sqrt(2)/sqrt(5-cos(t)) +
(1/16)*sqrt(2)*(cos(t)^3-21*cos(t)^2+79*cos(t)+53)*sin(t)*u^2/((5-cos(t))^(5/2)*(3-cos(t))),
(1/2)*sqrt(cos(t)^2-2*cos(t)+9)*u/(5-cos(t)),
2/sqrt(5-cos(t))-(1/4)*(cos(t)^3-5*cos(t)^2-17*cos(t)+37)*u^2/((5-cos(t))^(5/2)*(3-cos(t))),
-(1/2)*(1-cos(t))*sqrt(2)/sqrt(5-cos(t))+
(1/16)*sqrt(2)*(cos(t)^4-22*cos(t)^3+84*cos(t)^2+38*cos(t)+27)*u^2/((5-cos(t))^(5/2)*(3-cos(t)))
]),s);
annular_chart0[ 6] := unapply(simplify(act_E[ L](annular_chart0[5](s))),s);
annular_chart0[ 7] := unapply(simplify(act_E[ M](annular_chart0[5](s))),s);
annular_chart0[ 8] := unapply(simplify(act_E[LM](annular_chart0[5](s))),s);
######################################################################
#@ is_geodesic
is_geodesic := proc(c,d)
local t,c0,c1,c2,n0,err;
c0 := multi_series(c(t),d+2,t);
c1 := map(diff,c0,t);
c2 := map(diff,c1,t);
n0 := multi_series(dg0(c0),d+2,t);
n0 := multi_series(n0 /~ nm4(n0),d+2,t);
err := c0;
err := multi_series(err - dp4(err,c0) *~ c0,d,t);
err := multi_series(err - dp4(err,n0) *~ n0,d,t);
return tidy(err);
end:
#@ euclidean_spray
euclidean_spray := proc(x::RR1_4,d::posint := 4)
local C,p,q,r,s,t,E;
C := `new/E_chart`();
C["centre_set_numeric",x0];
C["set_degree_numeric",6];
p := eval(C["p"]);
E := metric_from_embedding(p(s),s[1],s[2])[1]:
E := tidy(multi_series(E,d,s[1],s[2]));
q := unapply(geodesic_spray_R2(E,s[1],s[2],d),s);
r := multi_series(p(q(s)),d,s[1],s[2]);
return unapply(r,s);
end:
#@ tubular_F0
tubular_F0 := [u[1],u[2],u[3],u[4]] +~ u[5] *~ dg0([u[1],u[2],u[3],u[4]]);
tubular_F0 := Vector([op(tubular_F0),g0([u[1],u[2],u[3],u[4]])]);
#@ tubular_F
tubular_F := unapply(tubular_F0,u);
#@ tubular_J0
tubular_J0 := map(expand,Matrix([seq(map(diff,tubular_F0,u[i]),i=1..5)]));
#@ tubular_J
tubular_J := unapply(tubular_J0,u);
#@ tubular_F_inv
tubular_F_inv := proc(x0::RR0_4)
local i,u0,du,a0,da,x1,tol;
tol := 10.^(-95);
u0 := Vector(evalf([op(x0),0]));
a0 := u0;
du := evalf(u0 - tubular_F(a0));
i := 0;
while Norm(du,2) > tol do
i := i+1;
da := LinearSolve(evalf(tubular_J(a0)),du);
a0 := a0 + da;
du := evalf(u0 - F(a0));
od;
return a0;
end:
#@ tubular_retract
tubular_retract := proc(x0::RR0_4)
local a0,x1;
a0 := tubular_F_inv(x0);
x1 := [a0[1],a0[2],a0[3],a0[4]];
x1 := x1 /~ nm4(x1);
return x1;
end:
######################################################################
#@ gauss_map0
gauss_map0 := unapply(
[2*x[3]*sqrt(2)*x[4]*x[1]-2*sqrt(2)*x[2]^3+x[3]^2*sqrt(2)*x[2]-x[4]^2*sqrt(2)*x[2]-3*x[1]*x[3]^2+6*x[3]*x[4]*x[2]+sqrt(2)*x[2]+2*x[1],
2*sqrt(2)*x[1]*x[2]^2+3*sqrt(2)*x[1]*x[3]^2+sqrt(2)*x[1]*x[4]^2-2*sqrt(2)*x[2]*x[3]*x[4]-6*x[1]*x[3]*x[4]-3*x[2]*x[3]^2-sqrt(2)*x[1]+2*x[2],
-4*x[3]*sqrt(2)*x[2]*x[1]-2*sqrt(2)*x[2]^2*x[4]-sqrt(2)*x[3]^2*x[4]-sqrt(2)*x[4]^3-3*x[3]^3+6*x[3]*x[4]^2+x[4]*sqrt(2)+2*x[3]] /~
sqrt(6+6*sqrt(2)*x[3]^3*x[4]-8*x[2]^2+8*x[2]^4+4*x[4]^2-4*x[3]^2-x[3]^4+8*x[4]^2*x[2]^2-4*x[3]*sqrt(2)*x[4]-8*x[3]^2*x[4]^2+2*x[4]^4),x);
######################################################################
#@ owl_proj
owl_proj := (x) -> [x[1],x[2],(x[3]-x[4])/sqrt(2)];