assume(a_E > 0 and a_E < 1);
######################################################################
# Functions involved in defining the surface X
f_1 := (x::RR_4) -> (2*x[2]^2+(x[4]-1-x[3]/a_E)^2); #@ f_1
f_2 := (x::RR_4) -> (2*x[1]^2+(x[4]-1+x[3]/a_E)^2); #@ f_2
f := (x::RR_4) -> f_1(x)*f_2(x); #@ f
g_0 := (x::RR_4) -> ((1+1/a_E^2)*x[3]^2-2)*x[4]+1/a_E*(x[1]^2-x[2]^2)*x[3]; #@ g_0
g_1 := (x::RR_4) -> x[2]^2 - x[1]^2 - (a_E+1/a_E)*x[3]*x[4]; #@ g_1
g := (x::RR_4) -> (1/a_E^2-1)*x[3]^2*x[4] - 2*(x[1]^2+x[2]^2)*x[4]
- 2*x[4]^3 + 1/a_E*(x[1]^2-x[2]^2)*x[3]; #@ g
# rho(xx) is the squared norm of xx
rho := (x::RR_4) -> add(x[i]^2,i=1..4); #@ rho
# simplify_E is a simplification routine which is useful for
# tidying up various expressions that arise when studying EX(a).
# We have told Maple to assume that a_E > 0 and a_E < 1, and
# Maple is able to deduce many consequences of these inequalities,
# but not all of them. In particular, there are various identities
# between square roots of polynomials that are valid when 0 < a_E < 1
# but which are not automatically used by Maple. The function
# simplify_E() applies various identities of this type.
#@ simplify_E
simplify_E := proc(u)
local v;
v := simplify(u);
v := simplify(subs(sqrt(1-4*a_E^4)=sqrt(1+2*a_E^2) * sqrt(1-2*a_E^2),v));
v := simplify(subs(sqrt(2-2*a_E^2)=sqrt(2)*sqrt(1-a_E^2),v));
v := simplify(subs(sqrt(1-a_E^4)=sqrt(1+a_E^2) * sqrt(1-a_E^2),v));
v := simplify(subs(sqrt(sqrt(2)*sqrt(1-a_E^2)+2*a_E^2) =
sqrt(1+a_E^2)*(sqrt(2)+2*sqrt(1-a_E^2))/
sqrt(sqrt(2)*sqrt(-a_E^2+1)+1)/sqrt(sqrt(2)*sqrt(-a_E^2+1)+2)
,v));
return(v);
end:
#@ is_member_E
is_member_E := proc(x)
type(x,list) and
nops(x) = 4 and
simplify_E(rho(x) - 1) = 0 and
simplify_E(g_0(x)) = 0;
end:
#@ is_equal_E
is_equal_E := proc(x,y)
evalb(simplify_E(x -~ y) = [0$4]);
end:
######################################################################
#@ act_R4
act_R4[1] := (x) -> [ x[1], x[2], x[3], x[4]];
act_R4[L] := (x) -> [-x[2], x[1], x[3],-x[4]];
act_R4[LL] := (x) -> [-x[1],-x[2], x[3], x[4]];
act_R4[LLL] := (x) -> [ x[2],-x[1], x[3],-x[4]];
act_R4[M] := (x) -> [ x[1],-x[2],-x[3],-x[4]];
act_R4[LM] := (x) -> [ x[2], x[1],-x[3], x[4]];
act_R4[LLM] := (x) -> [-x[1], x[2],-x[3],-x[4]];
act_R4[LLLM] := (x) -> [-x[2],-x[1],-x[3], x[4]];
act_R4[N] := (x) -> [ x[1],-x[2], x[3], x[4]];
act_R4[LN] := (x) -> [ x[2], x[1], x[3],-x[4]];
act_R4[LLN] := (x) -> [-x[1], x[2], x[3], x[4]];
act_R4[LLLN] := (x) -> [-x[2],-x[1], x[3],-x[4]];
act_R4[MN] := (x) -> [ x[1], x[2],-x[3],-x[4]];
act_R4[LMN] := (x) -> [-x[2], x[1],-x[3], x[4]];
act_R4[LLMN] := (x) -> [-x[1],-x[2],-x[3],-x[4]];
act_R4[LLLMN]:= (x) -> [ x[2],-x[1],-x[3], x[4]];
#@ act_E
act_E := eval(act_R4):
######################################################################
#@ v_E
v_E[ 0] := [ 0, 0, 1, 0]:
v_E[ 1] := [ 0, 0, -1, 0]:
v_E[ 2] := [ 1, 0, 0, 0]:
v_E[ 3] := [ 0, 1, 0, 0]:
v_E[ 4] := [ -1, 0, 0, 0]:
v_E[ 5] := [ 0, -1, 0, 0]:
v_E[ 6] := [ 1, 1, 0, 0] /~ sqrt(2):
v_E[ 7] := [ -1, 1, 0, 0] /~ sqrt(2):
v_E[ 8] := [ -1, -1, 0, 0] /~ sqrt(2):
v_E[ 9] := [ 1, -1, 0, 0] /~ sqrt(2):
v_E[10] := [ 0, 0, sqrt((2*a_E^2)/(1+a_E^2)), sqrt((1-a_E^2)/(1+a_E^2))]:
v_E[11] := [ 0, 0, sqrt((2*a_E^2)/(1+a_E^2)), -sqrt((1-a_E^2)/(1+a_E^2))]:
v_E[12] := [ 0, 0, -sqrt((2*a_E^2)/(1+a_E^2)), -sqrt((1-a_E^2)/(1+a_E^2))]:
v_E[13] := [ 0, 0, -sqrt((2*a_E^2)/(1+a_E^2)), sqrt((1-a_E^2)/(1+a_E^2))]:
######################################################################
#@ c_E_tau
c_E_tau[5] := (t) -> -sqrt((1/a_E^2-1)/2) * sin(t/2)^2;
#@ c_E_p
c_E_p[3] := (t) -> (a_E^2+1)*sin(t)^2+sqrt((a_E^2+1)*(-a_E^2+1+2*a_E^2*sin(t)^2)+(-a_E^2+1)^2*cos(t)^4);
c_E_p[5] := unapply((c_E_tau[5](t) - a_E)*(c_E_tau[5](t) - 1/a_E),t);
#@ c_E
c_E[ 0] := (t) -> [cos(t),sin(t),0,0];
c_E[ 1] := (t) -> [sin(t)/sqrt(2),sin(t)/sqrt(2),cos(t),0];
c_E[ 2] := unapply(simplify(act_E[L](c_E[1](t))),t);
c_E[3] := unapply(
[ 0,
sqrt((2*(1-a_E^2)+4*a_E^2*sin(t)^2)/c_E_p[3](t))*sin(t),
sqrt(2/(1+1/a_E^2))*cos(t),
-sqrt(2/(1+1/a_E^2))*(1/a_E-a_E+2*a_E*sin(t)^2)/c_E_p[3](t)*cos(t)
],t);
c_E[ 4] := unapply(simplify(act_E[L](c_E[3](t))),t);
c_E[5] := unapply(
[ (1/a_E^2-1)^(3/4) * 2^(-5/4) * sqrt(a_E*(1+sin(t/2)^2)/c_E_p[5](t)) * sin(t),
0,
sqrt((1 - 2*a_E*c_E_tau[5](t))/c_E_p[5](t)),
sqrt((1 - 2*a_E*c_E_tau[5](t))/c_E_p[5](t)) * c_E_tau[5](t)
],t);
c_E[ 6] := unapply(simplify(act_E[L](c_E[5](t))),t);
c_E[ 7] := unapply(simplify(act_E[M](c_E[5](t))),t);
c_E[ 8] := unapply(simplify(act_E[LM](c_E[5](t))),t);
######################################################################
#@ c_check_E
c_check_E[0] := proc(x::RR_4) x[3] = 0 and x[4] = 0; end:
c_check_E[1] := proc(x::RR_4) simplify(x[1]-x[2]) = 0 and simplify(x[4]) = 0; end:
c_check_E[2] := proc(x::RR_4) simplify(x[1]+x[2]) = 0 and simplify(x[4]) = 0; end:
c_check_E[3] := proc(x::RR_4)
evalb(simplify(x[1]) = 0 and is(simplify( g_1(x)) > 0));
end:
c_check_E[4] := proc(x::RR_4)
evalb(simplify(x[2]) = 0 and is(simplify(-g_1(x)) > 0));
end:
c_check_E[5] := proc(x::RR_4)
evalb(simplify(x[2]) = 0 and is(simplify(-g_1(x)) <= 0) and is(x[3] >= 0));
end:
c_check_E[6] := proc(x::RR_4)
local y;
y := simplify(y_proj(x));
evalb(simplify(x[1]) = 0 and is(simplify( g_1(x)) <= 0) and is(x[3] >= 0));
end:
c_check_E[7] := proc(x::RR_4)
local y;
y := simplify(y_proj(x));
evalb(simplify(x[2]) = 0 and is(simplify(-g_1(x)) <= 0) and is(x[3] <= 0));
end:
c_check_E[8] := proc(x::RR_4)
local y;
y := simplify(y_proj(x));
evalb(simplify(x[1]) = 0 and is(simplify( g_1(x)) <= 0) and is(x[3] <= 0));
end:
######################################################################
#@ c_param_E
c_param_E[0] := (x::RR_4) -> arctan(x[2],x[1]);
c_param_E[1] := (x::RR_4) -> arctan(sqrt(2)*x[2],x[3]);
c_param_E[2] := (x::RR_4) -> arctan(sqrt(2)*x[2],x[3]);
c_param_E[3] := proc(x::RR_4)
local S,C,m;
C := x[3]/sqrt(2)/sqrt(a_E/(a_E+1/a_E));
m := sqrt((-2*a_E^2+2+4*a_E^2*(1-C^2))/((a_E^2+1)*(1-C^2)+sqrt((a_E^2+1)*(-a_E^2+1+2*a_E^2*(1-C^2))+(-a_E^2+1)^2*C^4)));
S := x[2]/m;
arctan(S,C);
end:
c_param_E[4] := (x::RR_4) -> c_param_E[3](act_R4[LLL](x));
c_param_E[5] := proc(x::RR_4)
local y2,m,S,C;
y2 := (1/2)*(-x[1]^2+x[2]^2-(a_E+1/a_E)*x[3]*x[4])/a_E:
C := 1-2*y2*sqrt(2)/sqrt((1/a_E-a_E)/a_E):
m := sqrt(sqrt(2)*sqrt((1/a_E-a_E)/a_E)*(1/a_E-a_E)*(3/2-C/2)/((-(1/2)*sqrt(2)*sqrt((1/a_E-a_E)/a_E)*(1-C)/2-a_E)*(-(1/2)*sqrt(2)*sqrt((1/a_E-a_E)/a_E)*(1-C)/2-1/a_E))):
S := x[1]*4/sqrt(2)/m:
arctan(S,C);
end:
c_param_E[6] := (x::RR_4) -> c_param_E[5](act_R4[LLL](x));
c_param_E[7] := (x::RR_4) -> c_param_E[5](act_R4[M ](x));
c_param_E[8] := (x::RR_4) -> c_param_E[5](act_R4[LM ](x));
######################################################################
# The functions below are designed for use with symbolic arguments.
# They return FAIL if Maple is unable to decide whether the relevant
# inequalities hold. Similar functions for use with numerical
# arguments (after setting a numerical value for a_E) are defined
# in EX0.mpl.
#@ is_in_F4_E
is_in_F4_E := proc(x::RR_4)
if is(x[1] >= 0) and is(x[2] >= 0) then
return true;
elif is(x[1] < 0) or is(x[2] < 0) then
return false;
else
return FAIL;
fi;
end:
#@ is_in_F16_E
is_in_F16_E := proc(x::RR_4)
if is(x[1] >= 0) and is(x[2] >= 0) and
is(x[3] >= 0) and is(simplify(g_1(x)) >= 0) then
return true;
elif is(x[1] < 0) or is(x[2] < 0) and
is(x[3] < 0) or is(simplify(g_1(x)) < 0) then
return false;
else
return FAIL;
fi;
end:
#@ retract_F4_E
retract_F4_E := (x::RR_4) -> [abs(x[1]),abs(x[2]),x[3],x[4]];
#@ retract_F16_E
retract_F16_E := proc(x::RR_4)
if is(g_1(x) >= 0) then
return [abs(x[1]),abs(x[2]),abs(x[3]),-abs(x[4])];
elif is(g_1(x) <= 0) then
return [abs(x[2]),abs(x[1]),abs(x[3]),-abs(x[4])];
else
return FAIL;
fi;
end:
retract_F16_E_alt := (x) ->
((abs(x[1])+abs(x[2]))/2) *~ [1,1,0,0] +~
(signum(x[3])*signum(x[4]) * (abs(x[1])-abs(x[2]))/2) *~ [-1,1,0,0] +~
[0,0,abs(x[3]),-abs(x[4])]: