# The function homology_phi() defines a map from X to R^2\{0}, which
# induces a surjective map H_1(X) -> Z.
#@ homology_phi
homology_phi := (x) -> [1-x[3]/a_E-x[4], -sqrt(2)*x[1]];
# Given a 2 pi - periodic function u : R -> X, the function
# winding_number(u) gives the winding number of the composite
# homology_phi o u : R -> R^2\{0} around the origin. The answer
# may be incorrect if the function moves too rapidly. This
# can be fixed by supplying a number larger than the default
# value of 24 as the optional second argument.
#@ E_winding_number
E_winding_number := proc(u,n_,a_)
local v,w,t,a;
a := `if`(nargs > 2, a_, a_E0);
R2_winding_number((t) -> subs(a_E=a,homology_phi(u(t))),args[2..-1]);
end:
#@ E_winding_numbers
E_winding_numbers := (u,n_,a_) -> map(round,[
E_winding_number(u,args[2..-1]),
E_winding_number((t) -> act_R4[LLL](u(t)),args[2..-1]),
E_winding_number((t) -> act_R4[ M](u(t)),args[2..-1]),
E_winding_number((t) -> act_R4[ LM](u(t)),args[2..-1])
]);
#@ cohomology_vector
cohomology_vector := proc(f,n_,a_)
local a,w,k,c,t;
a := `if`(nargs > 2, a_, a_E0);
w := NULL;
for k from 5 to 8 do
c := unapply(evalf(subs(a_E=a,f(c_E[k](t)))),t);
w := w,R2_winding_number(c,args[2..-1]);
od:
return [w];
end: