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_constants
below that specifies a specific $\beta$.
- 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 argumentrefresh
is 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
:false
by 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
G
for later use. If the requested structure constants have been computed before, they will not be computed afresh unless the optional argumentrefresh
is 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
:false
by 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 0
GKMtools.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 0
GKMtools.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) -> QHRingElem
Multiply 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$.
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
. 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)
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 + 16
Sanity checks
GKMtools.QH_is_commutative
— FunctionQH_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
.
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
GKMtools.QH_is_associative
— FunctionQH_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
.
This requires is_strictly_nef(G)==true
as otherwise there might be infinitely many structure constants to check.
Optional arguments
printDiagnostics::Bool
: If this istrue
and 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)
true
GKMtools.QH_is_homogeneous
— FunctionQH_is_homogeneous(G::AbstractGKM_graph) -> Bool
Return 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)
true
GKMtools.QH_is_polynomial
— FunctionQH_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).
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