Enumeration of curves contained in a hyperplane (Section 5.4)

We provide here the code of the calculations described in Section 5.4 of the accompanying article. The problem we want to solve is the enumeration of curves in the projective space $\mathbb{P}^n$ meeting linear subspaces and contained in a $k$-dimensional linear subspace.

The incident variety $S\subsetneq \mathbb{P}^n \times G(n, n+1)$ is the flag variety $F(1,k,n-k)$. See Standard Constructions for our convention on the notation of flag varieties. Let us consider the case $n=3$ and $k=2$.

julia> n = 3;

julia> k = 2;

julia> S = flag_variety(GKM_graph, [1, k, n-k]);

Now, let us define the pull-backs of a point and of a line in $\mathbb{P}^3$.

julia> vert = D -> ["$a$b$c" for (a,b,c) in Iterators.product(Iterators.repeated(1:4, 3)...) if (a<=D && b < c && b != a && c != a)];

julia> pb_point = poincare_dual(gkm_subgraph_from_vertices(S, vert(1)));

julia> pb_line = poincare_dual(gkm_subgraph_from_vertices(S, vert(2)));

We want to compute the number of curves of degree $d$ in $\mathbb{P}^3$ meeting $r$ lines and $s$ points, assumed in general position. We must have $m=r+s$ and $r+2s=3d+2$, where $m$ is the number of marks. Let us compute the case of cubics, that is $d=3$.

julia> s, r = 5, 1; # planar cubics meeting 5 points and 1 line

julia> m = r + s;

julia> beta = curve_class(S, "123", "213"); # curve class of a line

julia> d = 3; # we are taking cubics

julia> P = prod(i -> ev(i, pb_line), 1:r; init = 1) * prod(i -> ev(i, pb_point), (r+1):m; init = 1);

julia> gromov_witten(S, d * beta, m, P; fast_mode = true, show_bar = false)
0

Note that this result is expected, as there are no planar cubics meeting $5$ points. In order to get non-trivial results, we can change the values of $r$ and $s$. For example,

julia> s, r = 1, 9; # planar cubics meeting 1 point and 9 lines

julia> m = r + s;

julia> P = prod(i -> ev(i, pb_line), 1:r; init = 1) * prod(i -> ev(i, pb_point), (r+1):m; init = 1);

julia> gromov_witten(S, d * beta, m, P; fast_mode = true) # about an hour in our machine
1392

We may consider the same problem with $n=4$ and $k=2$. That is, planar cubics in $\mathbb{P}^4$ meeting $s$ points, $r$ lines and $p$ planes. Here an example:

julia> n = 4;

julia> k = 2;

julia> S = flag_variety(GKM_graph, [1, k, n-k]);

julia> beta = curve_class(S, "123", "213");

julia> vert = D -> ["$a$b$c" for (a,b,c) in Iterators.product(Iterators.repeated(1:5, 3)...) if (a<=D && b < c && b != a && c != a)];

julia> pb_point = poincare_dual(gkm_subgraph_from_vertices(S, vert(1)));

julia> pb_line = poincare_dual(gkm_subgraph_from_vertices(S, vert(2)));

julia> pb_plane = poincare_dual(gkm_subgraph_from_vertices(S, vert(3)));

julia> s, r, p = 0, 6, 2; #planar cubics meeting 6 lines and 2 planes

julia> m = s + r + p;

julia> P = prod(i -> ev(i, pb_point), 1:s; init=1) * prod(i -> ev(i, pb_line), (s+1):(s+r);init=1) * prod(i -> ev(i, pb_plane), (s+r+1):m;init=1);

julia> d = 3;

julia> gromov_witten(S, d * beta, m, P; fast_mode = true, show_bar = true) # about 17 minutes in our machine
60

On the other hand, if we change the last lines, we get the following,

julia> s, r, p = 0, 5, 4; #planar cubics meeting 5 lines and 4 planes

julia> m = s + r + p;

julia> P = prod(i -> ev(i, pb_point), 1:s; init=1) * prod(i -> ev(i, pb_line), (s+1):(s+r);init=1) * prod(i -> ev(i, pb_plane), (s+r+1):m;init=1);

julia> gromov_witten(S, d * beta, m, P; fast_mode = true, show_bar = true)  # about an hour in our machine
540