@@ -5,22 +5,19 @@ Authors: Kenny Lau
5
5
-/
6
6
import Mathlib.Algebra.Algebra.Operations
7
7
import Mathlib.Algebra.Ring.Equiv
8
- import Mathlib.Data.Nat.Choose.Sum
9
- import Mathlib.Data.Nat.Interval
10
8
import Mathlib.Data.Fintype.Lattice
11
9
import Mathlib.RingTheory.Coprime.Lemmas
12
10
import Mathlib.RingTheory.Ideal.Basic
13
- import Mathlib.Algebra.GroupWithZero.NonZeroDivisors
14
- import Mathlib.LinearAlgebra.Basis
15
- import Mathlib.LinearAlgebra.Quotient
16
- import Mathlib.Algebra.Order.Group.Action
17
11
18
12
#align_import ring_theory.ideal.operations from "leanprover-community/mathlib" @"e7f0ddbf65bd7181a85edb74b64bdc35ba4bdc74"
19
13
20
14
/-!
21
15
# More operations on modules and ideals
22
16
-/
23
17
18
+ assert_not_exists Basis -- See `RingTheory.Ideal.Basis`
19
+ assert_not_exists Submodule.hasQuotient -- See `RingTheory.Ideal.QuotientOperations`
20
+
24
21
universe u v w x
25
22
26
23
open BigOperators Pointwise
@@ -386,78 +383,6 @@ theorem smul_comap_le_comap_smul (f : M →ₗ[R] M') (S : Submodule R M') (I :
386
383
387
384
end CommSemiring
388
385
389
- section CommRing
390
-
391
- variable [CommRing R] [AddCommGroup M] [Module R M]
392
- variable {N N₁ N₂ P P₁ P₂ : Submodule R M}
393
-
394
- /-- `N.colon P` is the ideal of all elements `r : R` such that `r • P ⊆ N`. -/
395
- def colon (N P : Submodule R M) : Ideal R :=
396
- annihilator (P.map N.mkQ)
397
- #align submodule.colon Submodule.colon
398
-
399
- theorem mem_colon {r} : r ∈ N.colon P ↔ ∀ p ∈ P, r • p ∈ N :=
400
- mem_annihilator.trans
401
- ⟨fun H p hp => (Quotient.mk_eq_zero N).1 (H (Quotient.mk p) (mem_map_of_mem hp)),
402
- fun H _ ⟨p, hp, hpm⟩ => hpm ▸ (N.mkQ.map_smul r p ▸ (Quotient.mk_eq_zero N).2 <| H p hp)⟩
403
- #align submodule.mem_colon Submodule.mem_colon
404
-
405
- theorem mem_colon' {r} : r ∈ N.colon P ↔ P ≤ comap (r • (LinearMap.id : M →ₗ[R] M)) N :=
406
- mem_colon
407
- #align submodule.mem_colon' Submodule.mem_colon'
408
-
409
- @[simp]
410
- theorem colon_top {I : Ideal R} : I.colon ⊤ = I := by
411
- simp_rw [SetLike.ext_iff, mem_colon, smul_eq_mul]
412
- exact fun x ↦ ⟨fun h ↦ mul_one x ▸ h 1 trivial, fun h _ _ ↦ I.mul_mem_right _ h⟩
413
-
414
- @[simp]
415
- theorem colon_bot : colon ⊥ N = N.annihilator := by
416
- simp_rw [SetLike.ext_iff, mem_colon, mem_annihilator, mem_bot, forall_const]
417
-
418
- theorem colon_mono (hn : N₁ ≤ N₂) (hp : P₁ ≤ P₂) : N₁.colon P₂ ≤ N₂.colon P₁ := fun _ hrnp =>
419
- mem_colon.2 fun p₁ hp₁ => hn <| mem_colon.1 hrnp p₁ <| hp hp₁
420
- #align submodule.colon_mono Submodule.colon_mono
421
-
422
- theorem iInf_colon_iSup (ι₁ : Sort w) (f : ι₁ → Submodule R M) (ι₂ : Sort x)
423
- (g : ι₂ → Submodule R M) : (⨅ i, f i).colon (⨆ j, g j) = ⨅ (i) (j), (f i).colon (g j) :=
424
- le_antisymm (le_iInf fun _ => le_iInf fun _ => colon_mono (iInf_le _ _) (le_iSup _ _)) fun _ H =>
425
- mem_colon'.2 <|
426
- iSup_le fun j =>
427
- map_le_iff_le_comap.1 <|
428
- le_iInf fun i =>
429
- map_le_iff_le_comap.2 <|
430
- mem_colon'.1 <|
431
- have := (mem_iInf _).1 H i
432
- have := (mem_iInf _).1 this j
433
- this
434
- #align submodule.infi_colon_supr Submodule.iInf_colon_iSup
435
-
436
- @[simp]
437
- theorem mem_colon_singleton {N : Submodule R M} {x : M} {r : R} :
438
- r ∈ N.colon (Submodule.span R {x}) ↔ r • x ∈ N :=
439
- calc
440
- r ∈ N.colon (Submodule.span R {x}) ↔ ∀ a : R, r • a • x ∈ N := by
441
- simp [Submodule.mem_colon, Submodule.mem_span_singleton]
442
- _ ↔ r • x ∈ N := by simp_rw [fun (a : R) ↦ smul_comm r a x]; exact SetLike.forall_smul_mem_iff
443
- #align submodule.mem_colon_singleton Submodule.mem_colon_singleton
444
-
445
- @[simp]
446
- theorem _root_.Ideal.mem_colon_singleton {I : Ideal R} {x r : R} :
447
- r ∈ I.colon (Ideal.span {x}) ↔ r * x ∈ I := by
448
- simp only [← Ideal.submodule_span_eq, Submodule.mem_colon_singleton, smul_eq_mul]
449
- #align ideal.mem_colon_singleton Ideal.mem_colon_singleton
450
-
451
- theorem annihilator_quotient {N : Submodule R M} :
452
- Module.annihilator R (M ⧸ N) = N.colon ⊤ := by
453
- simp_rw [SetLike.ext_iff, Module.mem_annihilator, colon, mem_annihilator, map_top,
454
- LinearMap.range_eq_top.mpr (mkQ_surjective N), mem_top, forall_true_left, forall_const]
455
-
456
- theorem _root_.Ideal.annihilator_quotient {I : Ideal R} : Module.annihilator R (R ⧸ I) = I := by
457
- rw [Submodule.annihilator_quotient, colon_top]
458
-
459
- end CommRing
460
-
461
386
end Submodule
462
387
463
388
namespace Ideal
@@ -2030,43 +1955,6 @@ theorem range_finsuppTotal :
2030
1955
2031
1956
end Total
2032
1957
2033
- section Basis
2034
-
2035
- variable {ι R S : Type *} [CommSemiring R] [CommRing S] [IsDomain S] [Algebra R S]
2036
-
2037
- /-- A basis on `S` gives a basis on `Ideal.span {x}`, by multiplying everything by `x`. -/
2038
- noncomputable def basisSpanSingleton (b : Basis ι R S) {x : S} (hx : x ≠ 0 ) :
2039
- Basis ι R (span ({x} : Set S)) :=
2040
- b.map <|
2041
- LinearEquiv.ofInjective (Algebra.lmul R S x) (LinearMap.mul_injective hx) ≪≫ₗ
2042
- LinearEquiv.ofEq _ _
2043
- (by
2044
- ext
2045
- simp [mem_span_singleton', mul_comm]) ≪≫ₗ
2046
- (Submodule.restrictScalarsEquiv R S S (Ideal.span ({x} : Set S))).restrictScalars R
2047
- #align ideal.basis_span_singleton Ideal.basisSpanSingleton
2048
-
2049
- @[simp]
2050
- theorem basisSpanSingleton_apply (b : Basis ι R S) {x : S} (hx : x ≠ 0 ) (i : ι) :
2051
- (basisSpanSingleton b hx i : S) = x * b i := by
2052
- simp only [basisSpanSingleton, Basis.map_apply, LinearEquiv.trans_apply,
2053
- Submodule.restrictScalarsEquiv_apply, LinearEquiv.ofInjective_apply, LinearEquiv.coe_ofEq_apply,
2054
- LinearEquiv.restrictScalars_apply, Algebra.coe_lmul_eq_mul, LinearMap.mul_apply']
2055
- -- This used to be the end of the proof before leanprover/lean4#2644
2056
- erw [LinearEquiv.coe_ofEq_apply, LinearEquiv.ofInjective_apply, Algebra.coe_lmul_eq_mul,
2057
- LinearMap.mul_apply']
2058
- #align ideal.basis_span_singleton_apply Ideal.basisSpanSingleton_apply
2059
-
2060
- @[simp]
2061
- theorem constr_basisSpanSingleton {N : Type *} [Semiring N] [Module N S] [SMulCommClass R N S]
2062
- (b : Basis ι R S) {x : S} (hx : x ≠ 0 ) :
2063
- (b.constr N).toFun (((↑) : _ → S) ∘ (basisSpanSingleton b hx)) = Algebra.lmul R S x :=
2064
- b.ext fun i => by
2065
- erw [Basis.constr_basis, Function.comp_apply, basisSpanSingleton_apply, LinearMap.mul_apply']
2066
- #align ideal.constr_basis_span_singleton Ideal.constr_basisSpanSingleton
2067
-
2068
- end Basis
2069
-
2070
1958
end Ideal
2071
1959
2072
1960
section span_range
@@ -2089,21 +1977,6 @@ theorem Associates.mk_ne_zero' {R : Type*} [CommSemiring R] {r : R} :
2089
1977
rw [Associates.mk_ne_zero, Ideal.zero_eq_bot, Ne, Ideal.span_singleton_eq_bot]
2090
1978
#align associates.mk_ne_zero' Associates.mk_ne_zero'
2091
1979
2092
- -- Porting note: added explicit coercion `(b i : S)`
2093
- /-- If `I : Ideal S` has a basis over `R`,
2094
- `x ∈ I` iff it is a linear combination of basis vectors. -/
2095
- theorem Basis.mem_ideal_iff {ι R S : Type *} [CommRing R] [CommRing S] [Algebra R S] {I : Ideal S}
2096
- (b : Basis ι R I) {x : S} : x ∈ I ↔ ∃ c : ι →₀ R, x = Finsupp.sum c fun i x => x • (b i : S) :=
2097
- (b.map ((I.restrictScalarsEquiv R _ _).restrictScalars R).symm).mem_submodule_iff
2098
- #align basis.mem_ideal_iff Basis.mem_ideal_iff
2099
-
2100
- /-- If `I : Ideal S` has a finite basis over `R`,
2101
- `x ∈ I` iff it is a linear combination of basis vectors. -/
2102
- theorem Basis.mem_ideal_iff' {ι R S : Type *} [Fintype ι] [CommRing R] [CommRing S] [Algebra R S]
2103
- {I : Ideal S} (b : Basis ι R I) {x : S} : x ∈ I ↔ ∃ c : ι → R, x = ∑ i, c i • (b i : S) :=
2104
- (b.map ((I.restrictScalarsEquiv R _ _).restrictScalars R).symm).mem_submodule_iff'
2105
- #align basis.mem_ideal_iff' Basis.mem_ideal_iff'
2106
-
2107
1980
namespace RingHom
2108
1981
2109
1982
variable {R : Type u} {S : Type v} {T : Type w}
0 commit comments