Skip to content

Commit d31b573

Browse files
committed
feat(AlgebraicGeometry): define algebraic cycles (#37901)
In this PR we define the notion of algebraic cycles on a scheme, and define the pushforward of an algebraic cycle by a quasicompact morhphism. This was originally defined in #26304, but after some refactoring it was decided that it would be best to split this definition into a separate PR. Co-authored-by: Raph-DG <raphaeldouglasgiles@gmail.com>
1 parent bb39487 commit d31b573

3 files changed

Lines changed: 94 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,7 @@ public import Mathlib.AlgebraicGeometry.AffineScheme
13461346
public import Mathlib.AlgebraicGeometry.AffineSpace
13471347
public import Mathlib.AlgebraicGeometry.AffineTransitionLimit
13481348
public import Mathlib.AlgebraicGeometry.AlgClosed.Basic
1349+
public import Mathlib.AlgebraicGeometry.AlgebraicCycle.Basic
13491350
public import Mathlib.AlgebraicGeometry.Artinian
13501351
public import Mathlib.AlgebraicGeometry.Birational.Dominant
13511352
public import Mathlib.AlgebraicGeometry.Birational.RationalMap
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/-
2+
Copyright (c) 2026 Raphael Douglas Giles. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Raphael Douglas Giles
5+
-/
6+
module
7+
8+
public import Mathlib.AlgebraicGeometry.Morphisms.QuasiCompact
9+
public import Mathlib.AlgebraicGeometry.Properties
10+
public import Mathlib.Topology.LocallyFinsupp.Pushforward
11+
public import Mathlib.AlgebraicGeometry.ResidueField
12+
13+
/-!
14+
# Algebraic Cycles
15+
16+
In this file we define algebraic cycles on a scheme `X` with coefficients in a type `R` and provide
17+
some basic API for working with them. We define an algebraic cycle on a scheme `X` with
18+
coefficients in a type `R` to be functions `c : X → R` whose support is locally finite.
19+
20+
## Implementation notes
21+
22+
Here we're making use of the equivalence between irreducible closed subsets of a scheme and their
23+
generic points in order to reuse the API in `Function.locallyFinsupp`, hence the slightly
24+
nonstandard definition.
25+
-/
26+
27+
@[expose] public section
28+
29+
namespace AlgebraicGeometry
30+
31+
open CategoryTheory
32+
33+
universe u v
34+
variable {X Y : Scheme.{u}} {R : Type*}
35+
36+
/--
37+
Algebraic cycle on a scheme `X` with coefficients in a type `Z` is just a function from `X` to `Z`
38+
with locally finite support (see the module docstring for more details).
39+
40+
Note: currently this is an abbrev to save some effort in duplicating API. This seems fine for now,
41+
but be aware of this if there is ever an instance clash involving algebraic cycles.
42+
-/
43+
@[stacks 02QR]
44+
abbrev AlgebraicCycle (X : Scheme.{u}) (R : Type*) [Zero R] :=
45+
Function.locallyFinsupp X R
46+
47+
variable (f : X ⟶ Y) [Semiring R] (c : AlgebraicCycle X R) (x : X) (z : Y)
48+
namespace AlgebraicCycle
49+
50+
/--
51+
Implementation detail for `AlgebraicCycle.map`: function used to define the coefficient of the
52+
pushforward of a cycle `c` at a point `z = f x`.
53+
-/
54+
@[stacks 02R3]
55+
noncomputable def mapCoeff {N : Type*} [DecidableEq N] {Y : Scheme} (f : X ⟶ Y) (wx : X → N)
56+
(wy : Y → N) (x : X) : ℕ := if wx x = wy (f.base x) then f.residueDegree x else 0
57+
58+
/--
59+
The pushforward of algebraic cycles with respect to a quasicompact morphism of schemes. The
60+
arguments `wx` and `wy` are certain weight functions used to calculate how the weights of the
61+
algebraic cycle should be adjusted to make the pushforward operation functorial. Typically in
62+
applications these will be some notions of dimension or codimension. The most common notion of
63+
dimension is `Order.height`, and the most common notion of codimension is `Order.coheight`, though
64+
more sophisticated notions exist in the literature which are useful when sufficient
65+
equidimensionality hypotheses cannot be assumed.
66+
-/
67+
@[stacks 02R3]
68+
noncomputable
69+
def map [QuasiCompact f] {N : Type*} [DecidableEq N] (wx : X → N) (wy : Y → N)
70+
(c : AlgebraicCycle X R) : AlgebraicCycle Y R :=
71+
Function.locallyFinsupp.map f (Nat.cast (R := R) <| mapCoeff f wx wy ·) f.isSpectralMap c
72+
73+
@[simp]
74+
lemma map_id {N : Type*} [DecidableEq N] (wx : X → N) (c : AlgebraicCycle X R) :
75+
map (𝟙 _) wx wx c = c := by
76+
apply Function.locallyFinsupp.map_id
77+
simp [mapCoeff]
78+
79+
end AlgebraicGeometry.AlgebraicCycle

Mathlib/AlgebraicGeometry/ResidueField.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ lemma residueFieldMap_comp {Z : Scheme.{u}} (g : Y ⟶ Z) (x : X) :
140140
(f ≫ g).residueFieldMap x = g.residueFieldMap (f x) ≫ f.residueFieldMap x :=
141141
LocallyRingedSpace.residueFieldMap_comp _ _ _
142142

143+
/--
144+
Degree of `f` at a point `x` is defined to be the degree of the associated field extension
145+
from `κ(f x)` to `κ(x)`. We return a default value of zero when this degree is infinite.
146+
-/
147+
def Hom.residueDegree (f : X ⟶ Y) (x : X) : ℕ :=
148+
letI := (f.residueFieldMap x).hom.toAlgebra
149+
Module.finrank (Y.residueField (f x)) (X.residueField x)
150+
151+
@[simp]
152+
lemma Hom.residueDegree_id (x : X) : (𝟙 _ : X ⟶ X).residueDegree x = 1 := by
153+
dsimp [residueDegree]
154+
rw [residueFieldMap_id]
155+
exact CommSemiring.finrank_self _
156+
143157
@[reassoc]
144158
lemma evaluation_naturality {V : Opens Y} (x : X) (hx : f x ∈ V) :
145159
Y.evaluation V (f x) hx ≫ f.residueFieldMap x =

0 commit comments

Comments
 (0)