English    English
 
 

Christoph Sorger

Professeur à l'université de Nantes

Chow - Une bibliothèque SAGE pour des calculs en théorie d'intersection

Chow est une bibliothèque SAGE pour faciliter des calculs en théorie d'intersection, écrit en collaboration avec Manfred Lehn. Elle est inspirée et basée sur Schubert, une bibliothèque Maple de Sheldon Katz et Stein Arild Strømme.

Chow est écrit en python et utilise de manière essentielle Singular via son interface de SAGE. Travailler avec Singular et Sage au lieu de Maple simplifie de beaucoup les algorithmes et permet notamment de calculer l'anneau de Chow d'un éclatement par générateurs et relations.

Nous avons écrit puis utilisé cette bibliothèque pour calculer le nombre d'Euler de la variété compacte holomorphiquement symplectique de dimension huit construite dans Twisted cubics on cubic fourfolds. Les détails du calcul se trouvent ici.

Même si inspiré par Schubert, cette bibliothèque à été écrit from scratch. Bien que nous soyions relativement sûr que le calcul du nombre d'Euler ci-dessous est correct que nous ayons vérifiés soigneusement les méthodes de la bibliothèque, il est bien entendu possible et même probable qu'il reste des bogues. Si vous en voyez, contactez les auteurs. Bref: use at your own risk !

Pour ceux qui préfèrent Macaulay2, utilisez le paquet Schubert2 !

Exemple d'utilisation

Un exemple classique est le calcul du nombre des coniques lisses planes tangentes à cinque coniques générales (c’était une question de Steiner en 1848). Chaque tangence est une condition de degrée 6 sur le $P^5$ de toutes les coniques. Pour gérer les droites doubles, on éclate la surface de Veronese dans ce $P^5$, puis on détermine l'intégrale de $(6H-2E)^5$ où $E$ est le diviseur exceptionnel. Avec Chow, on calcule comme suit:

sage: P2 = Proj(2, 'k')
sage: P5 = Proj(5, 'h')
sage: f = P2.hom(['2*k'], P5)
sage: g = Blowup(f)
sage: B = g.codomain()
sage: (e, h) = B.chowring().gens()
sage: ((6*h - 2*e)^5).integral()
3264

Notons que $g$ est le morphisme correspondant à l’éclatement et que l’éclaté $B$ est donc son codomain.

$$ \begin{array}{ccc} E&\xrightarrow{g}&B\\ \downarrow&&\downarrow\scriptstyle{\sigma}{}\\ P^2 & \xrightarrow{f} & P^5 \end{array} $$

Par ailleurs, les générateurs et relations de l'anneau de Chow ainsi que le fibré tangent ou le nombre de Betti s'affichent comme suit:

sage: B.chowring().gens()
(e, h)
sage: B.chowring().rels()
[h^6, e*h^3, e^3 - 9/2*e^2*h + 15/2*e*h^2 - 4*h^3]
sage: B.tangent_bundle().chern_classes()
[1, -2*e + 6*h, -15/2*e*h + 15*h^2, 9/2*e^2*h - 93/4*e*h^2 + 28*h^3, 27/4*e^2*h^2 + 27*h^4, 12*h^5]
sage: B.betti_numbers()
[1, 2, 3, 3, 2, 1]
sage: B.tangent_bundle().chern_classes()[5].integral()  # The Euler number
12

Cubiques gauches sur les quintiques de dimension 3

Suivant une conjecture de Clemens [C, 1981], le nombre $n_d$ des courbes rationnelles de degré $d$ sur une quintique générale $Y\subset\mathbb{P}^4$ est fini. Cette conjecture a été montré par S. Katz pour $d\leq 7$ [K], Johnson et Kleiman for $d\leq 9$ [JK] et Cotteril pour $d=10$ [C1] and $d=11$ [C2]. D'après ce que je comprends elle est toujours ouverte en général.

Le nombre $n_1=2875$ est classique mais déjà le calcul de $n_2=609250$ est délicat et a été fait par Katz dans [K]. En 1991, Candelas et al. [COGP] ont proposé la valeur virtuelle de $n_d$ pour tout $d$. Givental l'a montré en 1996 [G] via les invariants de Gromov-Witten (la valeur virtuelle et $n_d$ coincident pour les degrées pour lesquels la conjecture de Clemens est vrai).

Le nombre des cubiques gauches (généralisées) sur une quintique générale $Y\subset\mathbb{P}^4$ a été calculé par Ellingsrud et Stromme et avait confirmé la prédiction de Candelas et al. En Chow, il se calcule ainsi (voir la page anglaise pour des explications détaillées):

sage: P = Grass(1, 5, 'w')
sage: W = P.sheaves["universal_quotient"]
sage: f = map_incidence_to_nets_of_quadrics(W)

sage: g = Blowup(f)
sage: Exc, H = g.domain(), g.codomain()

sage: K1, K2 = I.sheaves["K1"], I.sheaves["K2"]
sage: L1, L2 = I.sheaves["L1"], I.sheaves["L2"]
sage: Q = L1 + K2.dual()
sage: Exc_Q = Exc.base_morphism().upperstar(Q)
sage: Exc_K1 = Exc.base_morphism().upperstar(K1)
sage: AExc = Exc_Q.symm(2) * Exc_K1.determinant() * Exc.o(-1)
sage: AExcH = g.lowerstar(AExc, normal_bundle=Exc.o(-1))

sage: E, F = X.sheaves["E"], X.sheaves["F"]
sage: XW = X.base_morphism().upperstar(W)
sage: AX = (F * XW.symm(2)) - (E * XW.symm(3)) + XW.symm(5)
sage: AXH = H.base_morphism().upperstar(AX)

sage: (AXH - AExcH).chern_classes()[H.dimension()].integral()
317206375

Installation

Télécharger le paquet chow ici, puis suivre les explications dans chow.txt.

Le fichier install.txt contient quelques remarques sur une installation de sage à partir des sources (personnellement je préfère toujours compiler tout moi même), sachant que le temps de compilation est élevé (deux à trois heures sur une machine récente).

Par ailleurs, j’utilise l’environnement de développement pycharm. Le fichier pycharm.txt contient quelques remarques comment faire fonctionner pycharm et sage ensemble…

Documentation

Comme la documentation est générée automatiquement via les docstrings de python, les fichiers html et pdf sont générées au même temps. Surtout le fichier pdf devient ainsi assez long (environ 100 pages) alors que le coeur de la documentation est bien plus courte. Désolé.

Par ailleurs, comme tout sous Sage, la bibliothèque est modulaire et il est facile d'ajouter ses variétés préférées ou des extensions. Envoyer moi un mot pour les intégrer par la suite !