Skip to content

Commit 6c9edae

Browse files
Raph-DGReemMelamed
authored andcommitted
feat(AlgebraicGeometry): Pushforward of algebraic cycles (leanprover-community#26304)
In this PR we define a notion of the "pushfoward of functions with locally finite support". We give this PR the suggestive title "pushforward of algebraic cycles" because we will go on to model algebraic cycles on a scheme X as functions from X to the integers with locally finite support. - [x] depends on: leanprover-community#26225 - [x] depends on: leanprover-community#26259 - [x] depends on: leanprover-community#35807 Co-authored-by: Raph-DG <raphaeldouglasgiles@gmail.com>
1 parent 304bad9 commit 6c9edae

3 files changed

Lines changed: 91 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7863,6 +7863,7 @@ public import Mathlib.Topology.LocallyConstant.Algebra
78637863
public import Mathlib.Topology.LocallyConstant.Basic
78647864
public import Mathlib.Topology.LocallyFinite
78657865
public import Mathlib.Topology.LocallyFinsupp
7866+
public import Mathlib.Topology.LocallyFinsupp.Pushforward
78667867
public import Mathlib.Topology.Maps.Basic
78677868
public import Mathlib.Topology.Maps.OpenQuotient
78687869
public import Mathlib.Topology.Maps.Proper.Basic

Mathlib/Topology/LocallyFinsupp.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,14 @@ instance [Zero Y] : FunLike (locallyFinsuppWithin U Y) X Y where
126126
coe D := D.toFun
127127
coe_injective' := fun ⟨_, _, _⟩ ⟨_, _, _⟩ ↦ by simp
128128

129+
@[simp]
130+
lemma toFun_eq_coe [Zero Y] (c : locallyFinsuppWithin U Y) : c.toFun = ⇑c := rfl
131+
132+
@[simp]
133+
lemma coe_mk [Zero Y] (f : X → Y) (h : f.support ⊆ U)
134+
(h' : ∀ z ∈ U, ∃ t ∈ 𝓝 z, Set.Finite (t ∩ f.support)) :
135+
⇑(Function.locallyFinsuppWithin.mk f h h') = f := rfl
136+
129137
/-- This allows writing `D.support` instead of `Function.support D` -/
130138
abbrev support [Zero Y] (D : locallyFinsuppWithin U Y) := Function.support D
131139

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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.Topology.LocallyFinsupp
9+
public import Mathlib.Topology.Spectral.Basic
10+
11+
/-!
12+
# Pushforward of functions with locally finite support
13+
14+
In this file we define the notion of the pushforward of a function with locally finite support
15+
between prespectral spaces along a spectral map. This is used for defining the (proper) pushforward
16+
of algebraic cycles in algebraic geometry.
17+
18+
## Main declarations
19+
20+
- `Function.locallyFinsupp.map`: If `f : X → Y` is a spectral map between spectral spaces and
21+
`c : X → R` is locally of finite support, the pushforward of `c` along `f` at `y : Y` is
22+
`∑ᶠ x ∈ f ⁻¹' {y}, c x * w x`, where `w : X → R` is a weight function.
23+
24+
## Notes
25+
26+
In the case of algebraic cycles, the weight function used in `Function.locallyFinsupp.map` will be
27+
specialized to the degree of the residue field extension
28+
(see https://stacks.math.columbia.edu/tag/02R4).
29+
-/
30+
31+
@[expose] public section
32+
33+
open Set Order Topology TopologicalSpace
34+
35+
variable {X Y R : Type*} [TopologicalSpace X] [TopologicalSpace Y]
36+
{f : X → Y} (hf : IsSpectralMap f) (w : X → R)
37+
38+
namespace Function.locallyFinsupp
39+
40+
variable [Semiring R] {W : Set Y} (hW : IsOpen W) (c : Function.locallyFinsupp X R)
41+
[PrespectralSpace Y]
42+
43+
variable (f) in
44+
/--
45+
The pushforward of a function `c` of locally finite support by a spectral map with respect to a
46+
weight function `w`.
47+
-/
48+
noncomputable
49+
def map (hf : IsSpectralMap f) (c : locallyFinsupp X R) : Function.locallyFinsupp Y R where
50+
toFun z := ∑ᶠ x ∈ f ⁻¹' {z}, c x * w x
51+
supportWithinDomain' := by simp
52+
supportLocallyFiniteWithinDomain' y _ := by
53+
obtain ⟨U, hU⟩ := (PrespectralSpace.isTopologicalBasis (X := Y)).exists_subset_of_mem_open
54+
(by simp : y ∈ ⊤) (by simp)
55+
refine ⟨U, IsOpen.mem_nhds hU.1.1 hU.2.1, ?_⟩
56+
suffices h : (U ∩ {z | (f ⁻¹' {z} ∩ support ⇑c).Nonempty}).Finite by
57+
refine h.subset (inter_subset_inter_right U fun y hy ↦ ?_)
58+
obtain ⟨x, (hx : f x = y), h'⟩ := exists_ne_zero_of_finsum_mem_ne_zero hy
59+
use x
60+
grind [mem_support]
61+
suffices (f ⁻¹' (U ∩ {z | (f ⁻¹' {z} ∩ c.support).Nonempty}) ∩ c.support).Finite from
62+
(this.image f).subset (fun a ha ↦ by grind [Set.Nonempty])
63+
exact (c.locallyFiniteSupport.finite_inter_support_of_isCompact <| hf.2 hU.1.1 hU.1.2).subset
64+
(by simp; grind)
65+
66+
@[simp]
67+
lemma map_apply (hf : IsSpectralMap f) (c : locallyFinsupp X R) (y : Y) :
68+
map f w hf c y = ∑ᶠ x ∈ f ⁻¹' {y}, c x * w x := rfl
69+
70+
lemma support_map_subset_of_forall_mem (s : Set X) (t : Set Y) (hc : c.support ⊆ s)
71+
(h : ∀ x : X, x ∈ s → w x ≠ 0 → f x ∈ t) : (map f w hf c).support ⊆ t := by
72+
intro y hy
73+
obtain ⟨x, (rfl : f x = y), h'⟩ := exists_ne_zero_of_finsum_mem_ne_zero hy
74+
grind [mem_support]
75+
76+
@[simp]
77+
lemma map_id [PrespectralSpace X] (hw : ∀ z : X, w z = 1) :
78+
map id w isSpectralMap_id c = c := by
79+
ext
80+
simp [map, hw]
81+
82+
end Function.locallyFinsupp

0 commit comments

Comments
 (0)