Skip to content

Commit 86d665a

Browse files
committed
feat(Counterexamples): invertible module not isomorphic to any ideal (leanprover-community#32027)
1 parent bc88f31 commit 86d665a

4 files changed

Lines changed: 92 additions & 3 deletions

File tree

Counterexamples.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Counterexamples.GameMultiplication
1111
import Counterexamples.Girard
1212
import Counterexamples.HeawoodUnitDistance
1313
import Counterexamples.HomogeneousPrimeNotPrime
14+
import Counterexamples.InvertibleModuleNotIdeal
1415
import Counterexamples.IrrationalPowerOfIrrational
1516
import Counterexamples.MapFloor
1617
import Counterexamples.MonicNonRegular
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/-
2+
Copyright (c) 2025 Junyan Xu. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Junyan Xu
5+
-/
6+
import Mathlib.Algebra.TrivSqZeroExt
7+
import Mathlib.Data.DFinsupp.Module
8+
import Mathlib.RingTheory.PicardGroup
9+
10+
/-!
11+
# A class of examples of invertible modules that are not isomorphic to ideals
12+
13+
References: https://math.stackexchange.com/a/5090562 or https://mathoverflow.net/a/499258
14+
-/
15+
16+
variable (R : Type*) [CommRing R]
17+
18+
/-- The trivial square-zero extension of a commutative ring R given by the direct sum
19+
R ⊕ ⨁ₘ R⧸m where m ranges over maximal ideals of R. -/
20+
abbrev SqZeroExtQuotMax := TrivSqZeroExt R (Π₀ m : MaximalSpectrum R, R ⧸ m.1)
21+
22+
instance : IsFractionRing (SqZeroExtQuotMax R) (SqZeroExtQuotMax R) :=
23+
IsFractionRing.self_iff_nonZeroDivisors_le_isUnit.mpr fun x hx ↦
24+
TrivSqZeroExt.isUnit_iff_isUnit_fst.mpr <| of_not_not fun hr ↦ by
25+
have ⟨M, hM, hrM⟩ := exists_max_ideal_of_mem_nonunits hr
26+
classical
27+
have := hx.1 (.inr <| .single ⟨M, hM⟩ 1) <| by
28+
ext1; · simp
29+
simpa [-DFinsupp.single_apply, ← DFinsupp.single_smul, DFinsupp.single_eq_zero]
30+
using (Ideal.Quotient.mk_eq_mk_iff_sub_mem ..).mpr (by simpa)
31+
simpa using congr(($this).snd)
32+
33+
/-- R as an algebra over `SqZeroExtQuotMax R`. -/
34+
abbrev SqZeroExtQuotMax.algebraBase : Algebra (SqZeroExtQuotMax R) R := TrivSqZeroExt.algebraBase ..
35+
36+
open CommRing (Pic) in
37+
/-- If the Picard group of a commutative ring R is nontrivial, then `SqZeroExtQuotMax R`
38+
has an invertible module (which is the base change of an invertible ideal of R)
39+
not isomorphic to any ideal. -/
40+
theorem SqZeroExtQuotMax.not_exists_linearEquiv_ideal_of_invertible [Nontrivial (Pic R)] :
41+
∃ M : Pic (SqZeroExtQuotMax R),
42+
¬ ∃ I : Ideal (SqZeroExtQuotMax R), Nonempty (M ≃ₗ[SqZeroExtQuotMax R] I) := by
43+
by_contra! h
44+
have ⟨M, hM⟩ := exists_ne (1 : Pic R)
45+
have ⟨I, ⟨eI⟩⟩ := h (M.mapAlgebra R _)
46+
have ⟨J, ⟨eJ⟩⟩ := h (M⁻¹.mapAlgebra R _)
47+
have := Module.Invertible.congr eI
48+
have := Module.Invertible.congr eJ
49+
obtain ⟨rfl | rfl⟩ := I.eq_top_of_mk_tensor_eq_one J <| by
50+
rw [Pic.mk_tensor, ← Pic.mk_eq_mk_iff.mpr ⟨eI⟩, ← Pic.mk_eq_mk_iff.mpr ⟨eJ⟩,
51+
Pic.mk_eq_self, Pic.mk_eq_self, ← map_mul, mul_inv_cancel, map_one]
52+
have eq := Pic.mk_eq_one_iff.mpr ⟨eI ≪≫ₗ Submodule.topEquiv⟩
53+
rw [Pic.mk_eq_self] at eq
54+
let := TrivSqZeroExt.algebraBase
55+
have eq := congr(Pic.mapAlgebra (SqZeroExtQuotMax R) R $eq)
56+
exact hM <| by rwa [map_one, Pic.mapAlgebra_mapAlgebra, Pic.mapAlgebra_self] at eq

Mathlib/Algebra/TrivSqZeroExt.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,18 @@ def fstHom : tsze R M →ₐ[S] R where
894894
map_add' := fst_add
895895
commutes' _r := fst_inl M _
896896

897+
/-- `R'` as an algebra over `TrivSqZeroExt R' M`. Not an instance since it creates a different
898+
`Algebra (TrivSqZeroExt R' M) (TrivSqZeroExt R' M)` instance from `TrivSqZeroExt.algebra'`. -/
899+
abbrev algebraBase : Algebra (tsze R' M) R' where
900+
algebraMap := (fstHom R' R' M).toRingHom
901+
smul x r := x.fst * r
902+
commutes' _ _ := mul_comm ..
903+
smul_def' _ _ := rfl
904+
905+
attribute [local instance] algebraBase in
906+
instance : IsScalarTower R' (tsze R' M) R' where
907+
smul_assoc _ _ _ := mul_assoc ..
908+
897909
/-- The canonical `S`-algebra inclusion `R → TrivSqZeroExt R M`. -/
898910
@[simps]
899911
def inlAlgHom : R →ₐ[S] tsze R M where

Mathlib/RingTheory/PicardGroup.lean

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module
88
public import Mathlib.Algebra.Category.ModuleCat.Monoidal.Symmetric
99
public import Mathlib.CategoryTheory.Monoidal.Skeleton
1010
public import Mathlib.LinearAlgebra.Contraction
11-
public import Mathlib.LinearAlgebra.TensorProduct.Submodule
11+
public import Mathlib.LinearAlgebra.LinearDisjoint
1212
public import Mathlib.RingTheory.ClassGroup
1313
public import Mathlib.RingTheory.Ideal.AssociatedPrime.Finiteness
1414
public import Mathlib.RingTheory.LocalRing.Module
@@ -525,7 +525,7 @@ variable (R) (A B : Type*) [CommSemiring A] [CommSemiring B] [Algebra R A]
525525

526526
open AlgebraTensorModule in
527527
/-- Every `R`-algebra `A` gives rise to a homomorphism between Picard groups of `R` and `A`. -/
528-
@[simps] noncomputable def mapAlgebra [Algebra R A] : Pic R →* Pic A where
528+
@[simps] noncomputable def mapAlgebra : Pic R →* Pic A where
529529
toFun M := .mk A (A ⊗[R] M)
530530
map_one' := mk_eq_one_iff.mpr (Invertible.free_iff_linearEquiv.mp inferInstance)
531531
map_mul' _ _ := by
@@ -859,7 +859,9 @@ open CommRing Pic
859859

860860
section Ideal
861861

862-
variable (R M : Type*) [CommRing R] [AddCommGroup M] [Module R M] [Module.Invertible R M]
862+
variable (R M N : Type*) [CommRing R]
863+
variable [AddCommGroup M] [Module R M] [Module.Invertible R M]
864+
variable [AddCommGroup N] [Module R N] [Module.Invertible R N]
863865

864866
/-- If `FractionRing R` has trivial Picard group,
865867
every invertible `R`-module is isomorphic to an ideal. -/
@@ -880,4 +882,22 @@ See https://mathoverflow.net/a/499611. -/
880882
example [IsNoetherianRing R] : ∃ I : Ideal R, Nonempty (M ≃ₗ[R] I) :=
881883
Module.Invertible.exists_linearEquiv_ideal R M
882884

885+
variable {R} in
886+
/-- In a total ring of fractions, if two ideals are inverse to each other in the Picard group,
887+
the only possibility is that they are both the whole ring. -/
888+
theorem Ideal.eq_top_of_mk_tensor_eq_one [IsFractionRing R R] (I J : Ideal R)
889+
[Module.Invertible R I] [Module.Invertible R J] (h : Pic.mk R (I ⊗[R] J) = 1) :
890+
I = ⊤ ∧ J = ⊤ := by
891+
have ⟨e⟩ := mk_eq_one_iff.mp h
892+
have e := e.symm ≪≫ₗ Submodule.LinearDisjoint.mulMap
893+
(.of_left_le_one_of_flat I J <| le_top.trans one_eq_top.ge)
894+
have : IsUnit (e 1 : R) := IsFractionRing.self_iff_nonZeroDivisors_le_isUnit.mp ‹_› <|
895+
IsRegular.mem_nonZeroDivisors <| isRightRegular_iff_isRegular.mp <| by
896+
rw [IsRightRegular]
897+
convert Subtype.val_injective.comp e.injective using 2
898+
rw [← smul_eq_mul, ← Submodule.coe_smul, ← map_smul, smul_eq_mul, mul_one]
899+
rfl
900+
constructor <;> refine eq_top_of_isUnit_mem _ ?_ this
901+
exacts [mul_le_right (e 1).2, mul_le_left (e 1).2]
902+
883903
end Ideal

0 commit comments

Comments
 (0)