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)$.

Note

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].

Note
  • 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$.

Note
  • 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) (see point_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_constantsFunction
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.

Warning
  • 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 of QH_structure_constants below that specifies a specific $\beta$.
Note
  • As this computation might be expensive, the result is stored in G for later use. If the requested structure constants have been computed before, they will not be computed afresh unless the optional argument refresh is set to true.

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: false by default. If true, then this will overwrite any previously calculated $QH_T$ structure constants of G.

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  1
source
QH_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.

Note
  • As this computation might be expensive, the result is stored in G for later use. If the requested structure constants have been computed before, they will not be computed afresh unless the optional argument refresh is set to true.

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: false by default. If true, then this will overwrite any previously calculated $QH_T$ structure constants of G.

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  0
source
GKMtools.QH_structure_constants_in_basisFunction
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).

Note
  • 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 element b[i,j] is the localization to the j-th fixed point of the i-th basis element.
  • setPreferredBasis::Bool=false: Optional argument. If set to true, 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  0
source
GKMtools.QH_supporting_curve_classesFunction
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.

Note

This does not calculate any structure constants afresh but works with all constants calculated so far. To calculate them, use QH_structure_constants.

source

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_classFunction
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)
source
Base.:*Method
*(c1::QHRingElem, c2::QHRingElem) -> QHRingElem

Multiply the classes c1 and c2 (obtained using QH_class and arithmetic with its output) using the equivariant quantum product in $QH_T^*(X)$.

Warning

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)
source
GKMtools.quantum_productFunction
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)
source
GKMtools.quantum_product_at_q1Function
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$.

Warning

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)]
source

Quantum product with $c_1^T(TX)$

GKMtools.c1_at_q1Function
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)]
source
GKMtools.conjecture_O_eigenvaluesFunction
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.

Warning

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}
source

Twisted versions

GKMtools.twisted_c1_matrixFunction
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$.

Note

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 graph baseof(V), the base of V.
  • show_progress::Bool (optional): If set to true, the progress bars of gromov_witten will 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^2

The 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*t4

Since 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.

source
GKMtools.twisted_c1_matrix_at_q1Function
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.

Note

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:

  • M is the described matrix.
  • chi0 is the characteristic polynomial with all equivariant parameters set to zero.
  • roots are the complex roots of chi0, i.e. the eigenvalues in the non-equivariant limit of M.
Note

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}
source

Sanity checks

GKMtools.QH_is_commutativeFunction
QH_is_commutative(G::AbstractGKM_graph) -> Bool

Return 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.

Warning

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)
true
source
GKMtools.QH_is_associativeFunction
QH_is_associative(G::AbstractGKM_graph; printDiagnostics::Bool) -> Bool

Return 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.

Warning

This requires is_strictly_nef(G)==true as otherwise there might be infinitely many structure constants to check.

Optional arguments

  • printDiagnostics::Bool: If this is true and the function's output is false, then the indices where associativity fails are printed.

Example

julia> P3 = projective_space(GKM_graph, 3);

julia> QH_is_associative(P3)
true
source
GKMtools.QH_is_homogeneousFunction
QH_is_homogeneous(G::AbstractGKM_graph) -> Bool

Return whether all structure constants of the equivariant quantum product of G calculated so far are homogeneous.

Note

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)
true
source
GKMtools.QH_is_polynomialFunction
QH_is_polynomial(G::AbstractGKM_graph) -> Bool

Return whether all structure constants of the equivariant quantum product of G calculated so far are polynomial (rather than fractions of polynomials).

Note

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
source