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_constants — FunctionQH_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.
- 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 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:falseby default. Iftrue, then this will overwrite any previously calculated $QH_T$ structure constants ofG.
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]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.
- 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}. 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:falseby default. Iftrue, then this will overwrite any previously calculated $QH_T$ structure constants ofG.
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 0GKMtools.QH_structure_constants_in_basis — FunctionQH_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)$.
- 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
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 0GKMtools.QH_supporting_curve_classes — FunctionQH_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.
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 — FunctionQH_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)Base.:* — Method*(c1::QHRingElem, c2::QHRingElem) -> QHRingElemMultiply the classes c1 and c2 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
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 — Functionquantum_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.
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)GKMtools.quantum_product_at_q1 — Functionquantum_product_at_q1(G::AbstractGKM_graph, class)Return the matrix of equivariant quantum multiplication on G by the class class after setting $q=1$.
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.
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)]Quantum product with $c_1^T(TX)$
GKMtools.c1_at_q1 — Functionc1_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)]GKMtools.conjecture_O_eigenvalues — Functionconjecture_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.
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 + 16Sanity checks
GKMtools.QH_is_commutative — FunctionQH_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 — FunctionQH_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 — FunctionQH_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 — FunctionQH_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