Quantum Cohomology
Much of this can be found in [CK99, Chapter 8 and 9.3]. Let $X$ be a GKM space (see Definition). Its (small) equivariant quantum cohomology $QH_T^*(X)$ is given additively by $H_T^*(X;\mathbb{Q})\otimes \widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}$, where $\widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}$ is the completion of the semigroup ring $H_2^\text{eff}(X;\mathbb{Z})$ of effective curve classes. The element corresponding to $\beta\in H_2^\text{eff}(X;\mathbb{Z})$ is written as $q^\beta$.
The $H_T(\text{pt};\mathbb{Q})$-module $QH_T^*(X)$ is a commutative associative unital $H_T(\text{pt};\mathbb{Q})$-algebra via the (small) equivariant quantum product $\ast$ defined as follows. For every classes $a,b,c\in H_T^*(X;\mathbb{Q})$ we have
\[ \langle a \ast b, c \rangle = \sum_{\beta\in H_2^\text{eff}(X;\mathbb{Z})} GW^T_{X,0,3,\beta}(a,b,c) \cdot q^\beta\]
where:
- The equivariant Poincaré pairing is given by $\langle a,b\rangle := \int_X a\cup b\in H_T^*(\text{pt};\mathbb{Q})$, where we use equivariant integration,
- We denote by $GW^T_{X,0,3,\beta}(a,b,c)\in H_T^*(\text{pt};\mathbb{Q})$ the equivariant Gromov–Witten invariant for $X$ in class $\beta$ of genus $0$ with $3$ marked points.
Note that setting all the equivariant parameters $t_1,\dots,t_{\dim_\mathbb{C}(T)}$ to zero recovers the standard (small, non-equivariant) quantum product.
Structure Constants
Given any linear basis $e_1,\dots,e_N$ of $H_T^*(X;\mathbb{Q})\otimes \text{Frac}(H_T^*(\text{pt}; \mathbb{Q}))$ over $\text{Frac}(H_T^*(\text{pt}; \mathbb{Q}))\cong \mathbb{Q}(t_1,\dots,t_r)$, the associated structure constants are $(c_{i,j,k})_{i,j,k=1}^N$ where
\[c_{i,j,k}\in \mathbb{Q}(t_1,\dots,t_r)\otimes \widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}\]
is the coefficient of $e_k$ in $e_i\ast e_j$. Let us denote the coefficient of $q^\beta$ in $c_{i,j,k}$ by $c_{i,j,k}(\beta)\in\mathbb{Q}(t_1,\dots,t_r)$.
When $(X,T)$ is a compact Hamiltonian or projective GKM space, and $e_1,\dots,e_N$ is chosen to be a linear basis of $H_T^*(X;\mathbb{Q})$ over $H_T^*(\text{point};\mathbb{Q})\cong \mathbb{Q}[t_1,\dots,t_r]$, we have
\[ c_{i,j,k}(\beta)\in\mathbb{Q}[t_1,\dots,t_r]\]
for all $i,j,k,\beta$.
Choice of basis
Since structure constants depend on a choice of basis, let us introduce some common choices and explain structure constants for mixed bases.
The standard basis
In general, when no basis is specified explicitly, all structure constants are computed with respect to the basis $e_1,\dots,e_N$, which we call the standard basis. Namely, let $N$ be the number of vertices of the GKM graph $G$. For each $i\in\{1,\dots,N\}$, let
\[ e_i \in H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)\]
be class that localizes to $1$ at the $i$-th fixed point and to $0$ at every other fixed point. This uniquely defines a class by the GKM theorem [GKM98].
- The $e_i$ are only well-defined as elements of $H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)$, not of $H_T^*(X;\mathbb{Q})$.
- Since the standard basis over $\mathbb{Q}(t_1,\dots,t_r)$, the resulting structure constants $c_{i,j,k}(\beta)$ can fail to be polynomials in $t_1,\dots,t_r$ even when $G$ is the GKM graph of a compact Hamiltonian or projective GKM space $(X,T)$.
In our implementation, $e_i$ is printed as e[i] (see Cohomology).
The fixed point basis
The fixed point basis is given by $f_1,\dots,f_N$, where $N$ is the number of vertices of $G$ and
\[ f_i = \left( \prod_{\epsilon\in E(G)_i} \alpha(\epsilon) \right) e_i \in H_T^*(X;\mathbb{Q}).\]
Mathematically, we have $\prod_{\epsilon\in E(G)_i} \alpha(\epsilon) = e_T(T_{p_i}X)$ when $G$ is realized by the GKM space $X$ and $p_i\in X^T$ corresponds to the $i$-th vertex of $G$.
- Sometimes, we use the notation $f_i = PD(p_i)$ as $f_i$ is the equivariant Poincaré dual of $p_i\in X^T$.
- The collection $(f_i)_{i=1}^N$ is not a $\mathbb{Q}[t_1,\dots,t_r]$-linear basis for $H_T^*(X;\mathbb{Q})$, but it is a $\mathbb{Q}(t_1,\dots,t_r)$-linear basis for $H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)$.
- The element $f_i$ can be obtained computationally as
point_class(i, G)(seepoint_class).
Mixing the bases
In some functions (such as QH_structure_constants) we use two different bases to define $c_{i,j,k}(\beta)$. Namely, given two bases $(a_i)$ and $(b_i)$, we let $c_{i,j,k}(\beta)$ be the coefficient of $b_k q^\beta$ in $a_i \ast a_j$. In this case, we say that $(c_{i,j,k}(\beta))$ are the structure constants with respect to the input basis $(a_i)$ and output basis $(b_i)$.
GKMtools.QH_structure_constants — Function
QH_structure_constants(G::AbstractGKM_graph; refresh::Bool=false)Return the structure constants of the equivariant quantum cohomology $QH_T^*(X)$ where $X$ is the GKM space realizing the GKM graph. The structure constants are returned with respect to the fixed point basis as input basis and the standard basis as output basis (see Mixing the bases). This has the advantage that all entries are polynomials in the equivariant parameters when G is the GKM graph of a compact Hamiltonian or projective GKM space.
- This requires
is_strictly_nef(G)==true, as this guarantees that there are at most finitely many curve classes $\beta$ with non-zero coefficients for $q^\beta$. - If
is_strictly_nef(G)==false, use the method ofQH_structure_constantsbelow that specifies a specific $\beta$.
- As this computation might be expensive, the result is stored in
Gfor later use. If the requested structure constants have been computed before, they will not be computed afresh unless the optional argumentrefreshis set totrue.
Output format:
The output type is a Julia dictionary of type Dict{CurveClass_type, Array{Any, 3}}. For each curve class $\beta$, the corresponding value is a 3-dimensional array of type Array{Any, 3}. If ans denotes this dictionary, then ans[beta][i, j, k] is the the $q^\beta$-coefficient of $PD(v_i) \ast PD(v_j)$ localized at $v_k$, where $v_i, v_j, v_k$ represent the fixed points with indices $i,j,k$, respectively, and $PD$ represents the equivariant Poincaré dual (cf. fixed point basis).
Optional arguments:
refresh::Bool:falseby default. Iftrue, then this will overwrite any previously calculated $QH_T$ structure constants ofG.
Example
In the following example, we calculate the structure constants of $\mathbb{P}^1$. The fixed point basis $f_1,f_2$ (see above) is given by f1 = (t1 - t2)*e[1] and f2 = (-t1 + t2)*e[2]. Let us check that
\[f_1 \ast f_1 = (t_1 - t_2) f_1 + q = (t_1 - t_2)^2 e_1 + q(e_1 + e_2)\]
noting that $e_1+e_2=1$. Similarly, we will check that
\[f_1 \ast f_2 = q = q(e_1 + e_2)\]
and
\[f_2 \ast f_2 = (-t_1 + t_2) f_2 + q = (-t_1 + t_2)^2 e_2 + q(e_1 + e_2).\]
The following code verifies these identities.
julia> P1 = projective_space(GKM_graph, 1);
julia> S = QH_structure_constants(P1; show_progress=false);
julia> curve_classes = collect(keys(S));
julia> S[curve_classes[1]] # curve class 0
2×2×2 Array{Any, 3}:
[:, :, 1] =
t1^2 - 2*t1*t2 + t2^2 0
0 0
[:, :, 2] =
0 0
0 t1^2 - 2*t1*t2 + t2^2
julia> S[curve_classes[2]] # line class
2×2×2 Array{Any, 3}:
[:, :, 1] =
1 1
1 1
[:, :, 2] =
1 1
1 1QH_structure_constants(G::AbstractGKM_graph, beta::CurveClass_type; refresh::Bool=false, P_input=nothing, show_progress::Bool=true)Return the $q^\beta$-coefficients of the structure constants of the equivariant quantum cohomology $QH_T^*(X)$, where $X$ is the GKM space (see Definition) realizing the GKM graph.
- As this computation might be expensive, the result is stored in
Gfor later use. If the requested structure constants have been computed before, they will not be computed afresh unless the optional argumentrefreshis set totrue.
Output format:
The output type is Array{Any, 3}. If ans denotes the returned object, then ans[i, j, k] is the the $q^\beta$-coefficient of $PD(v_i) \ast PD(v_j)$ localized at $v_k$, where $v_i, v_j, v_k$ represent the fixed points with indices $i,j,k$, respectively, and $PD$ represents the Poincaré dual.
Optional arguments:
refresh::Bool:falseby default. Iftrue, then this will overwrite any previously calculated $QH_T$ structure constants ofG.
Example
Let us repeat the example of $\mathbb{P}^1$ above by specifying each curve class $\beta$ separately.
julia> P1 = projective_space(GKM_graph, 1);
julia> beta = curve_class(P1, Edge(1, 2));
julia> QH_structure_constants(P1, 0*beta; show_progress=false)
2×2×2 Array{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}, 3}:
[:, :, 1] =
t1^2 - 2*t1*t2 + t2^2 0
0 0
[:, :, 2] =
0 0
0 t1^2 - 2*t1*t2 + t2^2
julia> QH_structure_constants(P1, beta; show_progress=false)
2×2×2 Array{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}, 3}:
[:, :, 1] =
1 1
1 1
[:, :, 2] =
1 1
1 1
julia> QH_structure_constants(P1, 2*beta; show_progress=false)
2×2×2 Array{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}, 3}:
[:, :, 1] =
0 0
0 0
[:, :, 2] =
0 0
0 0
julia> QH_structure_constants(P1, -1 * beta; show_progress=false)
2×2×2 Array{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}, 3}:
[:, :, 1] =
0 0
0 0
[:, :, 2] =
0 0
0 0GKMtools.QH_structure_constants_in_basis — Function
QH_structure_constants_in_basis(G::AbstractGKM_graph, b::Matrix; setPreferredBasis::Bool=false)Return all structure constants of G that have been calculated so far with respect to the given basis. A smart choice of basis can drastically simplify the presentation of the ring $QH_T^*(X)$. Here, we use the given basis b both as input basis and as output basis for computing the structure constants (cf. mixing the bases).
- This does not calculate any structure constants afresh. To do so, use
QH_structure_constants. - This will omit any curve classes in which all structure constants are zero.
Output format:
The same as that of QH_structure_constants, i.e. of type Dict{CurveClass_type, Array{Any, 3}}.
Arguments
G::AbstractGKM_graph: The GKM graph whose quantum cohomology is of interest.b::Matrix: A matrix whose rows are the desired $H_T^*(\text{pt};\mathbb{Q})$-linear basis of $H_T^*(X;\mathbb{Q})$. The elementb[i,j]is the localization to thej-th fixed point of thei-th basis element.setPreferredBasis::Bool=false: Optional argument. If set totrue, all future quantum cohomology classes of this space will be printed with respect to the given base.
Examples
This example shows that $QH_T(\mathbb{P}^1;\mathbb{Q}) \cong\mathbb{Q}[t_1, t_2, e,q]/(e^2 - (t_1-t_2)e - q)$ where $e=PD([1:0])$ and $q$ corresponds to the curve class $[\mathbb{P}^1]\in H_2(\mathbb{P}^1;\mathbb{Z})$.
julia> P1 = projective_space(GKM_graph, 1);
julia> QH_structure_constants(P1; show_progress=false);
julia> P1 = projective_space(GKM_graph, 1);
julia> QH_structure_constants(P1; show_progress=false)
Dict{AbstractAlgebra.FPModuleElem{ZZRingElem}, Array{Any, 3}} with 2 entries:
(0) => [t1^2 - 2*t1*t2 + t2^2 0; 0 0;;; 0 0; 0 t1^2 - 2*t1*t2 + t2^2]
(1) => [1 1; 1 1;;; 1 1; 1 1]
julia> t1, t2 = gens(P1.equivariantCohomology.coeffRing);
julia> base = [1 1; t1-t2 0];
julia> QH_structure_constants_in_basis(P1, base)
Dict{AbstractAlgebra.FPModuleElem{ZZRingElem}, Array{Any, 3}} with 2 entries:
(0) => [1 0; 0 0;;; 0 1; 1 t1 - t2]
(1) => [0 0; 0 1;;; 0 0; 0 0]Similarly, choosing a nice basis simplifies the presentation of $QH_T(\mathbb{P}^2)$. By the below, it is isomorphic as $H_T^*(\text{pt};\mathbb{Q})$-algebra to $\mathbb{Q}[t_1,t_2,t_3, e, q]/(e(e-t_1+t_2)(e-t_1+t_3) - q)$, where $e = PD(\mathbb{P}^1_{[x:y:0]})$.
julia> P2 = projective_space(GKM_graph, 2);
julia> QH_structure_constants(P2; show_progress=false); # Calculate all relevant structure constants.
julia> (t1, t2, t3) = gens(P2.equivariantCohomology.coeffRing);
julia> base = [1 1 1; t1-t3 t2-t3 0 ; (t1-t2)*(t1-t3) 0 0];
julia> S = QH_structure_constants_in_basis(P2, base);
julia> beta = curve_class(P2, Edge(1, 2));
julia> S[beta][:,:,1]
3×3 Matrix{Any}:
0 0 0
0 0 1
0 1 t1 - t2
julia> S[beta][:,:,2]
3×3 Matrix{Any}:
0 0 0
0 0 0
0 0 1
julia> S[beta][:,:,3]
3×3 Matrix{Any}:
0 0 0
0 0 0
0 0 0GKMtools.QH_supporting_curve_classes — Function
QH_supporting_curve_classes(G::AbstractGKM_graph)Return a list of all curve classes of G in which a non-zero structure constant for the equivariant quantum product has been calculated.
This does not calculate any structure constants afresh but works with all constants calculated so far. To calculate them, use QH_structure_constants.
Quantum Arithmetic
Equivariant cohomology classes in $X$ can be turned into QHRingElem. The standard arithmetic operations +, *, etc. are supported, where * denotes the equivariant quantum product in $QH_T^*(X)$.
GKMtools.QH_class — Function
QH_class(G::AbstractGKM_graph, class; beta::Union{Nothing, CurveClass_type} = nothing)Turn the given equivariant cohomology class class (obtained, for example, from point_class, poincare_dual chern_class, etc.) into an equivariant quantum cohomology class on G.
The point of this function is that class1 * class2 computes the ordinary cup product in equivariant cohomology, while QH_class(class1) * QH_class(class2) computes their equivariant quantum product.
Optional argument
The optional argument beta can be used to multiply the result by the coefficient $q^\beta$ for a curve class $\beta$.
Example
Let us see an example on $\mathbb{P}^2$. We turn the the Poincaré dual of a fixed point and the hyperplane class into quantum cohomology classes.
julia> P2 = projective_space(GKM_graph, 2);
julia> QH_class(P2, point_class(P2, 1)) # point class without shift
(t1^2 - t1*t2 - t1*t3 + t2*t3, 0, 0) q^(0)
julia> QH_class(P2, point_class(P2, 1); beta = curve_class(P2, Edge(1, 2))) # shift by q^\beta
(t1^2 - t1*t2 - t1*t3 + t2*t3, 0, 0) q^(1)
julia> (t1, t2, t3) = gens(P2.equivariantCohomology.coeffRing);
julia> QH_class(P2, [t1, t2, t3]) # hyperplane class
(t1, t2, t3) q^(0)Base.:* — Method
*(c1::QHRingElem, c2::QHRingElem) -> QHRingElemMultiply the classes c1 and c2 (obtained using QH_class and arithmetic with its output) using the equivariant quantum product in $QH_T^*(X)$.
This requires is_strictly_nef(G)==true for the underlying GKM graph G. If this does not hold, there could potentially be infinitely many $\beta$ contributing a non-zero $q^\beta$-term to the quantum product. In this case, use quantum_product to calculate the coefficient of $q^\beta$ in the quantum product for a specified choice of $\beta$. Alternatively, one may use set_attribute!(c1.gkm, :QH_use_only_existing_structure_constants, true), which causes this function to only use the structure constants in curve classes that have previously been computed.
Example
Let us compute the equivariant quantum product of the Poincaré dual of a fixed point and the hyperplane class of $\mathbb{P}^2$.
julia> P2 = projective_space(GKM_graph, 2);
julia> (t1, t2, t3) = gens(P2.equivariantCohomology.coeffRing);
julia> H = QH_class(P2, [t1, t2, t3]) # The equivariant hyperplane class as element of QH_T(X)
(t1, t2, t3) q^(0)
julia> (H - t1) * (H - t2) * (H - t3)
(1, 1, 1) q^(1)
julia> p = QH_class(P2, point_class(P2, 1))
(t1^2 - t1*t2 - t1*t3 + t2*t3, 0, 0) q^(0)
julia> p * H
(t1^3 - t1^2*t2 - t1^2*t3 + t1*t2*t3, 0, 0) q^(0)
+ (1, 1, 1) q^(1)GKMtools.quantum_product — Function
quantum_product(G::AbstractGKM_graph, beta::CurveClass_type, class1, class2; useStructureConstants::Bool = true, fastMode::Bool = false, distantVertex::Int64 = 1, twist_class::Union{Nothing, EquivariantClass}=nothing, show_progress::Bool=true)Calculate the $q^\beta$-coefficient of the equivariant quantum product of the equivariant cohomology classes class1 and class2 on G.
If the optional argument useStructureConstants is set to false, then this will always calculate the relevant Gromov–Witten invariants freshly using gromov_witten, even if they have been calculated before.
Fast mode
The optional argument fastMode must only be set to true when one is certain that the output is a degree zero cohomology class, i.e. a rational number. It is not yet supported in combination with useStructureConstants=true. When fast mode is used, the result is calculated using a single 3-point Gromov–Witten invariant, which takes as arguments class1, class2, and the point class of the vertex with number distantVertex. By default, the optional argument distantVertex is 1, and its value does not change the result (if the result is known to be a rational number). When class1 and class2 are also point classes, performance may be optimized by picking a value for distantVertex such that there are relatively few trees in curve class beta meeting the points given by class1, class2, and distantVertex.
Twisting
The experimental optional argument twist_class allows to multiply by any additional EquivariantClass before integrating over $\overline{\mathcal{M}}_{0,3}(X;\beta)$ in the definition of the quantum product. Currently, it can only be used in combination with useStructureConstants=false. See reduced_virtual_zero_section for a twisted example.
Progress bar
The optional progress bars for each underlying call to gromov_witten can be activated by setting show_progress=true.
Example
Let us compute the equivariant quantum products of some point classes on $\mathbb{P}^2$.
julia> P2 = projective_space(GKM_graph, 2);
julia> beta = curve_class(P2, Edge(1, 2));
julia> quantum_product(P2, beta, point_class(P2, 1), point_class(P2, 2))
(t1 - t3, t2 - t3, 0)
julia> quantum_product(P2, 0*beta, point_class(P2, 1), point_class(P2, 2))
0
julia> quantum_product(P2, 2*beta, point_class(P2, 1), point_class(P2, 2))
(0, 0, 0)GKMtools.quantum_product_at_q1 — Function
quantum_product_at_q1(G::AbstractGKM_graph, class)Return the matrix of equivariant quantum multiplication on G by the class class after setting $q=1$. All structure constants are computed with respect to the standard basis $(e_i)_{i=1}^N$. Thus, the output is the $N\times N$ matrix expressing the linear map
\[ \rm{class} \ast|_{q=1} \colon H_T^*(X;\mathbb{Q}) \longrightarrow H_T^*(X;\mathbb{Q}), \hspace{7mm} a\mapsto (\rm{class} \ast a)|_{q=1}.\]
in the basis $(e_i)_{i=1}^N$.
This requires is_strictly_nef(G)==true as otherwise the quantum product might have infinitely many summands, so setting $q=1$ is not well-defined.
Example
Recall from the example in QH_structure_constants that we computed the equivariant quantum products of $\mathbb{P}^1$ in the fixed point basis $f_1,f_2$. To relate this to the output of this function, we need to convert to the standard basis $e_1,e_2$ using
\[e_1 = \frac{f_1}{t_1-t_2}, \hspace{7mm} e_2 = \frac{f_2}{-t_1+t_2}\]
and set $q=1$. The following code confirms that the result is as expected.
julia> P1 = projective_space(GKM_graph, 1);
julia> quantum_product_at_q1(P1, point_class(P1, 1))
[(t1^2 - 2*t1*t2 + t2^2 + 1)//(t1 - t2) 1//(t1 - t2)]
[ -1//(t1 - t2) -1//(t1 - t2)]
julia> (t1, t2) = gens(P1.equivariantCohomology.coeffRing);
julia> quantum_product_at_q1(P1, [t1, t2])
[(t1^2 - t1*t2 + 1)//(t1 - t2) 1//(t1 - t2)]
[ -1//(t1 - t2) (t1*t2 - t2^2 - 1)//(t1 - t2)]Quantum product with $c_1^T(TX)$
GKMtools.c1_at_q1 — Function
c1_at_q1(G::AbstractGKM_graph)The same as quantum_product_at_q1(G,first_chern_class(G)). That is, return the matrix of the equivariant quantum product with $c_1(T_X)$ at $q=1$, expressed in the standard basis, where G is the GKM graph of the GKM space $X$.
Example
Let us compute the matrix of the equivariant quantum product with $c_1(T_{\mathbb{P}^1})$ on $\mathbb{P}^1$ at $q=1$.
julia> c1_at_q1(projective_space(GKM_graph, 1))
[(t1^2 - 2*t1*t2 + t2^2 + 2)//(t1 - t2) 2//(t1 - t2)]
[ -2//(t1 - t2) (-t1^2 + 2*t1*t2 - t2^2 - 2)//(t1 - t2)]GKMtools.conjecture_O_eigenvalues — Function
conjecture_O_eigenvalues(G::AbstractGKM_graph; printData::Bool=true)Return the eigenvalues of quantum multiplication by $c_1^T(TX)$, the equivariant first Chern class of the tangent bundle at $q=1, t=0$, where $t$ are the equivariant parameters.
This requires is_strictly_nef(G)==true as otherwise the quantum product might have infinitely many summands, so setting $q=1$ is not well-defined. It also requires is_compact(G)==true as otherwise the non-equivariant limit may be undefined.
Example
Let us see the examples of $\mathbb{P}^1$, $\mathbb{P}^2$, and $\mathbb{P}^3$.
In the first two julia command lines, we demonstrate the following: Even though the matrix $M$ of multiplication by $c_1(T_{\mathbb{P}^1})$ has rational functions in the equivariant parameters $t$ as entries, conjecture_O_eigenvalues can still compute the eigenvalues at the non-equivariant limit $t=0$ because the characteristic polynomial of $M$ has coefficients that are polynomials in $t$. This follows from the existence of some $H_T^*(\text{point};\mathbb{Q})$-linear basis for $H_T^*(X;\mathbb{Q})$ and basis-independence of the characteristic polynomial.
julia> c1_at_q1(projective_space(GKM_graph, 1))
[(t1^2 - 2*t1*t2 + t2^2 + 2)//(t1 - t2) 2//(t1 - t2)]
[ -2//(t1 - t2) (-t1^2 + 2*t1*t2 - t2^2 - 2)//(t1 - t2)]
julia> characteristic_polynomial(ans)
x^2 - t1^2 + 2*t1*t2 - t2^2 - 4
julia> conjecture_O_eigenvalues(projective_space(GKM_graph, 1)) # P^1
Characteristic poly of c1(TX)* at q=1, t=0:
x^2 - 4
2-element Vector{QQBarFieldElem}:
{a1: 2.00000}
{a1: -2.00000}
julia> conjecture_O_eigenvalues(projective_space(GKM_graph, 2)) # P^2
Characteristic poly of c1(TX)* at q=1, t=0:
x^3 - 27
3-element Vector{QQBarFieldElem}:
{a1: 3.00000}
{a2: -1.50000 + 2.59808*im}
{a2: -1.50000 - 2.59808*im}
julia> conjecture_O_eigenvalues(projective_space(GKM_graph, 3)) # P^3
Characteristic poly of c1(TX)* at q=1, t=0:
x^4 - 256
4-element Vector{QQBarFieldElem}:
{a1: 4.00000}
{a1: -4.00000}
{a2: 4.00000*im}
{a2: -4.00000*im}Twisted versions
GKMtools.twisted_c1_matrix — Function
twisted_c1_matrix(V::GKM_vector_bundle, beta; show_progress::Bool=false)Return the $q^\beta$ part of the matrix (in the standard basis) given by the equivariant quantum product on $X$ with $c_1(T_X) - c_1(V)$, twisted by the convex vector bundle $V$. Here, $X$ is the base of the vector bundle $V$.
See [Pan98, Section 2.1] for the definition of the twisted quantum product, and see also reduced_virtual_zero_section for an implementation of general twisted quantum products. The twisted quantum cohomology on $X$ admits a ring homomorphism to the ordinary quantum cohomology of the smooth zero-locus $Y\subset X$ of a section of $V$. Since we really care about the quantum product by $c_1(T_Y)$ on $Y$, we need some class on $X$ that restricts to $c_1(T_Y)$. This is precisely $c_1(T_X) - c_1(V)$.
Input
V::GKM_vector_bundle: A convex vector bundle.beta: A curve class on the GKM graphbaseof(V), the base ofV.show_progress::Bool(optional): If set to true, the progress bars ofgromov_wittenwill be shown.
Output
The matrix of the $q^\beta$ part of the quantum product by $c_1(T_X) - c_1(V)$, twisted by $V$. That is, the output is the matrix of the linear map
\[(c_1(T_X) - c_1(V)) \ast^{V\text{-twisted}}|_{q^\beta\text{-term}} \colon H_T^*(X;\mathbb{Q})\longrightarrow H_T^*(X;\mathbb{Q})\]
expressed in the standard basis.
Example
As an example, let us see the case $V=\mathcal{O}_{\mathbb{P}^2}(1)$ in degrees up to $2$.
julia> V = vector_bundle_O(2, [1]); # vector bundle O(1) on P^2
julia> P2 = baseof(V); # projective plane
julia> beta = curve_class(P2, "1", "2"); # the class of a line in P^2
julia> c_V = chern_class(V, 1); # first Chern class of the vector bundle V
julia> c_X = first_chern_class(P2); # first Chern class of the base space P^2The quantum product in degree zero coincides with the classical product in the cohomology ring of $\mathbb{P}^2$. Since we have
julia> (c_X - c_V)
(2*t1 - t2 - t3 - t4)*e[1] + (t2 - t3 - t4)*e[2] + (-t2 + t3 - t4)*e[3]the result of twisted_c1_matrix in degree zero is as expected:
julia> twisted_c1_matrix(V, 0*beta)
[2*t1 - t2 - t3 - t4 0 0]
[ 0 t2 - t3 - t4 0]
[ 0 0 -t2 + t3 - t4]In degree one, we have the following result, where $E$ is the subbundle of $\pi_*(\text{ev}_4^*\mathcal{O}_{\mathbb{P}^2}(1))$ defined in [Pan98, Equation (19)] (cf. reduced_virtual_zero_section).
\[\int_{\left[\overline{\mathcal{M}}_{0,3}(\mathbb{P}^2;\beta)\right]_T^\text{vir}} \text{ev}_1^*(c_1(T_{\mathbb{P}^2}) - c_1(\mathcal{O}_{\mathbb{P}^2}(1))) \cdot \text{ev}_2^*(f_1) \cdot \text{ev}_3^*(f_1) \cdot c^T_{\mathrm{top}}(E) = 2t_4\]
as the following computation shows:
julia> f_1 = point_class(1, P2)
(t1^2 - t1*t2 - t1*t3 + t2*t3)*e[1]
julia> gromov_witten(P2, beta, 3, ev(1, (c_X - c_V)) * ev(2, f_1) * ev(3, f_1) * reduced_virtual_zero_section(V), show_bar = false)
2*t4Since we are interested in the image of e[1] under the twisted quantum product by c_X - c_V, we need to divide by (t1^2 - t1*t2 - t1*t3 + t2*t3). Hence the correct entry in the matrix is 2*t4//(t1^2 - t1*t2 - t1*t3 + t2*t3). The other entries are computed similarly, and we obtain the following matrix in degree one.
julia> M = twisted_c1_matrix(V, 1*beta);
julia> M[1, :]
3-element Vector{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
(2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3)
(2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3)
(2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3)
julia> M[2, :]
3-element Vector{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
(2*t1 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3)
(2*t1 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3)
(2*t1 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3)
julia> M[3, :]
3-element Vector{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
(-2*t1 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2)
(-2*t1 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2)
(-2*t1 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2)In degree two, we have the following result:
julia> twisted_c1_matrix(V, 2*beta)
[0 0 0]
[0 0 0]
[0 0 0]Note that the returned matrices contain all equivariant parameters for V, including those that act only in the fibre direction.
GKMtools.twisted_c1_matrix_at_q1 — Function
twisted_c1_matrix_at_q1(V::GKM_vector_bundle; show_progress::Bool=false)Return the matrix of the equivariant twisted quantum product by $c_1(T_X) - c_1(V)$ on $X$, twisted by the convex vector bundle $V$ where $X$ is the base of $V$. This sums the $q^\beta$ terms produced by twisted_c1_matrix, setting $q=1$ and summing over all relevant curve classes $\beta$.
The output also contains the characteristic polynomial of the resulting matrix and its eigenvalues after setting all equivariant parameters to zero.
This function requires that the second cohomology class $c_1(T_X) - c_1(V)$ is positive on all $T$-stable copies of $\mathbb{P}^1$ inside $X$. Otherwise, there is no guarantee that only finitely many terms contribute.
Input
V::GKM_vector_bundle: A convex vector bundle.
Output
The output is a tuple (roots, chi0, M), where:
Mis the described matrix.chi0is the characteristic polynomial with all equivariant parameters set to zero.rootsare the complex roots ofchi0, i.e. the eigenvalues in the non-equivariant limit ofM.
See twisted_c1_matrix for the choice of basis in which M is returned. This basis is not a basis over $H_T^*$, but only over $\text{Frac}(H_T^*)$, so the entries of M are rational functions in the equivariant parameters. However, since the characteristic polynomial $\chi_M$ of $M$ is independent of the choice of basis for M, its coefficients are polynomials in the equivariant parameters. In particular, the non-equivariant limit chi0 of $\chi_M$ is well-defined when V is realized as convex vector bundle over a projective GKM space.
Example 1
Let us first continue the example of $V=\mathcal{O}_{\mathbb{P}^2}(1)$ from twisted_c1_matrix.
julia> V = vector_bundle_O(2, [1]);
julia> (roots, chi0, M) = twisted_c1_matrix_at_q1(V);
julia> roots
3-element Vector{QQBarFieldElem}:
{a1: 2.00000}
{a1: 0}
{a1: -2.00000}
julia> chi0
x^3 - 4*x
julia> M
[(2*t1^3 - 3*t1^2*t2 - 3*t1^2*t3 - t1^2*t4 + t1*t2^2 + 4*t1*t2*t3 + t1*t2*t4 + t1*t3^2 + t1*t3*t4 - t2^2*t3 - t2*t3^2 - t2*t3*t4 + 2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3) (2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3) (2*t4)//(t1^2 - t1*t2 - t1*t3 + t2*t3)]
[ (2*t1 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3) (t1*t2^2 - 2*t1*t2*t3 - t1*t2*t4 + t1*t3^2 + t1*t3*t4 + 2*t1 - t2^3 + 2*t2^2*t3 + t2^2*t4 - t2*t3^2 - t2*t3*t4 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3) (2*t1 - 2*t2 - 2*t4)//(t1*t2 - t1*t3 - t2^2 + t2*t3)]
[ (-2*t1 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2) (-2*t1 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2) (-t1*t2^2 + 2*t1*t2*t3 - t1*t2*t4 - t1*t3^2 + t1*t3*t4 - 2*t1 + t2^2*t3 - 2*t2*t3^2 + t2*t3*t4 + t3^3 - t3^2*t4 + 2*t3 + 2*t4)//(t1*t2 - t1*t3 - t2*t3 + t3^2)]Example 2
Next, let us see $\mathcal{O}(1)$, $\mathcal{O}(1)\oplus\mathcal{O}(1)$, and $\mathcal{O}(2)$ on $\mathbb{P}^3$. We begin with $\mathcal{O}_{\mathbb{P}^3}(1)$.
julia> V = vector_bundle_O(3, [1]);
julia> (roots, chi0, M) = twisted_c1_matrix_at_q1(V);
julia> chi0
x^4 - 27*x
julia> roots
4-element Vector{QQBarFieldElem}:
{a1: 3.00000}
{a1: 0}
{a2: -1.50000 + 2.59808*im}
{a2: -1.50000 - 2.59808*im}Next, let us see $\mathcal{O}_{\mathbb{P}^3}(1)\oplus\mathcal{O}_{\mathbb{P}^3}(1)$.
julia> V = vector_bundle_O(3, [1, 1]);
julia> (roots, chi0, M) = twisted_c1_matrix_at_q1(V);
julia> chi0
x^4 - 4*x^2
julia> roots
4-element Vector{QQBarFieldElem}:
{a1: 2.00000}
{a1: 0}
{a1: 0}
{a1: -2.00000}Finally, let us see $\mathcal{O}_{\mathbb{P}^3}(2)$.
julia> V = vector_bundle_O(3, [2]);
julia> (roots, chi0, M) = twisted_c1_matrix_at_q1(V);
julia> chi0
x^4 - 16*x^2
julia> roots
4-element Vector{QQBarFieldElem}:
{a1: 4.00000}
{a1: 0}
{a1: 0}
{a1: -4.00000}Sanity checks
GKMtools.QH_is_commutative — Function
QH_is_commutative(G::AbstractGKM_graph) -> BoolReturn whether the calculated structure constants of $QH_T^*(X)$ are commutative. If G is the GKM graph of a GKM variety or Hamiltonian GKM space (see Definition), then this should always return true.
This requires is_strictly_nef(G)==true as otherwise there might be infinitely many structure constants to check.
Example
julia> P3 = projective_space(GKM_graph, 3);
julia> QH_is_commutative(P3)
trueGKMtools.QH_is_associative — Function
QH_is_associative(G::AbstractGKM_graph; printDiagnostics::Bool) -> BoolReturn whether the calculated structure constants of $QH_T^*(X)$ are associative. If G is the GKM graph of a GKM variety or Hamiltonian GKM space (see Definition), then this should always return true.
This requires is_strictly_nef(G)==true as otherwise there might be infinitely many structure constants to check.
Optional arguments
printDiagnostics::Bool: If this istrueand the function's output isfalse, then the indices where associativity fails are printed.
Example
julia> P3 = projective_space(GKM_graph, 3);
julia> QH_is_associative(P3)
trueGKMtools.QH_is_homogeneous — Function
QH_is_homogeneous(G::AbstractGKM_graph) -> BoolReturn whether all structure constants of the equivariant quantum product of G calculated so far are homogeneous.
This does not calculate any structure constants afresh but checks all constants calculated so far. To calculate them, use QH_structure_constants (see above).
Example
julia> P3 = projective_space(GKM_graph, 3);
julia> QH_structure_constants(P3; show_progress=false);
julia> QH_is_homogeneous(P3)
trueGKMtools.QH_is_polynomial — Function
QH_is_polynomial(G::AbstractGKM_graph) -> BoolReturn whether all structure constants of the equivariant quantum product of G calculated so far are polynomial (rather than fractions of polynomials).
This does not calculate any structure constants afresh but checks all constants calculated so far. To calculate them, use QH_structure_constants (see above).
Example
julia> P3 = projective_space(GKM_graph, 3);
julia> QH_structure_constants(P3; show_progress=false);
julia> QH_is_polynomial(P3)
true