Skip to content

Commit 2e7b749

Browse files
committed
feat(RingTheory): define maps of homogeneous ideals (leanprover-community#30334)
In this file we define `HomogeneousIdeal.map` and `HomogeneousIdeal.comap`, similar to and based on the existing `Ideal.map` and `Ideal.comap`. More concretely, a graded ring homomorphism `π’œ β†’+*ᡍ ℬ` induces a "Galois connection" between the homogeneous ideals in `π’œ` and the homogeneous ideals in `ℬ`.
1 parent 45362d7 commit 2e7b749

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

β€ŽMathlib.leanβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6199,6 +6199,7 @@ public import Mathlib.RingTheory.Frobenius
61996199
public import Mathlib.RingTheory.GradedAlgebra.Basic
62006200
public import Mathlib.RingTheory.GradedAlgebra.FiniteType
62016201
public import Mathlib.RingTheory.GradedAlgebra.Homogeneous.Ideal
6202+
public import Mathlib.RingTheory.GradedAlgebra.Homogeneous.Maps
62026203
public import Mathlib.RingTheory.GradedAlgebra.Homogeneous.Submodule
62036204
public import Mathlib.RingTheory.GradedAlgebra.Homogeneous.Subsemiring
62046205
public import Mathlib.RingTheory.GradedAlgebra.HomogeneousLocalization

β€ŽMathlib/RingTheory/GradedAlgebra/Homogeneous/Ideal.leanβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,18 @@ variable {π’œ}
7676
abbrev HomogeneousIdeal.toIdeal (I : HomogeneousIdeal π’œ) : Ideal A :=
7777
I.toSubmodule
7878

79+
@[simp] lemma coe_toIdeal (I : HomogeneousIdeal π’œ) : (I.toIdeal : Set A) = I := rfl
80+
7981
theorem HomogeneousIdeal.isHomogeneous (I : HomogeneousIdeal π’œ) :
8082
I.toIdeal.IsHomogeneous π’œ := I.is_homogeneous'
8183

8284
theorem HomogeneousIdeal.toIdeal_injective :
8385
Function.Injective (HomogeneousIdeal.toIdeal : HomogeneousIdeal π’œ β†’ Ideal A) :=
8486
HomogeneousSubmodule.toSubmodule_injective π’œ π’œ
8587

88+
@[simp] lemma toIdeal_le_toIdeal_iff {I J : HomogeneousIdeal π’œ} :
89+
I.toIdeal ≀ J.toIdeal ↔ I ≀ J := Iff.rfl
90+
8691
instance HomogeneousIdeal.setLike : SetLike (HomogeneousIdeal π’œ) A :=
8792
HomogeneousSubmodule.setLike π’œ π’œ
8893

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/-
2+
Copyright (c) 2025 Kenny Lau. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kenny Lau
5+
-/
6+
module
7+
8+
public import Mathlib.RingTheory.GradedAlgebra.Homogeneous.Ideal
9+
public import Mathlib.RingTheory.GradedAlgebra.RingHom
10+
11+
/-!
12+
# Maps on homogeneous ideals
13+
14+
In this file we define `HomogeneousIdeal.map` and `HomogeneousIdeal.comap`.
15+
-/
16+
17+
@[expose] public section
18+
19+
variable {A B C Οƒ Ο„ Ο‰ ΞΉ F G : Type*}
20+
[Semiring A] [Semiring B] [Semiring C]
21+
[SetLike Οƒ A] [SetLike Ο„ B] [SetLike Ο‰ C]
22+
[AddSubmonoidClass Οƒ A] [AddSubmonoidClass Ο„ B] [AddSubmonoidClass Ο‰ C]
23+
[DecidableEq ΞΉ] [AddMonoid ΞΉ]
24+
{π’œ : ΞΉ β†’ Οƒ} {ℬ : ΞΉ β†’ Ο„} {π’ž : ΞΉ β†’ Ο‰}
25+
[GradedRing π’œ] [GradedRing ℬ] [GradedRing π’ž]
26+
(f : π’œ β†’+*ᡍ ℬ) (g : ℬ β†’+*ᡍ π’ž)
27+
28+
namespace HomogeneousIdeal
29+
30+
/-- Map a homogeneous ideal along a graded ring homomorphism. The underlying ideal is
31+
(definitionally) equal to `Ideal.map`. -/
32+
def map (I : HomogeneousIdeal π’œ) : HomogeneousIdeal ℬ where
33+
__ := I.toIdeal.map f
34+
is_homogeneous' i b hb := by
35+
rw [Ideal.map] at hb
36+
induction hb using Submodule.span_induction generalizing i with
37+
| zero => simp
38+
| add => simp [*, Ideal.add_mem]
39+
| mem a ha =>
40+
obtain ⟨a, ha, rfl⟩ := ha
41+
rw [← f.map_directSumDecompose]
42+
exact Ideal.mem_map_of_mem _ (I.2 _ ha)
43+
| smul a₁ aβ‚‚ haβ‚‚ ih =>
44+
classical rw [smul_eq_mul, DirectSum.decompose_mul, DirectSum.coe_mul_apply]
45+
exact sum_mem fun ij hij ↦ Ideal.mul_mem_left _ _ <| ih _
46+
47+
/-- Pull back a homogeneous ideal along a graded ring homomorphism.
48+
The underlying ideal is (definitionally) equal to `Ideal.comap`, whose underlying set is
49+
definitionally equal to the preimage. -/
50+
def comap (I : HomogeneousIdeal ℬ) : HomogeneousIdeal π’œ where
51+
__ := I.toIdeal.comap f
52+
is_homogeneous' n a ha := by
53+
rw [Ideal.mem_comap, HomogeneousIdeal.mem_iff, f.map_directSumDecompose]
54+
exact I.2 _ ha
55+
56+
variable {I I₁ Iβ‚‚ I₃ : HomogeneousIdeal π’œ} {J J₁ Jβ‚‚ J₃ : HomogeneousIdeal ℬ}
57+
{K : HomogeneousIdeal π’ž}
58+
59+
lemma map_le_iff_le_comap : I.map f ≀ J ↔ I ≀ J.comap f := Ideal.map_le_iff_le_comap
60+
61+
alias ⟨le_comap_of_map_le, map_le_of_le_comap⟩ := map_le_iff_le_comap
62+
63+
theorem gc_map_comap : GaloisConnection (map f) (comap f) := fun _ _ ↦
64+
map_le_iff_le_comap f
65+
66+
@[mono, aesop safe apply] lemma map_mono : Monotone (map f) := (gc_map_comap f).monotone_l
67+
68+
@[mono] lemma comap_mono : Monotone (comap f) := (gc_map_comap f).monotone_u
69+
70+
@[simp] lemma toIdeal_comap : (J.comap f).toIdeal = J.toIdeal.comap f := rfl
71+
72+
@[simp] lemma coe_comap : J.comap f = f ⁻¹' J := rfl
73+
74+
@[simp] lemma toIdeal_map : (I.map f).toIdeal = I.toIdeal.map f := rfl
75+
76+
instance isPrime_comap [J.toIdeal.IsPrime] : (J.comap f).toIdeal.IsPrime :=
77+
inferInstanceAs (J.toIdeal.comap f).IsPrime -- this shows that the simpNF already has the instance
78+
79+
@[simp] lemma map_id : I.map (GradedRingHom.id π’œ) = I := ext <| Ideal.map_id _
80+
81+
lemma map_map : (I.map f).map g = I.map (g.comp f) := ext <| Ideal.map_map _ _
82+
83+
lemma map_comp : I.map (g.comp f) = (I.map f).map g := (map_map f g).symm
84+
85+
@[simp] lemma comap_id : I.comap (GradedRingHom.id π’œ) = I := rfl
86+
87+
lemma comap_comap : (K.comap g).comap f = K.comap (g.comp f) := rfl
88+
89+
end HomogeneousIdeal

0 commit comments

Comments
Β (0)