Welcome to IntersectionTheory!
Run the cell below to load the package. You should see the banners of Singular and GAP.
using IntersectionTheory
┌───────┐ GAP 4.11.1 of 2021-03-02 │ GAP │ https://www.gap-system.org └───────┘ Architecture: x86_64-pc-linux-gnu-julia64-kv7 Configuration: gmp 6.2.1, Julia GC, Julia 1.6.2, readline Loading the library and packages ... Packages: AClib 1.3.2, Alnuth 3.1.2, AtlasRep 2.1.0, AutoDoc 2019.09.04, AutPGrp 1.10.2, CRISP 1.4.5, Cryst 4.1.23, CrystCat 1.1.9, CTblLib 1.2.2, FactInt 1.6.3, FGA 1.4.0, GAPDoc 1.6.3, IRREDSOL 1.4, JuliaInterface 0.5.2, LAGUNA 3.9.3, Polenta 1.3.9, Polycyclic 2.15.1, PrimGrp 3.4.0, RadiRoot 2.8, ResClasses 4.7.2, SmallGrp 1.4.1, Sophus 1.24, SpinSym 1.5.2, TomLib 1.2.9, TransGrp 2.0.5, utils 0.69 Try '??help' for help. See also '?copyright', '?cite' and '?authors' Singular.jl, based on SINGULAR / A Computer Algebra System for Polynomial Computations / Singular.jl: 0.5.7 0< Singular : 4.2.0p1 by: W. Decker, G.-M. Greuel, G. Pfister, H. Schoenemann \ FB Mathematik der Universitaet, D-67653 Kaiserslautern \
Julia needs to "warm up" on startup, so the first run usually takes longer. The second time it will be much faster, and then one can take on larger examples.
@time euler(proj(2))
2.279994 seconds (2.99 M allocations: 179.489 MiB, 3.12% gc time, 28.02% compilation time)
@time euler(proj(2))
0.000618 seconds (935 allocations: 31.156 KiB)
@time euler(proj(500))
0.373980 seconds (2.28 M allocations: 130.774 MiB, 16.03% gc time, 5.53% compilation time)
Here we showcase some of the functions one can apply to a variety:
P2 = proj(2)
P2, chern(P2), todd(P2), basis(P2), intersection_matrix(P2), hilbert_polynomial(P2), a_hat_genus(P2)
We can use the argument param
to introduce parameters. As an example we compute the genus formula for a plane curve.
P2, d = proj(2, param = "d")
arithmetic_genus = X -> (-1)^dim(X) * (chi(OO(X)) - 1)
symmetric_power(d, OO(P2, 1)) == OO(P2, d), chern(OO(P2, d)), arithmetic_genus(complete_intersection(P2, d))
Next we compute the number of lines on a cubic surface. By default it uses the Chow ring computation. Using the argument bott = true
will switch to Bott's formula.
G = grassmannian(2, 4, bott = false)
S, Q = bundles(G)
integral(chern(symmetric_power(3, dual(S))))
Here is another non-trivial computation (the Noether--Lefschetz number of discriminant 28 for a generic pencil of Debarre--Voisin fourfolds). The same computation in Schubert2 takes about a minute.
G = flag(4,7,10, bott = true)
A,B,C = bundles(G)
@time integral(chern(dual(exterior_power(3,A) + exterior_power(2,A)*B + A*exterior_power(2,B))))
1.327079 seconds (12.14 M allocations: 673.788 MiB, 24.87% gc time)
And the mandatory 3264.
P2, P5 = proj(2), proj(5)
v = hom(P2, P5, [2P2.O1]) # the Veronese embedding
Bl, E = blowup(v) # the blowup and the exceptional divisor
h = pullback(Bl → P5, P5.O1)
e = pushforward(E → Bl, E(1))
integral((6h - 2e)^5)
For certain numerical invariants it is not necessary to know the Chow ring. We compute the Chern numbers of the Hilbert scheme of points on a K3 surface.
chern_numbers(hilb_K3(5), nonzero=true)
Dict{AbstractAlgebra.Generic.Partition{Int64}, Nemo.fmpq} with 7 entries:2₅ $\Rightarrow$ $126867456$
integral(hilb_K3(5), sqrt(todd(10)))
Docstrings can be consulted using ?
.
?hilb_K3
search: hilb_K3 hilb_P2 hilb_P1xP1 hilb_surface hilbert_polynomial
hilb_K3(n::Int)
Construct the cobordism class of a hyperkähler variety of $\mathrm{K3}^{[n]}$-type.
Check out the documentations for more examples and test them here! :)