# This file finds the 27 lines on the cubic surface g = 0.
#@ find_cayley_lines
find_cayley_lines := proc()
local a,aa,aa0,b,bb,bb0,rels,cell_rules,all_sols,sols,R;
global cayley_lines;
# aa and bb span a Cayley line if the terms in rels are all zero.
aa := [seq(a[i],i=1..4)];
bb := [seq(b[i],i=1..4)];
rels := [coeffs(expand(g(aa +~ t *~ bb)),t)];
# We can describe each Cayley line in terms of its row-reduced
# basis. This divides the relevant Grassmannian into six Schubert
# cells, as follows.
cell_rules := [
{a[1]=1,a[2]=0,b[1]=0,b[2]=1},
{a[1]=1,a[3]=0,b[1]=0,b[2]=0,b[3]=1},
{a[1]=1,a[4]=0,b[1]=0,b[2]=0,b[3]=0,b[4]=1},
{a[1]=0,a[2]=1,a[3]=0,b[1]=0,b[2]=0,b[3]=1},
{a[1]=0,a[2]=1,a[4]=0,b[1]=0,b[2]=0,b[3]=0,b[4]=1},
{a[1]=0,a[2]=0,a[3]=1,a[4]=0,b[1]=0,b[2]=0,b[3]=0,b[4]=1}
]:
# We now find the solutions in each cell.
all_sols := NULL:
for R in cell_rules do
aa0 := subs(R,aa);
bb0 := subs(R,bb);
sols := [solve(subs(R,rels),{op(aa0),op(bb0)} minus {0,1})];
sols := map(s -> simplify_E(subs(s,[aa0,bb0])),sols);
all_sols := all_sols,op(sols);
od:
cayley_lines := {all_sols}:
return cayley_lines;
end:
######################################################################
# The procedure below executes automatically because of the () at the end.
# This sets cayley_lines in essentially the same way as find_cayley_lines(),
# but the result is ordered in a more structured way and annotated.
#@ cayley_lines
proc()
global cayley_lines;
local p1,p2;
p1 := sqrt(-4*a_E^2+2);
p2 := sqrt(-4*a_E^4+6*a_E^2-2);
cayley_lines := [
[[1, 0, 0, 0],
[0, 1, 0, 0]], # C[0]
[[1, 1, 0, 0],
[0, 0, 1, 0]], # C[1]
[[1,-1, 0, 0],
[0, 0, 1, 0]], # C[2]
[[1, 0, -4*a_E/p1, 2/p1],
[0, 1, 0, 0]],
[[1, 0, 0, 0],
[0, 1, -4*a_E/p1, -2/p1]],
[[1, 0, 4*a_E/p1, -2/p1], [0, 1, 0, 0]],
[[1, 0, 0, 0], [0, 1, 4*a_E/p1, 2/p1]],
[[1, 0, -(1/2)*(I*sqrt(2)-p1)*a_E/(a_E^2-1), (1/2*I)*sqrt(2)],
[0, 1, -(1/2)*(I*sqrt(2)*p1+4*a_E^2-2)*a_E/(p1*(a_E^2-1)), -(1/2*I)*sqrt(2)]],
[[1, 0, -(1/2)*(I*sqrt(2)-p1)*a_E/(a_E^2-1), (1/2*I)*sqrt(2)],
[0, 1, (1/2)*(I*sqrt(2)*p1+4*a_E^2-2)*a_E/(p1*(a_E^2-1)), (1/2*I)*sqrt(2)]],
[[1, 0, (1/2)*(I*sqrt(2)-p1)*a_E/(a_E^2-1), -(1/2*I)*sqrt(2)],
[0, 1, -(1/2)*(I*sqrt(2)*p1+4*a_E^2-2)*a_E/(p1*(a_E^2-1)), -(1/2*I)*sqrt(2)]],
[[1, 0, (1/2)*(I*sqrt(2)-p1)*a_E/(a_E^2-1), -(1/2*I)*sqrt(2)],
[0, 1, (1/2)*(I*sqrt(2)*p1+4*a_E^2-2)*a_E/(p1*(a_E^2-1)), (1/2*I)*sqrt(2)]],
[[1, 0, -(1/2)*(I*sqrt(2)+p1)*a_E/(a_E^2-1), (1/2*I)*sqrt(2)],
[0, 1, -(1/2)*(I*sqrt(2)*p1-4*a_E^2+2)*a_E/(p1*(a_E^2-1)), -(1/2*I)*sqrt(2)]],
[[1, 0, -(1/2)*(I*sqrt(2)+p1)*a_E/(a_E^2-1), (1/2*I)*sqrt(2)],
[0, 1, (1/2)*(I*sqrt(2)*p1-4*a_E^2+2)*a_E/(p1*(a_E^2-1)), (1/2*I)*sqrt(2)]],
[[1, 0, (1/2)*(I*sqrt(2)+p1)*a_E/(a_E^2-1), -(1/2*I)*sqrt(2)],
[0, 1, -(1/2)*(I*sqrt(2)*p1-4*a_E^2+2)*a_E/(p1*(a_E^2-1)), -(1/2*I)*sqrt(2)]],
[[1, 0, (1/2)*(I*sqrt(2)+p1)*a_E/(a_E^2-1), -(1/2*I)*sqrt(2)],
[0, 1, (1/2)*(I*sqrt(2)*p1-4*a_E^2+2)*a_E/(p1*(a_E^2-1)), (1/2*I)*sqrt(2)]],
[[1, 0, -(1/2)*(-2*a_E^2+p2+2)*a_E/(a_E^2-1)^(3/2), 1/(2*sqrt(a_E^2-1))],
[0, 1, a_E*(-2*a_E^2+1+p2)/(sqrt(a_E^2-1)*p2), -1/(2*sqrt(a_E^2-1))]],
[[1, 0, -(1/2)*(-2*a_E^2+p2+2)*a_E/(a_E^2-1)^(3/2), 1/(2*sqrt(a_E^2-1))],
[0, 1, -a_E*(-2*a_E^2+1+p2)/(sqrt(a_E^2-1)*p2), 1/(2*sqrt(a_E^2-1))]],
[[1, 0, (1/2)*(-2*a_E^2+p2+2)*a_E/(a_E^2-1)^(3/2), -1/(2*sqrt(a_E^2-1))],
[0, 1, a_E*(-2*a_E^2+1+p2)/(sqrt(a_E^2-1)*p2), -1/(2*sqrt(a_E^2-1))]],
[[1, 0, (1/2)*(-2*a_E^2+p2+2)*a_E/(a_E^2-1)^(3/2), -1/(2*sqrt(a_E^2-1))],
[0, 1, -a_E*(-2*a_E^2+1+p2)/(sqrt(a_E^2-1)*p2), 1/(2*sqrt(a_E^2-1))]],
[[1, 0, -(1/2)*( 2*a_E^2+p2-2)*a_E/(a_E^2-1)^(3/2), -1/(2*sqrt(a_E^2-1))],
[0, 1, a_E*( 2*a_E^2-1+p2)/(sqrt(a_E^2-1)*p2), -1/(2*sqrt(a_E^2-1))]],
[[1, 0, -(1/2)*( 2*a_E^2+p2-2)*a_E/(a_E^2-1)^(3/2), -1/(2*sqrt(a_E^2-1))],
[0, 1, -a_E*( 2*a_E^2-1+p2)/(sqrt(a_E^2-1)*p2), 1/(2*sqrt(a_E^2-1))]],
[[1, 0, (1/2)*( 2*a_E^2+p2-2)*a_E/(a_E^2-1)^(3/2), 1/(2*sqrt(a_E^2-1))],
[0, 1, a_E*( 2*a_E^2-1+p2)/(sqrt(a_E^2-1)*p2), -1/(2*sqrt(a_E^2-1))]],
[[1, 0, (1/2)*( 2*a_E^2+p2-2)*a_E/(a_E^2-1)^(3/2), 1/(2*sqrt(a_E^2-1))],
[0, 1, -a_E*( 2*a_E^2-1+p2)/(sqrt(a_E^2-1)*p2), 1/(2*sqrt(a_E^2-1))]],
[[1, sqrt(3-2*a_E^2-2*sqrt(2)*sqrt(-a_E^2+1))/sqrt(2*a_E^2-1), 0, 0],
[0, 0, 1, (1/2)*sqrt(2)*sqrt(-a_E^2+1)/a_E]],
[[1, sqrt(3-2*a_E^2+2*sqrt(2)*sqrt(-a_E^2+1))/sqrt(2*a_E^2-1), 0, 0],
[0, 0, 1, -(1/2)*sqrt(2)*sqrt(-a_E^2+1)/a_E]],
[[1, -sqrt(3-2*a_E^2-2*sqrt(2)*sqrt(-a_E^2+1))/sqrt(2*a_E^2-1), 0, 0],
[0, 0, 1, (1/2)*sqrt(2)*sqrt(-a_E^2+1)/a_E]],
[[1, -sqrt(3-2*a_E^2+2*sqrt(2)*sqrt(-a_E^2+1))/sqrt(2*a_E^2-1), 0, 0],
[0, 0, 1, -(1/2)*sqrt(2)*sqrt(-a_E^2+1)/a_E]]
]:
end():
#@ c_cayley
c_cayley[1] := (t) -> [sqrt((1-2*a_E^2)/(1+2*a_E^2)/3)*sin(t),
-cos(t),
-4*a_E/sqrt(6)/sqrt(1+2*a_E^2)*sin(t),
2/sqrt(6)/sqrt(1+2*a_E^2)*sin(t)];
c_cayley[2] := unapply(simplify(act_E[L](c_cayley[1](t))),t);
c_cayley[3] := unapply(simplify(act_E[L](c_cayley[2](t))),t);
c_cayley[4] := unapply(simplify(act_E[L](c_cayley[3](t))),t);
######################################################################
# Assuming that ab=[a,b], where a and b are linearly independent in C^4,
# the function is_in_line(ab,c) will return true if c lies in the C-linear
# span of a and b.
#@ is_in_line
is_in_line := proc(ab,c)
local i,d,M,N,J;
M := Matrix([op(ab),c]);
for i from 1 to 4 do
J := sort([op({1,2,3,4} minus {i})]);
N := SubMatrix(M,1..3,J);
d := simplify(Determinant(N));
if d <> 0 then return false; fi;
od:
return true;
end: