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_{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_{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

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.

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 Dict{CurveClass_type, Array{Any, 3}}. If ans denotes the returned object, 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 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

julia> P1 = projective_space(GKM_graph, 1);

julia> S = 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]
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}. Ifans 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

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

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

The following example shows that $QH_T(X;\mathbb{Q}) \cong\mathbb{Q}[t_1, t_2, e]/(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, 1]/(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)
Dict{AbstractAlgebra.FPModuleElem{ZZRingElem}, Array{Any, 3}} with 2 entries:
  (0) => [1 0 0; 0 0 0; 0 0 0;;; 0 1 0; 1 t2 - t3 0; 0 0 0;;; 0 0 1; 0 1 t1 - t3; 1 t1 - t3 t1^2 - t1*t2 - t1*t3 + t2*t3]
  (1) => [0 0 0; 0 0 1; 0 1 t1 - t2;;; 0 0 0; 0 0 0; 0 0 1;;; 0 0 0; 0 0 0; 0 0 0]

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 (see above).

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 into an equivariant quantum cohomology class on G. The optional argument beta can be used to multiply the result by the coefficient $q^\beta$ for a curve class $\beta$.

Example

julia> P2 = projective_space(GKM_graph, 2);

julia> QH_class(P2, point_class(P2, 1))
(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)))
(t1^2 - t1*t2 - t1*t3 + t2*t3, 0, 0) q^(1)

julia> (t1, t2, t3) = gens(P2.equivariantCohomology.coeffRing); # hyperplane class

julia> QH_class(P2, [t1, t2, t3])
(t1, t2, t3) q^(0)
source
Base.:*Method
*(c1::QHRingElem, c2::QHRingElem) -> QHRingElem

Multiply the classes c1 and c2 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$.

Example

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)

Calculate the $q^\beta$-coefficient of the equivariant quantum product of the equivariant cohomology classes class1 and class2 on G. This does not require

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.

Example

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, 0, 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$.

Note

This matrix is in the basis $(1, 0, \dots, 0), (0, 1, 0,.\dots, 0), \dots, (0,\d0ts,0,1)$ of $H_T^*(X;\mathbb{Q})$ localized at the fraction field of the coefficient ring. These classes do not represent classes in $H_T^*(X;\mathbb{Q})$ without localizing the coefficient ring, so in particular the output will consist of rational functions even when G is the GKM graph of a GKM variety or Hamiltonian GKM space.

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

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)) (see above).

Example

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.

Example

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> conjecture_O_eigenvalues(projective_space(GKM_graph, 1))
Characteristic poly of c1(TX)* at q=1, t=0:
x^2 - 4
2-element Vector{QQBarFieldElem}:
 Root 2.00000 of x - 2
 Root -2.00000 of x + 2

julia> conjecture_O_eigenvalues(projective_space(GKM_graph, 2))
Characteristic poly of c1(TX)* at q=1, t=0:
x^3 - 27
3-element Vector{QQBarFieldElem}:
 Root 3.00000 of x - 3
 Root -1.50000 + 2.59808*im of x^2 + 3x + 9
 Root -1.50000 - 2.59808*im of x^2 + 3x + 9

julia> conjecture_O_eigenvalues(projective_space(GKM_graph, 3))
Characteristic poly of c1(TX)* at q=1, t=0:
x^4 - 256
4-element Vector{QQBarFieldElem}:
 Root 4.00000 of x - 4
 Root -4.00000 of x + 4
 Root 4.00000*im of x^2 + 16
 Root -4.00000*im of x^2 + 16
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