ring_theory.filtration
⟷
Mathlib.RingTheory.Filtration
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -7,7 +7,7 @@ import RingTheory.Ideal.LocalRing
import RingTheory.Noetherian
import RingTheory.ReesAlgebra
import RingTheory.Finiteness
-import Data.Polynomial.Module.Basic
+import Algebra.Polynomial.Module.Basic
import Order.Hom.Lattice
#align_import ring_theory.filtration from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -7,7 +7,7 @@ import RingTheory.Ideal.LocalRing
import RingTheory.Noetherian
import RingTheory.ReesAlgebra
import RingTheory.Finiteness
-import Data.Polynomial.Module
+import Data.Polynomial.Module.Basic
import Order.Hom.Lattice
#align_import ring_theory.filtration from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
@@ -71,7 +71,7 @@ theorem pow_smul_le (i j : ℕ) : I ^ i • F.n j ≤ F.n (i + j) :=
by
induction i
· simp
- · rw [pow_succ, mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
+ · rw [pow_succ', mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
exact (Submodule.smul_mono_right i_ih).trans (F.smul_le _)
#align ideal.filtration.pow_smul_le Ideal.Filtration.pow_smul_le
-/
@@ -266,7 +266,7 @@ theorem stable_iff_exists_pow_smul_eq_of_ge :
F.Stable ↔ ∃ n₀, ∀ n ≥ n₀, F.n n = I ^ (n - n₀) • F.n n₀ :=
by
refine' ⟨stable.exists_pow_smul_eq_of_ge, fun h => ⟨h.some, fun n hn => _⟩⟩
- rw [h.some_spec n hn, h.some_spec (n + 1) (by linarith), smul_smul, ← pow_succ,
+ rw [h.some_spec n hn, h.some_spec (n + 1) (by linarith), smul_smul, ← pow_succ',
tsub_add_eq_add_tsub hn]
#align ideal.filtration.stable_iff_exists_pow_smul_eq_of_ge Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -313,7 +313,7 @@ protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M)
rw [Subalgebra.smul_def, PolynomialModule.smul_apply]
apply Submodule.sum_mem
rintro ⟨j, k⟩ e
- rw [Finset.Nat.mem_antidiagonal] at e
+ rw [Finset.Nat.mem_antidiagonal] at e
subst e
exact F.pow_smul_le j k (Submodule.smul_mem_smul (r.2 j) (hf k))
#align ideal.filtration.submodule Ideal.Filtration.submodule
@@ -385,8 +385,8 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
intro x hx
obtain ⟨l, hl⟩ := (Finsupp.mem_span_iff_total _ _ _).mp (H _ ⟨x, hx, rfl⟩)
replace hl := congr_arg (fun f : ℕ →₀ M => f (n + 1)) hl
- dsimp only at hl
- erw [Finsupp.single_eq_same] at hl
+ dsimp only at hl
+ erw [Finsupp.single_eq_same] at hl
rw [← hl, Finsupp.total_apply, Finsupp.sum_apply]
apply Submodule.sum_mem _ _
rintro ⟨_, _, ⟨n', rfl⟩, _, ⟨hn', rfl⟩, m, hm, rfl⟩ -
@@ -394,7 +394,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
rw [Subalgebra.smul_def, smul_single_apply, if_pos (show n' ≤ n + 1 by linarith)]
have e : n' ≤ n := by linarith
have := F.pow_smul_le_pow_smul (n - n') n' 1
- rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1, ← add_tsub_assoc_of_le e, add_comm] at this
+ rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1, ← add_tsub_assoc_of_le e, add_comm] at this
exact this (Submodule.smul_mem_smul ((l _).2 <| n + 1 - n') hm)
· let F' := Submodule.span (reesAlgebra I) (⋃ i ≤ n₀, single R i '' (F.N i : Set M))
intro hF i
@@ -404,7 +404,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
· exact this _ (zero_le _)
by_cases hj' : j.succ ≤ n₀
· exact this _ hj'
- simp only [not_le, Nat.lt_succ_iff] at hj'
+ simp only [not_le, Nat.lt_succ_iff] at hj'
rw [Nat.succ_eq_add_one, ← hF _ hj']
rintro _ ⟨m, hm, rfl⟩
apply Submodule.smul_induction_on hm
@@ -468,7 +468,7 @@ theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable
rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
- rw [isNoetherian_submodule] at this
+ rw [isNoetherian_submodule] at this
exact this _ (OrderHomClass.mono (submodule_inf_hom M I) hf)
#align ideal.filtration.stable.of_le Ideal.Filtration.Stable.of_le
-/
@@ -513,7 +513,7 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Fin
· intro H; exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩
obtain ⟨k, hk⟩ := (I.stable_filtration_stable ⊤).inter_right (I.trivial_filtration N)
have := hk k (le_refl _)
- rw [hN, hN] at this
+ rw [hN, hN] at this
exact le_of_eq this.symm
· rintro ⟨r, eq⟩
rw [Submodule.mem_iInf]
@@ -559,7 +559,7 @@ theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h :
intro x hx
by_contra hx'
have := Ideal.mem_iInf_smul_pow_eq_bot_iff I x
- simp_rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one] at this
+ simp_rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one] at this
obtain ⟨r, hr⟩ := this.mp hx
have := mul_right_cancel₀ hx' (hr.trans (one_mul x).symm)
exact I.eq_top_iff_one.not.mp h (this ▸ r.prop)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -420,7 +420,41 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
#print Ideal.Filtration.submodule_fg_iff_stable /-
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
its associated submodule of is finitely generated. -/
-theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by classical
+theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
+ classical
+ delta Ideal.Filtration.Stable
+ simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
+ constructor
+ · rintro H
+ apply
+ H.stablizes_of_supr_eq
+ ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
+ · dsimp
+ rw [← Submodule.span_iUnion, ← submodule_span_single]
+ congr 1
+ ext
+ simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
+ constructor
+ · rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
+ · rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
+ · intro n m e
+ rw [Submodule.span_le, Set.iUnion₂_subset_iff]
+ intro i hi
+ refine'
+ (Set.Subset.trans _ (Set.subset_iUnion₂ i (hi.trans e : _))).trans Submodule.subset_span
+ rfl
+ · rintro ⟨n, hn⟩
+ rw [hn]
+ simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
+ apply Submodule.fg_iSup
+ rintro ⟨i, hi⟩
+ obtain ⟨s, hs⟩ := hF' i
+ have :
+ Submodule.span (reesAlgebra I) (s.image (lsingle R i) : Set (PolynomialModule R M)) =
+ Submodule.span _ (single R i '' (F.N i : Set M)) :=
+ by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
+ rw [Subtype.coe_mk, ← this]
+ exact ⟨_, rfl⟩
#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -420,41 +420,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
#print Ideal.Filtration.submodule_fg_iff_stable /-
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
its associated submodule of is finitely generated. -/
-theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
- classical
- delta Ideal.Filtration.Stable
- simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
- constructor
- · rintro H
- apply
- H.stablizes_of_supr_eq
- ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
- · dsimp
- rw [← Submodule.span_iUnion, ← submodule_span_single]
- congr 1
- ext
- simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
- constructor
- · rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
- · rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
- · intro n m e
- rw [Submodule.span_le, Set.iUnion₂_subset_iff]
- intro i hi
- refine'
- (Set.Subset.trans _ (Set.subset_iUnion₂ i (hi.trans e : _))).trans Submodule.subset_span
- rfl
- · rintro ⟨n, hn⟩
- rw [hn]
- simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
- apply Submodule.fg_iSup
- rintro ⟨i, hi⟩
- obtain ⟨s, hs⟩ := hF' i
- have :
- Submodule.span (reesAlgebra I) (s.image (lsingle R i) : Set (PolynomialModule R M)) =
- Submodule.span _ (single R i '' (F.N i : Set M)) :=
- by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
- rw [Subtype.coe_mk, ← this]
- exact ⟨_, rfl⟩
+theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by classical
#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,12 +3,12 @@ Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-/
-import Mathbin.RingTheory.Ideal.LocalRing
-import Mathbin.RingTheory.Noetherian
-import Mathbin.RingTheory.ReesAlgebra
-import Mathbin.RingTheory.Finiteness
-import Mathbin.Data.Polynomial.Module
-import Mathbin.Order.Hom.Lattice
+import RingTheory.Ideal.LocalRing
+import RingTheory.Noetherian
+import RingTheory.ReesAlgebra
+import RingTheory.Finiteness
+import Data.Polynomial.Module
+import Order.Hom.Lattice
#align_import ring_theory.filtration from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -464,7 +464,7 @@ variable {F}
theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable)
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable :=
by
- haveI := isNoetherian_of_fg_of_noetherian' h.1
+ haveI := isNoetherian_of_isNoetherianRing_of_finite h.1
rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
@@ -507,7 +507,7 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Fin
have hN : ∀ k, (I.stable_filtration ⊤ ⊓ I.trivial_filtration N).n k = N := by intro k;
exact inf_eq_right.mpr ((iInf_le _ k).trans <| le_of_eq <| by simp)
constructor
- · haveI := isNoetherian_of_fg_of_noetherian' hM.out
+ · haveI := isNoetherian_of_isNoetherianRing_of_finite hM.out
obtain ⟨r, hr₁, hr₂⟩ :=
Submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul I N (IsNoetherian.noetherian N) _
· intro H; exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-
-! This file was ported from Lean 3 source module ring_theory.filtration
-! leanprover-community/mathlib commit 2ebc1d6c2fed9f54c95bbc3998eaa5570527129a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.RingTheory.Ideal.LocalRing
import Mathbin.RingTheory.Noetherian
@@ -15,6 +10,8 @@ import Mathbin.RingTheory.Finiteness
import Mathbin.Data.Polynomial.Module
import Mathbin.Order.Hom.Lattice
+#align_import ring_theory.filtration from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
+
/-!
# `I`-filtrations of modules
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -150,20 +150,26 @@ instance : Top (I.Filtration M) :=
instance : Bot (I.Filtration M) :=
⟨I.trivialFiltration ⊥⟩
+#print Ideal.Filtration.sup_N /-
@[simp]
theorem sup_N : (F ⊔ F').n = F.n ⊔ F'.n :=
rfl
#align ideal.filtration.sup_N Ideal.Filtration.sup_N
+-/
+#print Ideal.Filtration.sSup_N /-
@[simp]
theorem sSup_N (S : Set (I.Filtration M)) : (sSup S).n = sSup (Ideal.Filtration.n '' S) :=
rfl
#align ideal.filtration.Sup_N Ideal.Filtration.sSup_N
+-/
+#print Ideal.Filtration.inf_N /-
@[simp]
theorem inf_N : (F ⊓ F').n = F.n ⊓ F'.n :=
rfl
#align ideal.filtration.inf_N Ideal.Filtration.inf_N
+-/
#print Ideal.Filtration.sInf_N /-
@[simp]
@@ -172,25 +178,33 @@ theorem sInf_N (S : Set (I.Filtration M)) : (sInf S).n = sInf (Ideal.Filtration.
#align ideal.filtration.Inf_N Ideal.Filtration.sInf_N
-/
+#print Ideal.Filtration.top_N /-
@[simp]
theorem top_N : (⊤ : I.Filtration M).n = ⊤ :=
rfl
#align ideal.filtration.top_N Ideal.Filtration.top_N
+-/
+#print Ideal.Filtration.bot_N /-
@[simp]
theorem bot_N : (⊥ : I.Filtration M).n = ⊥ :=
rfl
#align ideal.filtration.bot_N Ideal.Filtration.bot_N
+-/
+#print Ideal.Filtration.iSup_N /-
@[simp]
theorem iSup_N {ι : Sort _} (f : ι → I.Filtration M) : (iSup f).n = ⨆ i, (f i).n :=
congr_arg sSup (Set.range_comp _ _).symm
#align ideal.filtration.supr_N Ideal.Filtration.iSup_N
+-/
+#print Ideal.Filtration.iInf_N /-
@[simp]
theorem iInf_N {ι : Sort _} (f : ι → I.Filtration M) : (iInf f).n = ⨅ i, (f i).n :=
congr_arg sInf (Set.range_comp _ _).symm
#align ideal.filtration.infi_N Ideal.Filtration.iInf_N
+-/
instance : CompleteLattice (I.Filtration M) :=
Function.Injective.completeLattice Ideal.Filtration.n Ideal.Filtration.ext sup_N inf_N
@@ -226,8 +240,6 @@ theorem Ideal.stableFiltration_stable (I : Ideal R) (N : Submodule R M) :
variable {F F'} (h : F.Stable)
-include h
-
#print Ideal.Filtration.Stable.exists_pow_smul_eq /-
theorem Stable.exists_pow_smul_eq : ∃ n₀, ∀ k, F.n (n₀ + k) = I ^ k • F.n n₀ :=
by
@@ -252,8 +264,6 @@ theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.n n = I ^
#align ideal.filtration.stable.exists_pow_smul_eq_of_ge Ideal.Filtration.Stable.exists_pow_smul_eq_of_ge
-/
-omit h
-
#print Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge /-
theorem stable_iff_exists_pow_smul_eq_of_ge :
F.Stable ↔ ∃ n₀, ∀ n ≥ n₀, F.n n = I ^ (n - n₀) • F.n n₀ :=
@@ -295,6 +305,7 @@ open PolynomialModule
variable (F F')
+#print Ideal.Filtration.submodule /-
/-- The `R[IX]`-submodule of `M[X]` associated with an `I`-filtration. -/
protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M)
where
@@ -309,26 +320,34 @@ protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M)
subst e
exact F.pow_smul_le j k (Submodule.smul_mem_smul (r.2 j) (hf k))
#align ideal.filtration.submodule Ideal.Filtration.submodule
+-/
+#print Ideal.Filtration.mem_submodule /-
@[simp]
theorem mem_submodule (f : PolynomialModule R M) : f ∈ F.Submodule ↔ ∀ i, f i ∈ F.n i :=
Iff.rfl
#align ideal.filtration.mem_submodule Ideal.Filtration.mem_submodule
+-/
+#print Ideal.Filtration.inf_submodule /-
theorem inf_submodule : (F ⊓ F').Submodule = F.Submodule ⊓ F'.Submodule := by ext; exact forall_and
#align ideal.filtration.inf_submodule Ideal.Filtration.inf_submodule
+-/
variable (I M)
+#print Ideal.Filtration.submoduleInfHom /-
/-- `ideal.filtration.submodule` as an `inf_hom` -/
def submoduleInfHom : InfHom (I.Filtration M) (Submodule (reesAlgebra I) (PolynomialModule R M))
where
toFun := Ideal.Filtration.submodule
map_inf' := inf_submodule
#align ideal.filtration.submodule_inf_hom Ideal.Filtration.submoduleInfHom
+-/
variable {I M}
+#print Ideal.Filtration.submodule_closure_single /-
theorem submodule_closure_single :
AddSubmonoid.closure (⋃ i, single R i '' (F.n i : Set M)) = F.Submodule.toAddSubmonoid :=
by
@@ -345,14 +364,18 @@ theorem submodule_closure_single :
rintro c -
exact AddSubmonoid.subset_closure (Set.subset_iUnion _ c <| Set.mem_image_of_mem _ (hf c))
#align ideal.filtration.submodule_closure_single Ideal.Filtration.submodule_closure_single
+-/
+#print Ideal.Filtration.submodule_span_single /-
theorem submodule_span_single :
Submodule.span (reesAlgebra I) (⋃ i, single R i '' (F.n i : Set M)) = F.Submodule :=
by
rw [← Submodule.span_closure, submodule_closure_single]
simp
#align ideal.filtration.submodule_span_single Ideal.Filtration.submodule_span_single
+-/
+#print Ideal.Filtration.submodule_eq_span_le_iff_stable_ge /-
theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
F.Submodule = Submodule.span _ (⋃ i ≤ n₀, single R i '' (F.n i : Set M)) ↔
∀ n ≥ n₀, I • F.n n = F.n (n + 1) :=
@@ -395,7 +418,9 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
(hj <| Set.mem_image_of_mem _ hm')
· intro x y hx hy; rw [map_add]; exact F'.add_mem hx hy
#align ideal.filtration.submodule_eq_span_le_iff_stable_ge Ideal.Filtration.submodule_eq_span_le_iff_stable_ge
+-/
+#print Ideal.Filtration.submodule_fg_iff_stable /-
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
its associated submodule of is finitely generated. -/
theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
@@ -434,9 +459,11 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F
rw [Subtype.coe_mk, ← this]
exact ⟨_, rfl⟩
#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
+-/
variable {F}
+#print Ideal.Filtration.Stable.of_le /-
theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable)
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable :=
by
@@ -447,6 +474,7 @@ theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable
rw [isNoetherian_submodule] at this
exact this _ (OrderHomClass.mono (submodule_inf_hom M I) hf)
#align ideal.filtration.stable.of_le Ideal.Filtration.Stable.of_le
+-/
#print Ideal.Filtration.Stable.inter_right /-
theorem Stable.inter_right [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable) :
@@ -474,6 +502,7 @@ theorem Ideal.exists_pow_inf_eq_pow_smul [IsNoetherianRing R] [h : Module.Finite
#align ideal.exists_pow_inf_eq_pow_smul Ideal.exists_pow_inf_eq_pow_smul
-/
+#print Ideal.mem_iInf_smul_pow_eq_bot_iff /-
theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Finite R M] (x : M) :
x ∈ (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) ↔ ∃ r : I, (r : R) • x = x :=
by
@@ -497,7 +526,9 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Fin
· rw [Nat.succ_eq_one_add, pow_add, ← smul_smul, pow_one, ← Eq]
exact Submodule.smul_mem_smul r.prop hi
#align ideal.mem_infi_smul_pow_eq_bot_iff Ideal.mem_iInf_smul_pow_eq_bot_iff
+-/
+#print Ideal.iInf_pow_smul_eq_bot_of_localRing /-
theorem Ideal.iInf_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R]
[Module.Finite R M] (h : I ≠ ⊤) : (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) = ⊥ :=
by
@@ -509,7 +540,9 @@ theorem Ideal.iInf_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing
swap; · infer_instance
simp [sub_smul, hr]
#align ideal.infi_pow_smul_eq_bot_of_local_ring Ideal.iInf_pow_smul_eq_bot_of_localRing
+-/
+#print Ideal.iInf_pow_eq_bot_of_localRing /-
/-- **Krull's intersection theorem** for noetherian local rings. -/
theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h : I ≠ ⊤) :
(⨅ i : ℕ, I ^ i) = ⊥ :=
@@ -519,7 +552,9 @@ theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h
rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one]
infer_instance
#align ideal.infi_pow_eq_bot_of_local_ring Ideal.iInf_pow_eq_bot_of_localRing
+-/
+#print Ideal.iInf_pow_eq_bot_of_isDomain /-
/-- **Krull's intersection theorem** for noetherian domains. -/
theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h : I ≠ ⊤) :
(⨅ i : ℕ, I ^ i) = ⊥ := by
@@ -532,4 +567,5 @@ theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h :
have := mul_right_cancel₀ hx' (hr.trans (one_mul x).symm)
exact I.eq_top_iff_one.not.mp h (this ▸ r.prop)
#align ideal.infi_pow_eq_bot_of_is_domain Ideal.iInf_pow_eq_bot_of_isDomain
+-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
! This file was ported from Lean 3 source module ring_theory.filtration
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
+! leanprover-community/mathlib commit 2ebc1d6c2fed9f54c95bbc3998eaa5570527129a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -19,6 +19,9 @@ import Mathbin.Order.Hom.Lattice
# `I`-filtrations of modules
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains the definitions and basic results around (stable) `I`-filtrations of modules.
## Main results
@@ -295,7 +298,7 @@ variable (F F')
/-- The `R[IX]`-submodule of `M[X]` associated with an `I`-filtration. -/
protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M)
where
- carrier := { f | ∀ i, f i ∈ F.n i }
+ carrier := {f | ∀ i, f i ∈ F.n i}
add_mem' f g hf hg i := Submodule.add_mem _ (hf i) (hg i)
zero_mem' i := Submodule.zero_mem _
smul_mem' r f hf i := by
@@ -397,39 +400,39 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
its associated submodule of is finitely generated. -/
theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
classical
- delta Ideal.Filtration.Stable
- simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
- constructor
- · rintro H
- apply
- H.stablizes_of_supr_eq
- ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
- · dsimp
- rw [← Submodule.span_iUnion, ← submodule_span_single]
- congr 1
- ext
- simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
- constructor
- · rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
- · rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
- · intro n m e
- rw [Submodule.span_le, Set.iUnion₂_subset_iff]
- intro i hi
- refine'
- (Set.Subset.trans _ (Set.subset_iUnion₂ i (hi.trans e : _))).trans Submodule.subset_span
- rfl
- · rintro ⟨n, hn⟩
- rw [hn]
- simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
- apply Submodule.fg_iSup
- rintro ⟨i, hi⟩
- obtain ⟨s, hs⟩ := hF' i
- have :
- Submodule.span (reesAlgebra I) (s.image (lsingle R i) : Set (PolynomialModule R M)) =
- Submodule.span _ (single R i '' (F.N i : Set M)) :=
- by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
- rw [Subtype.coe_mk, ← this]
- exact ⟨_, rfl⟩
+ delta Ideal.Filtration.Stable
+ simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
+ constructor
+ · rintro H
+ apply
+ H.stablizes_of_supr_eq
+ ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
+ · dsimp
+ rw [← Submodule.span_iUnion, ← submodule_span_single]
+ congr 1
+ ext
+ simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
+ constructor
+ · rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
+ · rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
+ · intro n m e
+ rw [Submodule.span_le, Set.iUnion₂_subset_iff]
+ intro i hi
+ refine'
+ (Set.Subset.trans _ (Set.subset_iUnion₂ i (hi.trans e : _))).trans Submodule.subset_span
+ rfl
+ · rintro ⟨n, hn⟩
+ rw [hn]
+ simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
+ apply Submodule.fg_iSup
+ rintro ⟨i, hi⟩
+ obtain ⟨s, hs⟩ := hF' i
+ have :
+ Submodule.span (reesAlgebra I) (s.image (lsingle R i) : Set (PolynomialModule R M)) =
+ Submodule.span _ (single R i '' (F.N i : Set M)) :=
+ by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
+ rw [Subtype.coe_mk, ← this]
+ exact ⟨_, rfl⟩
#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
variable {F}
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -302,7 +302,7 @@ protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M)
rw [Subalgebra.smul_def, PolynomialModule.smul_apply]
apply Submodule.sum_mem
rintro ⟨j, k⟩ e
- rw [Finset.Nat.mem_antidiagonal] at e
+ rw [Finset.Nat.mem_antidiagonal] at e
subst e
exact F.pow_smul_le j k (Submodule.smul_mem_smul (r.2 j) (hf k))
#align ideal.filtration.submodule Ideal.Filtration.submodule
@@ -362,8 +362,8 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
intro x hx
obtain ⟨l, hl⟩ := (Finsupp.mem_span_iff_total _ _ _).mp (H _ ⟨x, hx, rfl⟩)
replace hl := congr_arg (fun f : ℕ →₀ M => f (n + 1)) hl
- dsimp only at hl
- erw [Finsupp.single_eq_same] at hl
+ dsimp only at hl
+ erw [Finsupp.single_eq_same] at hl
rw [← hl, Finsupp.total_apply, Finsupp.sum_apply]
apply Submodule.sum_mem _ _
rintro ⟨_, _, ⟨n', rfl⟩, _, ⟨hn', rfl⟩, m, hm, rfl⟩ -
@@ -371,7 +371,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
rw [Subalgebra.smul_def, smul_single_apply, if_pos (show n' ≤ n + 1 by linarith)]
have e : n' ≤ n := by linarith
have := F.pow_smul_le_pow_smul (n - n') n' 1
- rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1, ← add_tsub_assoc_of_le e, add_comm] at this
+ rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1, ← add_tsub_assoc_of_le e, add_comm] at this
exact this (Submodule.smul_mem_smul ((l _).2 <| n + 1 - n') hm)
· let F' := Submodule.span (reesAlgebra I) (⋃ i ≤ n₀, single R i '' (F.N i : Set M))
intro hF i
@@ -381,7 +381,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
· exact this _ (zero_le _)
by_cases hj' : j.succ ≤ n₀
· exact this _ hj'
- simp only [not_le, Nat.lt_succ_iff] at hj'
+ simp only [not_le, Nat.lt_succ_iff] at hj'
rw [Nat.succ_eq_add_one, ← hF _ hj']
rintro _ ⟨m, hm, rfl⟩
apply Submodule.smul_induction_on hm
@@ -438,10 +438,10 @@ theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable :=
by
haveI := isNoetherian_of_fg_of_noetherian' h.1
- rw [← submodule_fg_iff_stable] at hF⊢
+ rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
- rw [isNoetherian_submodule] at this
+ rw [isNoetherian_submodule] at this
exact this _ (OrderHomClass.mono (submodule_inf_hom M I) hf)
#align ideal.filtration.stable.of_le Ideal.Filtration.Stable.of_le
@@ -484,7 +484,7 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Fin
· intro H; exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩
obtain ⟨k, hk⟩ := (I.stable_filtration_stable ⊤).inter_right (I.trivial_filtration N)
have := hk k (le_refl _)
- rw [hN, hN] at this
+ rw [hN, hN] at this
exact le_of_eq this.symm
· rintro ⟨r, eq⟩
rw [Submodule.mem_iInf]
@@ -524,7 +524,7 @@ theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h :
intro x hx
by_contra hx'
have := Ideal.mem_iInf_smul_pow_eq_bot_iff I x
- simp_rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one] at this
+ simp_rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one] at this
obtain ⟨r, hr⟩ := this.mp hx
have := mul_right_cancel₀ hx' (hr.trans (one_mul x).symm)
exact I.eq_top_iff_one.not.mp h (this ▸ r.prop)
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -51,6 +51,7 @@ open Polynomial
open scoped Polynomial BigOperators
+#print Ideal.Filtration /-
/-- An `I`-filtration on the module `M` is a sequence of decreasing submodules `N i` such that
`I • (N i) ≤ N (i + 1)`. Note that we do not require the filtration to start from `⊤`. -/
@[ext]
@@ -59,11 +60,13 @@ structure Ideal.Filtration (M : Type u) [AddCommGroup M] [Module R M] where
mono : ∀ i, N (i + 1) ≤ N i
smul_le : ∀ i, I • N i ≤ N (i + 1)
#align ideal.filtration Ideal.Filtration
+-/
variable (F F' : I.Filtration M) {I}
namespace Ideal.Filtration
+#print Ideal.Filtration.pow_smul_le /-
theorem pow_smul_le (i j : ℕ) : I ^ i • F.n j ≤ F.n (i + j) :=
by
induction i
@@ -71,15 +74,21 @@ theorem pow_smul_le (i j : ℕ) : I ^ i • F.n j ≤ F.n (i + j) :=
· rw [pow_succ, mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
exact (Submodule.smul_mono_right i_ih).trans (F.smul_le _)
#align ideal.filtration.pow_smul_le Ideal.Filtration.pow_smul_le
+-/
+#print Ideal.Filtration.pow_smul_le_pow_smul /-
theorem pow_smul_le_pow_smul (i j k : ℕ) : I ^ (i + k) • F.n j ≤ I ^ k • F.n (i + j) := by
rw [add_comm, pow_add, mul_smul]; exact Submodule.smul_mono_right (F.pow_smul_le i j)
#align ideal.filtration.pow_smul_le_pow_smul Ideal.Filtration.pow_smul_le_pow_smul
+-/
+#print Ideal.Filtration.antitone /-
protected theorem antitone : Antitone F.n :=
antitone_nat_of_succ_le F.mono
#align ideal.filtration.antitone Ideal.Filtration.antitone
+-/
+#print Ideal.trivialFiltration /-
/-- The trivial `I`-filtration of `N`. -/
@[simps]
def Ideal.trivialFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
@@ -88,6 +97,7 @@ def Ideal.trivialFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
mono i := le_of_eq rfl
smul_le i := Submodule.smul_le_right
#align ideal.trivial_filtration Ideal.trivialFiltration
+-/
/-- The `sup` of two `I.filtration`s is an `I.filtration`. -/
instance : Sup (I.Filtration M) :=
@@ -138,57 +148,62 @@ instance : Bot (I.Filtration M) :=
⟨I.trivialFiltration ⊥⟩
@[simp]
-theorem sup_n : (F ⊔ F').n = F.n ⊔ F'.n :=
+theorem sup_N : (F ⊔ F').n = F.n ⊔ F'.n :=
rfl
-#align ideal.filtration.sup_N Ideal.Filtration.sup_n
+#align ideal.filtration.sup_N Ideal.Filtration.sup_N
@[simp]
-theorem sSup_n (S : Set (I.Filtration M)) : (sSup S).n = sSup (Ideal.Filtration.n '' S) :=
+theorem sSup_N (S : Set (I.Filtration M)) : (sSup S).n = sSup (Ideal.Filtration.n '' S) :=
rfl
-#align ideal.filtration.Sup_N Ideal.Filtration.sSup_n
+#align ideal.filtration.Sup_N Ideal.Filtration.sSup_N
@[simp]
-theorem inf_n : (F ⊓ F').n = F.n ⊓ F'.n :=
+theorem inf_N : (F ⊓ F').n = F.n ⊓ F'.n :=
rfl
-#align ideal.filtration.inf_N Ideal.Filtration.inf_n
+#align ideal.filtration.inf_N Ideal.Filtration.inf_N
+#print Ideal.Filtration.sInf_N /-
@[simp]
-theorem sInf_n (S : Set (I.Filtration M)) : (sInf S).n = sInf (Ideal.Filtration.n '' S) :=
+theorem sInf_N (S : Set (I.Filtration M)) : (sInf S).n = sInf (Ideal.Filtration.n '' S) :=
rfl
-#align ideal.filtration.Inf_N Ideal.Filtration.sInf_n
+#align ideal.filtration.Inf_N Ideal.Filtration.sInf_N
+-/
@[simp]
-theorem top_n : (⊤ : I.Filtration M).n = ⊤ :=
+theorem top_N : (⊤ : I.Filtration M).n = ⊤ :=
rfl
-#align ideal.filtration.top_N Ideal.Filtration.top_n
+#align ideal.filtration.top_N Ideal.Filtration.top_N
@[simp]
-theorem bot_n : (⊥ : I.Filtration M).n = ⊥ :=
+theorem bot_N : (⊥ : I.Filtration M).n = ⊥ :=
rfl
-#align ideal.filtration.bot_N Ideal.Filtration.bot_n
+#align ideal.filtration.bot_N Ideal.Filtration.bot_N
@[simp]
-theorem iSup_n {ι : Sort _} (f : ι → I.Filtration M) : (iSup f).n = ⨆ i, (f i).n :=
+theorem iSup_N {ι : Sort _} (f : ι → I.Filtration M) : (iSup f).n = ⨆ i, (f i).n :=
congr_arg sSup (Set.range_comp _ _).symm
-#align ideal.filtration.supr_N Ideal.Filtration.iSup_n
+#align ideal.filtration.supr_N Ideal.Filtration.iSup_N
@[simp]
-theorem iInf_n {ι : Sort _} (f : ι → I.Filtration M) : (iInf f).n = ⨅ i, (f i).n :=
+theorem iInf_N {ι : Sort _} (f : ι → I.Filtration M) : (iInf f).n = ⨅ i, (f i).n :=
congr_arg sInf (Set.range_comp _ _).symm
-#align ideal.filtration.infi_N Ideal.Filtration.iInf_n
+#align ideal.filtration.infi_N Ideal.Filtration.iInf_N
instance : CompleteLattice (I.Filtration M) :=
- Function.Injective.completeLattice Ideal.Filtration.n Ideal.Filtration.ext sup_n inf_n
- (fun _ => sSup_image) (fun _ => sInf_image) top_n bot_n
+ Function.Injective.completeLattice Ideal.Filtration.n Ideal.Filtration.ext sup_N inf_N
+ (fun _ => sSup_image) (fun _ => sInf_image) top_N bot_N
instance : Inhabited (I.Filtration M) :=
⟨⊥⟩
+#print Ideal.Filtration.Stable /-
/-- An `I` filtration is stable if `I • F.N n = F.N (n+1)` for large enough `n`. -/
def Stable : Prop :=
∃ n₀, ∀ n ≥ n₀, I • F.n n = F.n (n + 1)
#align ideal.filtration.stable Ideal.Filtration.Stable
+-/
+#print Ideal.stableFiltration /-
/-- The trivial stable `I`-filtration of `N`. -/
@[simps]
def Ideal.stableFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
@@ -197,16 +212,20 @@ def Ideal.stableFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
mono i := by rw [add_comm, pow_add, mul_smul]; exact Submodule.smul_le_right
smul_le i := by rw [add_comm, pow_add, mul_smul, pow_one]; exact le_refl _
#align ideal.stable_filtration Ideal.stableFiltration
+-/
+#print Ideal.stableFiltration_stable /-
theorem Ideal.stableFiltration_stable (I : Ideal R) (N : Submodule R M) :
(I.stableFiltration N).Stable := by use 0; intro n _; dsimp;
rw [add_comm, pow_add, mul_smul, pow_one]
#align ideal.stable_filtration_stable Ideal.stableFiltration_stable
+-/
variable {F F'} (h : F.Stable)
include h
+#print Ideal.Filtration.Stable.exists_pow_smul_eq /-
theorem Stable.exists_pow_smul_eq : ∃ n₀, ∀ k, F.n (n₀ + k) = I ^ k • F.n n₀ :=
by
obtain ⟨n₀, hn⟩ := h
@@ -217,7 +236,9 @@ theorem Stable.exists_pow_smul_eq : ∃ n₀, ∀ k, F.n (n₀ + k) = I ^ k •
· rw [Nat.succ_eq_add_one, ← add_assoc, ← hn, k_ih, add_comm, pow_add, mul_smul, pow_one]
linarith
#align ideal.filtration.stable.exists_pow_smul_eq Ideal.Filtration.Stable.exists_pow_smul_eq
+-/
+#print Ideal.Filtration.Stable.exists_pow_smul_eq_of_ge /-
theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.n n = I ^ (n - n₀) • F.n n₀ :=
by
obtain ⟨n₀, hn₀⟩ := h.exists_pow_smul_eq
@@ -226,9 +247,11 @@ theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.n n = I ^
convert hn₀ (n - n₀)
rw [add_comm, tsub_add_cancel_of_le hn]
#align ideal.filtration.stable.exists_pow_smul_eq_of_ge Ideal.Filtration.Stable.exists_pow_smul_eq_of_ge
+-/
omit h
+#print Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge /-
theorem stable_iff_exists_pow_smul_eq_of_ge :
F.Stable ↔ ∃ n₀, ∀ n ≥ n₀, F.n n = I ^ (n - n₀) • F.n n₀ :=
by
@@ -236,7 +259,9 @@ theorem stable_iff_exists_pow_smul_eq_of_ge :
rw [h.some_spec n hn, h.some_spec (n + 1) (by linarith), smul_smul, ← pow_succ,
tsub_add_eq_add_tsub hn]
#align ideal.filtration.stable_iff_exists_pow_smul_eq_of_ge Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge
+-/
+#print Ideal.Filtration.Stable.exists_forall_le /-
theorem Stable.exists_forall_le (h : F.Stable) (e : F.n 0 ≤ F'.n 0) :
∃ n₀, ∀ n, F.n (n + n₀) ≤ F'.n n :=
by
@@ -249,7 +274,9 @@ theorem Stable.exists_forall_le (h : F.Stable) (e : F.n 0 ≤ F'.n 0) :
exact (Submodule.smul_mono_right hn).trans (F'.smul_le _)
simp
#align ideal.filtration.stable.exists_forall_le Ideal.Filtration.Stable.exists_forall_le
+-/
+#print Ideal.Filtration.Stable.bounded_difference /-
theorem Stable.bounded_difference (h : F.Stable) (h' : F'.Stable) (e : F.n 0 = F'.n 0) :
∃ n₀, ∀ n, F.n (n + n₀) ≤ F'.n n ∧ F'.n (n + n₀) ≤ F.n n :=
by
@@ -259,6 +286,7 @@ theorem Stable.bounded_difference (h : F.Stable) (h' : F'.Stable) (e : F.n 0 = F
intro n
refine' ⟨(F.antitone _).trans (h₁ n), (F'.antitone _).trans (h₂ n)⟩ <;> simp
#align ideal.filtration.stable.bounded_difference Ideal.Filtration.Stable.bounded_difference
+-/
open PolynomialModule
@@ -367,7 +395,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
its associated submodule of is finitely generated. -/
-theorem submodule_fG_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
+theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
classical
delta Ideal.Filtration.Stable
simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
@@ -402,7 +430,7 @@ theorem submodule_fG_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F
by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
rw [Subtype.coe_mk, ← this]
exact ⟨_, rfl⟩
-#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fG_iff_stable
+#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
variable {F}
@@ -417,25 +445,31 @@ theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable
exact this _ (OrderHomClass.mono (submodule_inf_hom M I) hf)
#align ideal.filtration.stable.of_le Ideal.Filtration.Stable.of_le
+#print Ideal.Filtration.Stable.inter_right /-
theorem Stable.inter_right [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable) :
(F ⊓ F').Stable :=
hF.of_le inf_le_left
#align ideal.filtration.stable.inter_right Ideal.Filtration.Stable.inter_right
+-/
+#print Ideal.Filtration.Stable.inter_left /-
theorem Stable.inter_left [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable) :
(F' ⊓ F).Stable :=
hF.of_le inf_le_right
#align ideal.filtration.stable.inter_left Ideal.Filtration.Stable.inter_left
+-/
end Ideal.Filtration
variable (I)
+#print Ideal.exists_pow_inf_eq_pow_smul /-
/-- **Artin-Rees lemma** -/
theorem Ideal.exists_pow_inf_eq_pow_smul [IsNoetherianRing R] [h : Module.Finite R M]
(N : Submodule R M) : ∃ k : ℕ, ∀ n ≥ k, I ^ n • ⊤ ⊓ N = I ^ (n - k) • (I ^ k • ⊤ ⊓ N) :=
((I.stableFiltration_stable ⊤).inter_right (I.trivialFiltration N)).exists_pow_smul_eq_of_ge
#align ideal.exists_pow_inf_eq_pow_smul Ideal.exists_pow_inf_eq_pow_smul
+-/
theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Finite R M] (x : M) :
x ∈ (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) ↔ ∃ r : I, (r : R) • x = x :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -49,7 +49,7 @@ variable {R M : Type u} [CommRing R] [AddCommGroup M] [Module R M] (I : Ideal R)
open Polynomial
-open Polynomial BigOperators
+open scoped Polynomial BigOperators
/-- An `I`-filtration on the module `M` is a sequence of decreasing submodules `N i` such that
`I • (N i) ≤ N (i + 1)`. Note that we do not require the filtration to start from `⊤`. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -72,10 +72,8 @@ theorem pow_smul_le (i j : ℕ) : I ^ i • F.n j ≤ F.n (i + j) :=
exact (Submodule.smul_mono_right i_ih).trans (F.smul_le _)
#align ideal.filtration.pow_smul_le Ideal.Filtration.pow_smul_le
-theorem pow_smul_le_pow_smul (i j k : ℕ) : I ^ (i + k) • F.n j ≤ I ^ k • F.n (i + j) :=
- by
- rw [add_comm, pow_add, mul_smul]
- exact Submodule.smul_mono_right (F.pow_smul_le i j)
+theorem pow_smul_le_pow_smul (i j k : ℕ) : I ^ (i + k) • F.n j ≤ I ^ k • F.n (i + j) := by
+ rw [add_comm, pow_add, mul_smul]; exact Submodule.smul_mono_right (F.pow_smul_le i j)
#align ideal.filtration.pow_smul_le_pow_smul Ideal.Filtration.pow_smul_le_pow_smul
protected theorem antitone : Antitone F.n :=
@@ -196,19 +194,12 @@ def Stable : Prop :=
def Ideal.stableFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
where
n i := I ^ i • N
- mono i := by
- rw [add_comm, pow_add, mul_smul]
- exact Submodule.smul_le_right
- smul_le i := by
- rw [add_comm, pow_add, mul_smul, pow_one]
- exact le_refl _
+ mono i := by rw [add_comm, pow_add, mul_smul]; exact Submodule.smul_le_right
+ smul_le i := by rw [add_comm, pow_add, mul_smul, pow_one]; exact le_refl _
#align ideal.stable_filtration Ideal.stableFiltration
theorem Ideal.stableFiltration_stable (I : Ideal R) (N : Submodule R M) :
- (I.stableFiltration N).Stable := by
- use 0
- intro n _
- dsimp
+ (I.stableFiltration N).Stable := by use 0; intro n _; dsimp;
rw [add_comm, pow_add, mul_smul, pow_one]
#align ideal.stable_filtration_stable Ideal.stableFiltration_stable
@@ -253,8 +244,7 @@ theorem Stable.exists_forall_le (h : F.Stable) (e : F.n 0 ≤ F'.n 0) :
use n₀
intro n
induction' n with n hn
- · refine' (F.antitone _).trans e
- simp
+ · refine' (F.antitone _).trans e; simp
· rw [Nat.succ_eq_one_add, add_assoc, add_comm, add_comm 1 n, ← hF]
exact (Submodule.smul_mono_right hn).trans (F'.smul_le _)
simp
@@ -294,10 +284,7 @@ theorem mem_submodule (f : PolynomialModule R M) : f ∈ F.Submodule ↔ ∀ i,
Iff.rfl
#align ideal.filtration.mem_submodule Ideal.Filtration.mem_submodule
-theorem inf_submodule : (F ⊓ F').Submodule = F.Submodule ⊓ F'.Submodule :=
- by
- ext
- exact forall_and
+theorem inf_submodule : (F ⊓ F').Submodule = F.Submodule ⊓ F'.Submodule := by ext; exact forall_and
#align ideal.filtration.inf_submodule Ideal.Filtration.inf_submodule
variable (I M)
@@ -375,9 +362,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
exact
F'.smul_mem ⟨_, rees_algebra.monomial_mem.mpr (by rwa [pow_one])⟩
(hj <| Set.mem_image_of_mem _ hm')
- · intro x y hx hy
- rw [map_add]
- exact F'.add_mem hx hy
+ · intro x y hx hy; rw [map_add]; exact F'.add_mem hx hy
#align ideal.filtration.submodule_eq_span_le_iff_stable_ge Ideal.Filtration.submodule_eq_span_le_iff_stable_ge
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
@@ -397,10 +382,8 @@ theorem submodule_fG_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F
ext
simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
constructor
- · rintro ⟨-, i, -, e⟩
- exact ⟨i, e⟩
- · rintro ⟨i, e⟩
- exact ⟨i, i, le_refl i, e⟩
+ · rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
+ · rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
· intro n m e
rw [Submodule.span_le, Set.iUnion₂_subset_iff]
intro i hi
@@ -416,9 +399,7 @@ theorem submodule_fG_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F
have :
Submodule.span (reesAlgebra I) (s.image (lsingle R i) : Set (PolynomialModule R M)) =
Submodule.span _ (single R i '' (F.N i : Set M)) :=
- by
- rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]
- rfl
+ by rw [Finset.coe_image, ← Submodule.span_span_of_tower R, ← Submodule.map_span, hs]; rfl
rw [Subtype.coe_mk, ← this]
exact ⟨_, rfl⟩
#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fG_iff_stable
@@ -460,16 +441,13 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Fin
x ∈ (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) ↔ ∃ r : I, (r : R) • x = x :=
by
let N := (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M)
- have hN : ∀ k, (I.stable_filtration ⊤ ⊓ I.trivial_filtration N).n k = N :=
- by
- intro k
+ have hN : ∀ k, (I.stable_filtration ⊤ ⊓ I.trivial_filtration N).n k = N := by intro k;
exact inf_eq_right.mpr ((iInf_le _ k).trans <| le_of_eq <| by simp)
constructor
· haveI := isNoetherian_of_fg_of_noetherian' hM.out
obtain ⟨r, hr₁, hr₂⟩ :=
Submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul I N (IsNoetherian.noetherian N) _
- · intro H
- exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩
+ · intro H; exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩
obtain ⟨k, hk⟩ := (I.stable_filtration_stable ⊤).inter_right (I.trivial_filtration N)
have := hk k (le_refl _)
rw [hN, hN] at this
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -382,7 +382,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
/-- If the components of a filtration are finitely generated, then the filtration is stable iff
its associated submodule of is finitely generated. -/
-theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).Fg) : F.Submodule.Fg ↔ F.Stable := by
+theorem submodule_fG_iff_stable (hF' : ∀ i, (F.n i).FG) : F.Submodule.FG ↔ F.Stable := by
classical
delta Ideal.Filtration.Stable
simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
@@ -421,7 +421,7 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).Fg) : F.Submodule.Fg ↔ F
rfl
rw [Subtype.coe_mk, ← this]
exact ⟨_, rfl⟩
-#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fg_iff_stable
+#align ideal.filtration.submodule_fg_iff_stable Ideal.Filtration.submodule_fG_iff_stable
variable {F}
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -100,15 +100,15 @@ instance : Sup (I.Filtration M) :=
/-- The `Sup` of a family of `I.filtration`s is an `I.filtration`. -/
instance : SupSet (I.Filtration M) :=
⟨fun S =>
- { n := supₛ (Ideal.Filtration.n '' S)
+ { n := sSup (Ideal.Filtration.n '' S)
mono := fun i => by
- apply supₛ_le_supₛ_of_forall_exists_le _
+ apply sSup_le_sSup_of_forall_exists_le _
rintro _ ⟨⟨_, F, hF, rfl⟩, rfl⟩
exact ⟨_, ⟨⟨_, F, hF, rfl⟩, rfl⟩, F.mono i⟩
smul_le := fun i =>
by
- rw [supₛ_eq_supᵢ', supᵢ_apply, Submodule.smul_supᵢ, supᵢ_apply]
- apply supᵢ_mono _
+ rw [sSup_eq_iSup', iSup_apply, Submodule.smul_iSup, iSup_apply]
+ apply iSup_mono _
rintro ⟨_, F, hF, rfl⟩
exact F.smul_le i }⟩
@@ -121,15 +121,15 @@ instance : Inf (I.Filtration M) :=
/-- The `Inf` of a family of `I.filtration`s is an `I.filtration`. -/
instance : InfSet (I.Filtration M) :=
⟨fun S =>
- { n := infₛ (Ideal.Filtration.n '' S)
+ { n := sInf (Ideal.Filtration.n '' S)
mono := fun i => by
- apply infₛ_le_infₛ_of_forall_exists_le _
+ apply sInf_le_sInf_of_forall_exists_le _
rintro _ ⟨⟨_, F, hF, rfl⟩, rfl⟩
exact ⟨_, ⟨⟨_, F, hF, rfl⟩, rfl⟩, F.mono i⟩
smul_le := fun i => by
- rw [infₛ_eq_infᵢ', infᵢ_apply, infᵢ_apply]
+ rw [sInf_eq_iInf', iInf_apply, iInf_apply]
refine' submodule.smul_infi_le.trans _
- apply infᵢ_mono _
+ apply iInf_mono _
rintro ⟨_, F, hF, rfl⟩
exact F.smul_le i }⟩
@@ -145,9 +145,9 @@ theorem sup_n : (F ⊔ F').n = F.n ⊔ F'.n :=
#align ideal.filtration.sup_N Ideal.Filtration.sup_n
@[simp]
-theorem supₛ_n (S : Set (I.Filtration M)) : (supₛ S).n = supₛ (Ideal.Filtration.n '' S) :=
+theorem sSup_n (S : Set (I.Filtration M)) : (sSup S).n = sSup (Ideal.Filtration.n '' S) :=
rfl
-#align ideal.filtration.Sup_N Ideal.Filtration.supₛ_n
+#align ideal.filtration.Sup_N Ideal.Filtration.sSup_n
@[simp]
theorem inf_n : (F ⊓ F').n = F.n ⊓ F'.n :=
@@ -155,9 +155,9 @@ theorem inf_n : (F ⊓ F').n = F.n ⊓ F'.n :=
#align ideal.filtration.inf_N Ideal.Filtration.inf_n
@[simp]
-theorem infₛ_n (S : Set (I.Filtration M)) : (infₛ S).n = infₛ (Ideal.Filtration.n '' S) :=
+theorem sInf_n (S : Set (I.Filtration M)) : (sInf S).n = sInf (Ideal.Filtration.n '' S) :=
rfl
-#align ideal.filtration.Inf_N Ideal.Filtration.infₛ_n
+#align ideal.filtration.Inf_N Ideal.Filtration.sInf_n
@[simp]
theorem top_n : (⊤ : I.Filtration M).n = ⊤ :=
@@ -170,18 +170,18 @@ theorem bot_n : (⊥ : I.Filtration M).n = ⊥ :=
#align ideal.filtration.bot_N Ideal.Filtration.bot_n
@[simp]
-theorem supᵢ_n {ι : Sort _} (f : ι → I.Filtration M) : (supᵢ f).n = ⨆ i, (f i).n :=
- congr_arg supₛ (Set.range_comp _ _).symm
-#align ideal.filtration.supr_N Ideal.Filtration.supᵢ_n
+theorem iSup_n {ι : Sort _} (f : ι → I.Filtration M) : (iSup f).n = ⨆ i, (f i).n :=
+ congr_arg sSup (Set.range_comp _ _).symm
+#align ideal.filtration.supr_N Ideal.Filtration.iSup_n
@[simp]
-theorem infᵢ_n {ι : Sort _} (f : ι → I.Filtration M) : (infᵢ f).n = ⨅ i, (f i).n :=
- congr_arg infₛ (Set.range_comp _ _).symm
-#align ideal.filtration.infi_N Ideal.Filtration.infᵢ_n
+theorem iInf_n {ι : Sort _} (f : ι → I.Filtration M) : (iInf f).n = ⨅ i, (f i).n :=
+ congr_arg sInf (Set.range_comp _ _).symm
+#align ideal.filtration.infi_N Ideal.Filtration.iInf_n
instance : CompleteLattice (I.Filtration M) :=
Function.Injective.completeLattice Ideal.Filtration.n Ideal.Filtration.ext sup_n inf_n
- (fun _ => supₛ_image) (fun _ => infₛ_image) top_n bot_n
+ (fun _ => sSup_image) (fun _ => sInf_image) top_n bot_n
instance : Inhabited (I.Filtration M) :=
⟨⊥⟩
@@ -315,7 +315,7 @@ theorem submodule_closure_single :
AddSubmonoid.closure (⋃ i, single R i '' (F.n i : Set M)) = F.Submodule.toAddSubmonoid :=
by
apply le_antisymm
- · rw [AddSubmonoid.closure_le, Set.unionᵢ_subset_iff]
+ · rw [AddSubmonoid.closure_le, Set.iUnion_subset_iff]
rintro i _ ⟨m, hm, rfl⟩ j
rw [single_apply]
split_ifs
@@ -325,7 +325,7 @@ theorem submodule_closure_single :
rw [← f.sum_single]
apply AddSubmonoid.sum_mem _ _
rintro c -
- exact AddSubmonoid.subset_closure (Set.subset_unionᵢ _ c <| Set.mem_image_of_mem _ (hf c))
+ exact AddSubmonoid.subset_closure (Set.subset_iUnion _ c <| Set.mem_image_of_mem _ (hf c))
#align ideal.filtration.submodule_closure_single Ideal.Filtration.submodule_closure_single
theorem submodule_span_single :
@@ -339,8 +339,8 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
F.Submodule = Submodule.span _ (⋃ i ≤ n₀, single R i '' (F.n i : Set M)) ↔
∀ n ≥ n₀, I • F.n n = F.n (n + 1) :=
by
- rw [← submodule_span_single, ← LE.le.le_iff_eq, Submodule.span_le, Set.unionᵢ_subset_iff]
- swap; · exact Submodule.span_mono (Set.unionᵢ₂_subset_unionᵢ _ _)
+ rw [← submodule_span_single, ← LE.le.le_iff_eq, Submodule.span_le, Set.iUnion_subset_iff]
+ swap; · exact Submodule.span_mono (Set.iUnion₂_subset_iUnion _ _)
constructor
· intro H n hn
refine' (F.smul_le n).antisymm _
@@ -361,7 +361,7 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
· let F' := Submodule.span (reesAlgebra I) (⋃ i ≤ n₀, single R i '' (F.N i : Set M))
intro hF i
have : ∀ i ≤ n₀, single R i '' (F.N i : Set M) ⊆ F' := fun i hi =>
- Set.Subset.trans (Set.subset_unionᵢ₂ i hi) Submodule.subset_span
+ Set.Subset.trans (Set.subset_iUnion₂ i hi) Submodule.subset_span
induction' i with j hj
· exact this _ (zero_le _)
by_cases hj' : j.succ ≤ n₀
@@ -392,25 +392,25 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.n i).Fg) : F.Submodule.Fg ↔ F
H.stablizes_of_supr_eq
⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
· dsimp
- rw [← Submodule.span_unionᵢ, ← submodule_span_single]
+ rw [← Submodule.span_iUnion, ← submodule_span_single]
congr 1
ext
- simp only [Set.mem_unionᵢ, Set.mem_image, SetLike.mem_coe, exists_prop]
+ simp only [Set.mem_iUnion, Set.mem_image, SetLike.mem_coe, exists_prop]
constructor
· rintro ⟨-, i, -, e⟩
exact ⟨i, e⟩
· rintro ⟨i, e⟩
exact ⟨i, i, le_refl i, e⟩
· intro n m e
- rw [Submodule.span_le, Set.unionᵢ₂_subset_iff]
+ rw [Submodule.span_le, Set.iUnion₂_subset_iff]
intro i hi
refine'
- (Set.Subset.trans _ (Set.subset_unionᵢ₂ i (hi.trans e : _))).trans Submodule.subset_span
+ (Set.Subset.trans _ (Set.subset_iUnion₂ i (hi.trans e : _))).trans Submodule.subset_span
rfl
· rintro ⟨n, hn⟩
rw [hn]
- simp_rw [Submodule.span_unionᵢ₂, ← Finset.mem_range_succ_iff, supᵢ_subtype']
- apply Submodule.fg_supᵢ
+ simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
+ apply Submodule.fg_iSup
rintro ⟨i, hi⟩
obtain ⟨s, hs⟩ := hF' i
have :
@@ -456,14 +456,14 @@ theorem Ideal.exists_pow_inf_eq_pow_smul [IsNoetherianRing R] [h : Module.Finite
((I.stableFiltration_stable ⊤).inter_right (I.trivialFiltration N)).exists_pow_smul_eq_of_ge
#align ideal.exists_pow_inf_eq_pow_smul Ideal.exists_pow_inf_eq_pow_smul
-theorem Ideal.mem_infᵢ_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Finite R M] (x : M) :
+theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Finite R M] (x : M) :
x ∈ (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) ↔ ∃ r : I, (r : R) • x = x :=
by
let N := (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M)
have hN : ∀ k, (I.stable_filtration ⊤ ⊓ I.trivial_filtration N).n k = N :=
by
intro k
- exact inf_eq_right.mpr ((infᵢ_le _ k).trans <| le_of_eq <| by simp)
+ exact inf_eq_right.mpr ((iInf_le _ k).trans <| le_of_eq <| by simp)
constructor
· haveI := isNoetherian_of_fg_of_noetherian' hM.out
obtain ⟨r, hr₁, hr₂⟩ :=
@@ -475,15 +475,15 @@ theorem Ideal.mem_infᵢ_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.F
rw [hN, hN] at this
exact le_of_eq this.symm
· rintro ⟨r, eq⟩
- rw [Submodule.mem_infᵢ]
+ rw [Submodule.mem_iInf]
intro i
induction' i with i hi
· simp
· rw [Nat.succ_eq_one_add, pow_add, ← smul_smul, pow_one, ← Eq]
exact Submodule.smul_mem_smul r.prop hi
-#align ideal.mem_infi_smul_pow_eq_bot_iff Ideal.mem_infᵢ_smul_pow_eq_bot_iff
+#align ideal.mem_infi_smul_pow_eq_bot_iff Ideal.mem_iInf_smul_pow_eq_bot_iff
-theorem Ideal.infᵢ_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R]
+theorem Ideal.iInf_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R]
[Module.Finite R M] (h : I ≠ ⊤) : (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) = ⊥ :=
by
rw [eq_bot_iff]
@@ -493,28 +493,28 @@ theorem Ideal.infᵢ_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRin
apply this.smul_left_cancel.mp
swap; · infer_instance
simp [sub_smul, hr]
-#align ideal.infi_pow_smul_eq_bot_of_local_ring Ideal.infᵢ_pow_smul_eq_bot_of_localRing
+#align ideal.infi_pow_smul_eq_bot_of_local_ring Ideal.iInf_pow_smul_eq_bot_of_localRing
/-- **Krull's intersection theorem** for noetherian local rings. -/
-theorem Ideal.infᵢ_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h : I ≠ ⊤) :
+theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h : I ≠ ⊤) :
(⨅ i : ℕ, I ^ i) = ⊥ :=
by
convert I.infi_pow_smul_eq_bot_of_local_ring h
ext i
rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one]
infer_instance
-#align ideal.infi_pow_eq_bot_of_local_ring Ideal.infᵢ_pow_eq_bot_of_localRing
+#align ideal.infi_pow_eq_bot_of_local_ring Ideal.iInf_pow_eq_bot_of_localRing
/-- **Krull's intersection theorem** for noetherian domains. -/
-theorem Ideal.infᵢ_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h : I ≠ ⊤) :
+theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h : I ≠ ⊤) :
(⨅ i : ℕ, I ^ i) = ⊥ := by
rw [eq_bot_iff]
intro x hx
by_contra hx'
- have := Ideal.mem_infᵢ_smul_pow_eq_bot_iff I x
+ have := Ideal.mem_iInf_smul_pow_eq_bot_iff I x
simp_rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one] at this
obtain ⟨r, hr⟩ := this.mp hx
have := mul_right_cancel₀ hx' (hr.trans (one_mul x).symm)
exact I.eq_top_iff_one.not.mp h (this ▸ r.prop)
-#align ideal.infi_pow_eq_bot_of_is_domain Ideal.infᵢ_pow_eq_bot_of_isDomain
+#align ideal.infi_pow_eq_bot_of_is_domain Ideal.iInf_pow_eq_bot_of_isDomain
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -92,7 +92,7 @@ def Ideal.trivialFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M
#align ideal.trivial_filtration Ideal.trivialFiltration
/-- The `sup` of two `I.filtration`s is an `I.filtration`. -/
-instance : HasSup (I.Filtration M) :=
+instance : Sup (I.Filtration M) :=
⟨fun F F' =>
⟨F.n ⊔ F'.n, fun i => sup_le_sup (F.mono i) (F'.mono i), fun i =>
(le_of_eq (Submodule.smul_sup _ _ _)).trans <| sup_le_sup (F.smul_le i) (F'.smul_le i)⟩⟩
@@ -113,7 +113,7 @@ instance : SupSet (I.Filtration M) :=
exact F.smul_le i }⟩
/-- The `inf` of two `I.filtration`s is an `I.filtration`. -/
-instance : HasInf (I.Filtration M) :=
+instance : Inf (I.Filtration M) :=
⟨fun F F' =>
⟨F.n ⊓ F'.n, fun i => inf_le_inf (F.mono i) (F'.mono i), fun i =>
(Submodule.smul_inf_le _ _ _).trans <| inf_le_inf (F.smul_le i) (F'.smul_le i)⟩⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -22,8 +22,9 @@ This file contains the definitions and basic results around (stable) `I`-filtrat
## Main results
-- `Ideal.Filtration`: An `I`-filtration on the module `M` is a sequence of decreasing submodules
- `N i` such that `I • N ≤ I (i + 1)`. Note that we do not require the filtration to start from `⊤`.
+- `Ideal.Filtration`:
+ An `I`-filtration on the module `M` is a sequence of decreasing submodules `N i` such that
+ `∀ i, I • (N i) ≤ N (i + 1)`. Note that we do not require the filtration to start from `⊤`.
- `Ideal.Filtration.Stable`: An `I`-filtration is stable if `I • (N i) = N (i + 1)` for large
enough `i`.
- `Ideal.Filtration.submodule`: The associated module `⨁ Nᵢ` of a filtration, implemented as a
Data
(#11751)
Polynomial
and MvPolynomial
are algebraic objects, hence should be under Algebra
(or at least not under Data
)
@@ -3,12 +3,12 @@ Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-/
+import Mathlib.Algebra.Polynomial.Module.Basic
import Mathlib.Algebra.Ring.Idempotents
import Mathlib.RingTheory.Ideal.LocalRing
import Mathlib.RingTheory.Noetherian
import Mathlib.RingTheory.ReesAlgebra
import Mathlib.RingTheory.Finiteness
-import Mathlib.Data.Polynomial.Module.Basic
import Mathlib.Order.Basic
import Mathlib.Order.Hom.Lattice
Everywhere we have a smul_mem_pointwise_smul
lemma, I've added this result.
@@ -67,12 +67,12 @@ theorem pow_smul_le (i j : ℕ) : I ^ i • F.N j ≤ F.N (i + j) := by
induction' i with _ ih
· simp
· rw [pow_succ', mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
- exact (Submodule.smul_mono_right ih).trans (F.smul_le _)
+ exact (smul_mono_right _ ih).trans (F.smul_le _)
#align ideal.filtration.pow_smul_le Ideal.Filtration.pow_smul_le
theorem pow_smul_le_pow_smul (i j k : ℕ) : I ^ (i + k) • F.N j ≤ I ^ k • F.N (i + j) := by
rw [add_comm, pow_add, mul_smul]
- exact Submodule.smul_mono_right (F.pow_smul_le i j)
+ exact smul_mono_right _ (F.pow_smul_le i j)
#align ideal.filtration.pow_smul_le_pow_smul Ideal.Filtration.pow_smul_le_pow_smul
protected theorem antitone : Antitone F.N :=
@@ -111,7 +111,7 @@ instance : SupSet (I.Filtration M) :=
instance : Inf (I.Filtration M) :=
⟨fun F F' =>
⟨F.N ⊓ F'.N, fun i => inf_le_inf (F.mono i) (F'.mono i), fun i =>
- (Submodule.smul_inf_le _ _ _).trans <| inf_le_inf (F.smul_le i) (F'.smul_le i)⟩⟩
+ (smul_inf_le _ _ _).trans <| inf_le_inf (F.smul_le i) (F'.smul_le i)⟩⟩
/-- The `sInf` of a family of `I.Filtration`s is an `I.Filtration`. -/
instance : InfSet (I.Filtration M) :=
@@ -123,7 +123,7 @@ instance : InfSet (I.Filtration M) :=
exact ⟨_, ⟨⟨_, F, hF, rfl⟩, rfl⟩, F.mono i⟩
smul_le := fun i => by
rw [sInf_eq_iInf', iInf_apply, iInf_apply]
- refine' Submodule.smul_iInf_le.trans _
+ refine' smul_iInf_le.trans _
apply iInf_mono _
rintro ⟨_, F, hF, rfl⟩
exact F.smul_le i }⟩
@@ -245,7 +245,7 @@ theorem Stable.exists_forall_le (h : F.Stable) (e : F.N 0 ≤ F'.N 0) :
induction' n with n hn
· refine' (F.antitone _).trans e; simp
· rw [Nat.succ_eq_one_add, add_assoc, add_comm, add_comm 1 n, ← hF]
- exact (Submodule.smul_mono_right hn).trans (F'.smul_le _)
+ exact (smul_mono_right _ hn).trans (F'.smul_le _)
simp
#align ideal.filtration.stable.exists_forall_le Ideal.Filtration.Stable.exists_forall_le
We change the following field in the definition of an additive commutative monoid:
nsmul_succ : ∀ (n : ℕ) (x : G),
- AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+ AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x
where the latter is more natural
We adjust the definitions of ^
in monoids, groups, etc.
Originally there was a warning comment about why this natural order was preferred
use
x * npowRec n x
and notnpowRec n x * x
in the definition to make sure that definitional unfolding ofnpowRec
is blocked, to avoid deep recursion issues.
but it seems to no longer apply.
Remarks on the PR :
pow_succ
and pow_succ'
have switched their meanings.Ideal.IsPrime.mul_mem_pow
which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul
.@@ -66,7 +66,7 @@ namespace Ideal.Filtration
theorem pow_smul_le (i j : ℕ) : I ^ i • F.N j ≤ F.N (i + j) := by
induction' i with _ ih
· simp
- · rw [pow_succ, mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
+ · rw [pow_succ', mul_smul, Nat.succ_eq_add_one, add_assoc, add_comm 1, ← add_assoc]
exact (Submodule.smul_mono_right ih).trans (F.smul_le _)
#align ideal.filtration.pow_smul_le Ideal.Filtration.pow_smul_le
@@ -233,7 +233,7 @@ theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.N n = I ^
theorem stable_iff_exists_pow_smul_eq_of_ge :
F.Stable ↔ ∃ n₀, ∀ n ≥ n₀, F.N n = I ^ (n - n₀) • F.N n₀ := by
refine' ⟨Stable.exists_pow_smul_eq_of_ge, fun h => ⟨h.choose, fun n hn => _⟩⟩
- rw [h.choose_spec n hn, h.choose_spec (n + 1) (by omega), smul_smul, ← pow_succ,
+ rw [h.choose_spec n hn, h.choose_spec (n + 1) (by omega), smul_smul, ← pow_succ',
tsub_add_eq_add_tsub hn]
#align ideal.filtration.stable_iff_exists_pow_smul_eq_of_ge Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge
I ran tryAtEachStep on all files under Mathlib
to find all locations where omega
succeeds. For each that was a linarith
without an only
, I tried replacing it with omega
, and I verified that elaboration time got smaller. (In almost all cases, there was a noticeable speedup.) I also replaced some slow aesop
s along the way.
@@ -219,7 +219,7 @@ theorem Stable.exists_pow_smul_eq : ∃ n₀, ∀ k, F.N (n₀ + k) = I ^ k •
induction' k with _ ih
· simp
· rw [Nat.succ_eq_add_one, ← add_assoc, ← hn, ih, add_comm, pow_add, mul_smul, pow_one]
- linarith
+ omega
#align ideal.filtration.stable.exists_pow_smul_eq Ideal.Filtration.Stable.exists_pow_smul_eq
theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.N n = I ^ (n - n₀) • F.N n₀ := by
@@ -233,7 +233,7 @@ theorem Stable.exists_pow_smul_eq_of_ge : ∃ n₀, ∀ n ≥ n₀, F.N n = I ^
theorem stable_iff_exists_pow_smul_eq_of_ge :
F.Stable ↔ ∃ n₀, ∀ n ≥ n₀, F.N n = I ^ (n - n₀) • F.N n₀ := by
refine' ⟨Stable.exists_pow_smul_eq_of_ge, fun h => ⟨h.choose, fun n hn => _⟩⟩
- rw [h.choose_spec n hn, h.choose_spec (n + 1) (by linarith), smul_smul, ← pow_succ,
+ rw [h.choose_spec n hn, h.choose_spec (n + 1) (by omega), smul_smul, ← pow_succ,
tsub_add_eq_add_tsub hn]
#align ideal.filtration.stable_iff_exists_pow_smul_eq_of_ge Ideal.Filtration.stable_iff_exists_pow_smul_eq_of_ge
@@ -336,8 +336,8 @@ theorem submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
apply Submodule.sum_mem _ _
rintro ⟨_, _, ⟨n', rfl⟩, _, ⟨hn', rfl⟩, m, hm, rfl⟩ -
dsimp only [Subtype.coe_mk]
- rw [Subalgebra.smul_def, smul_single_apply, if_pos (show n' ≤ n + 1 by linarith)]
- have e : n' ≤ n := by linarith
+ rw [Subalgebra.smul_def, smul_single_apply, if_pos (show n' ≤ n + 1 by omega)]
+ have e : n' ≤ n := by omega
have := F.pow_smul_le_pow_smul (n - n') n' 1
rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1, ← add_tsub_assoc_of_le e, add_comm] at this
exact this (Submodule.smul_mem_smul ((l _).2 <| n + 1 - n') hm)
@@ -373,7 +373,7 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.N i).FG) : F.submodule.FG ↔ F
simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
constructor
· rintro H
- refine H.stablizes_of_iSup_eq
+ refine H.stabilizes_of_iSup_eq
⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (_ : i ≤ n₀), single R i '' ↑(F.N i)), ?_⟩ ?_
· intro n m e
rw [Submodule.span_le, Set.iUnion₂_subset_iff]
@@ -83,7 +83,7 @@ protected theorem antitone : Antitone F.N :=
@[simps]
def _root_.Ideal.trivialFiltration (I : Ideal R) (N : Submodule R M) : I.Filtration M where
N _ := N
- mono _ := le_of_eq rfl
+ mono _ := le_rfl
smul_le _ := Submodule.smul_le_right
#align ideal.trivial_filtration Ideal.trivialFiltration
@@ -91,7 +91,7 @@ def _root_.Ideal.trivialFiltration (I : Ideal R) (N : Submodule R M) : I.Filtrat
instance : Sup (I.Filtration M) :=
⟨fun F F' =>
⟨F.N ⊔ F'.N, fun i => sup_le_sup (F.mono i) (F'.mono i), fun i =>
- (le_of_eq (Submodule.smul_sup _ _ _)).trans <| sup_le_sup (F.smul_le i) (F'.smul_le i)⟩⟩
+ (Submodule.smul_sup _ _ _).trans_le <| sup_le_sup (F.smul_le i) (F'.smul_le i)⟩⟩
/-- The `sSup` of a family of `I.Filtration`s is an `I.Filtration`. -/
instance : SupSet (I.Filtration M) :=
The main result is Module.End.isSemisimple_of_squarefree_aeval_eq_zero
@@ -8,7 +8,7 @@ import Mathlib.RingTheory.Ideal.LocalRing
import Mathlib.RingTheory.Noetherian
import Mathlib.RingTheory.ReesAlgebra
import Mathlib.RingTheory.Finiteness
-import Mathlib.Data.Polynomial.Module
+import Mathlib.Data.Polynomial.Module.Basic
import Mathlib.Order.Basic
import Mathlib.Order.Hom.Lattice
@@ -9,6 +9,7 @@ import Mathlib.RingTheory.Noetherian
import Mathlib.RingTheory.ReesAlgebra
import Mathlib.RingTheory.Finiteness
import Mathlib.Data.Polynomial.Module
+import Mathlib.Order.Basic
import Mathlib.Order.Hom.Lattice
#align_import ring_theory.filtration from "leanprover-community/mathlib"@"70fd9563a21e7b963887c9360bd29b2393e6225a"
@@ -3,6 +3,7 @@ Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-/
+import Mathlib.Algebra.Ring.Idempotents
import Mathlib.RingTheory.Ideal.LocalRing
import Mathlib.RingTheory.Noetherian
import Mathlib.RingTheory.ReesAlgebra
@@ -472,6 +472,19 @@ theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h
rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one]
#align ideal.infi_pow_eq_bot_of_local_ring Ideal.iInf_pow_eq_bot_of_localRing
+/-- Also see `Ideal.isIdempotentElem_iff_eq_bot_or_top` for integral domains. -/
+theorem Ideal.isIdempotentElem_iff_eq_bot_or_top_of_localRing {R} [CommRing R]
+ [IsNoetherianRing R] [LocalRing R] (I : Ideal R) :
+ IsIdempotentElem I ↔ I = ⊥ ∨ I = ⊤ := by
+ constructor
+ · intro H
+ by_cases I = ⊤; · exact Or.inr ‹_›
+ refine Or.inl (eq_bot_iff.mpr ?_)
+ rw [← Ideal.iInf_pow_eq_bot_of_localRing I ‹_›]
+ apply le_iInf
+ rintro (_|n) <;> simp [H.pow_succ_eq]
+ · rintro (rfl | rfl) <;> simp [IsIdempotentElem]
+
/-- **Krull's intersection theorem** for noetherian domains. -/
theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h : I ≠ ⊤) :
⨅ i : ℕ, I ^ i = ⊥ := by
Make isNoetherian_of_isNoetherianRing_of_finite an instance
: this was impossible in Lean 3 because of a loop.
@@ -404,7 +404,6 @@ variable {F}
theorem Stable.of_le [IsNoetherianRing R] [Module.Finite R M] (hF : F.Stable)
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable := by
- have := isNoetherian_of_isNoetherianRing_of_finite R M
rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
@@ -438,8 +437,7 @@ theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [Module.Finite R
have hN : ∀ k, (I.stableFiltration ⊤ ⊓ I.trivialFiltration N).N k = N :=
fun k => inf_eq_right.mpr ((iInf_le _ k).trans <| le_of_eq <| by simp)
constructor
- · have := isNoetherian_of_isNoetherianRing_of_finite R M
- obtain ⟨r, hr₁, hr₂⟩ :=
+ · obtain ⟨r, hr₁, hr₂⟩ :=
Submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul I N (IsNoetherian.noetherian N) (by
obtain ⟨k, hk⟩ := (I.stableFiltration_stable ⊤).inter_right (I.trivialFiltration N)
have := hk k (le_refl _)
Finset.Nat.antidiagonal
(#7486)
We define a type class Finset.HasAntidiagonal A
which contains a function
antidiagonal : A → Finset (A × A)
such that antidiagonal n
is the Finset of all pairs adding to n
, as witnessed by mem_antidiagonal
.
When A
is a canonically ordered add monoid with locally finite order
this typeclass can be instantiated with Finset.antidiagonalOfLocallyFinite
.
This applies in particular when A
is ℕ
, more generally or σ →₀ ℕ
,
or even ι →₀ A
under the additional assumption OrderedSub A
that make it a canonically ordered add monoid.
(In fact, we would just need an AddMonoid
with a compatible order,
finite Iic
, such that if a + b = n
, then a, b ≤ n
,
and any finiteness condition would be OK.)
For computational reasons it is better to manually provide instances for ℕ
and σ →₀ ℕ
, to avoid quadratic runtime performance.
These instances are provided as Finset.Nat.instHasAntidiagonal
and Finsupp.instHasAntidiagonal
.
This is why Finset.antidiagonalOfLocallyFinite
is an abbrev
and not an instance
.
This definition does not exactly match with that of Multiset.antidiagonal
defined in Mathlib.Data.Multiset.Antidiagonal
, because of the multiplicities.
Indeed, by counting multiplicities, Multiset α
is equivalent to α →₀ ℕ
,
but Finset.antidiagonal
and Multiset.antidiagonal
will return different objects.
For example, for s : Multiset ℕ := {0,0,0}
, Multiset.antidiagonal s
has 8 elements
but Finset.antidiagonal s
has only 4.
def s : Multiset ℕ := {0, 0, 0}
#eval (Finset.antidiagonal s).card -- 4
#eval Multiset.card (Multiset.antidiagonal s) -- 8
HasMulAntidiagonal
(for monoids).
For PNat
, we will recover the set of divisors of a strictly positive integer.This closes #7917
Co-authored by: María Inés de Frutos-Fernández <mariaines.dff@gmail.com> and Eric Wieser <efw27@cam.ac.uk>
Co-authored-by: Antoine Chambert-Loir <antoine.chambert-loir@math.univ-paris-diderot.fr> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -269,7 +269,7 @@ protected def submodule : Submodule (reesAlgebra I) (PolynomialModule R M) where
rw [Subalgebra.smul_def, PolynomialModule.smul_apply]
apply Submodule.sum_mem
rintro ⟨j, k⟩ e
- rw [Finset.Nat.mem_antidiagonal] at e
+ rw [Finset.mem_antidiagonal] at e
subst e
exact F.pow_smul_le j k (Submodule.smul_mem_smul (r.2 j) (hf k))
#align ideal.filtration.submodule Ideal.Filtration.submodule
@@ -402,9 +402,9 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.N i).FG) : F.submodule.FG ↔ F
variable {F}
-theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable)
+theorem Stable.of_le [IsNoetherianRing R] [Module.Finite R M] (hF : F.Stable)
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable := by
- haveI := isNoetherian_of_fg_of_noetherian' h.1
+ have := isNoetherian_of_isNoetherianRing_of_finite R M
rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
@@ -432,13 +432,13 @@ theorem Ideal.exists_pow_inf_eq_pow_smul [IsNoetherianRing R] [Module.Finite R M
((I.stableFiltration_stable ⊤).inter_right (I.trivialFiltration N)).exists_pow_smul_eq_of_ge
#align ideal.exists_pow_inf_eq_pow_smul Ideal.exists_pow_inf_eq_pow_smul
-theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [hM : Module.Finite R M] (x : M) :
+theorem Ideal.mem_iInf_smul_pow_eq_bot_iff [IsNoetherianRing R] [Module.Finite R M] (x : M) :
x ∈ (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M) ↔ ∃ r : I, (r : R) • x = x := by
let N := (⨅ i : ℕ, I ^ i • ⊤ : Submodule R M)
have hN : ∀ k, (I.stableFiltration ⊤ ⊓ I.trivialFiltration N).N k = N :=
fun k => inf_eq_right.mpr ((iInf_le _ k).trans <| le_of_eq <| by simp)
constructor
- · haveI := isNoetherian_of_fg_of_noetherian' hM.out
+ · have := isNoetherian_of_isNoetherianRing_of_finite R M
obtain ⟨r, hr₁, hr₂⟩ :=
Submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul I N (IsNoetherian.noetherian N) (by
obtain ⟨k, hk⟩ := (I.stableFiltration_stable ⊤).inter_right (I.trivialFiltration N)
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -169,13 +169,13 @@ set_option linter.uppercaseLean3 false in
#align ideal.filtration.bot_N Ideal.Filtration.bot_N
@[simp]
-theorem iSup_N {ι : Sort _} (f : ι → I.Filtration M) : (iSup f).N = ⨆ i, (f i).N :=
+theorem iSup_N {ι : Sort*} (f : ι → I.Filtration M) : (iSup f).N = ⨆ i, (f i).N :=
congr_arg sSup (Set.range_comp _ _).symm
set_option linter.uppercaseLean3 false in
#align ideal.filtration.supr_N Ideal.Filtration.iSup_N
@[simp]
-theorem iInf_N {ι : Sort _} (f : ι → I.Filtration M) : (iInf f).N = ⨅ i, (f i).N :=
+theorem iInf_N {ι : Sort*} (f : ι → I.Filtration M) : (iInf f).N = ⨅ i, (f i).N :=
congr_arg sInf (Set.range_comp _ _).symm
set_option linter.uppercaseLean3 false in
#align ideal.filtration.infi_N Ideal.Filtration.iInf_N
FunLike
for OrderHom
(#5805)
Co-authored-by: Jujian Zhang <jujian.zhang1998@outlook.com> Co-authored-by: Oliver Nash <github@olivernash.org>
@@ -371,8 +371,14 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.N i).FG) : F.submodule.FG ↔ F
simp_rw [← F.submodule_eq_span_le_iff_stable_ge]
constructor
· rintro H
- apply H.stablizes_of_iSup_eq
- ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (_ : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
+ refine H.stablizes_of_iSup_eq
+ ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (_ : i ≤ n₀), single R i '' ↑(F.N i)), ?_⟩ ?_
+ · intro n m e
+ rw [Submodule.span_le, Set.iUnion₂_subset_iff]
+ intro i hi
+ refine Set.Subset.trans ?_ Submodule.subset_span
+ refine @Set.subset_iUnion₂ _ _ _ (fun i => fun _ => ↑((single R i) '' ((N F i) : Set M))) i ?_
+ exact hi.trans e
· dsimp
rw [← Submodule.span_iUnion, ← submodule_span_single]
congr 1
@@ -381,12 +387,6 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.N i).FG) : F.submodule.FG ↔ F
constructor
· rintro ⟨-, i, -, e⟩; exact ⟨i, e⟩
· rintro ⟨i, e⟩; exact ⟨i, i, le_refl i, e⟩
- · intro n m e
- rw [Submodule.span_le, Set.iUnion₂_subset_iff]
- intro i hi
- refine Set.Subset.trans ?_ Submodule.subset_span
- refine @Set.subset_iUnion₂ _ _ _ (fun i => fun _ => ↑((single R i) '' ((N F i) : Set M))) i ?_
- exact hi.trans e
· rintro ⟨n, hn⟩
rw [hn]
simp_rw [Submodule.span_iUnion₂, ← Finset.mem_range_succ_iff, iSup_subtype']
@@ -2,11 +2,6 @@
Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-
-! This file was ported from Lean 3 source module ring_theory.filtration
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.RingTheory.Ideal.LocalRing
import Mathlib.RingTheory.Noetherian
@@ -15,6 +10,8 @@ import Mathlib.RingTheory.Finiteness
import Mathlib.Data.Polynomial.Module
import Mathlib.Order.Hom.Lattice
+#align_import ring_theory.filtration from "leanprover-community/mathlib"@"70fd9563a21e7b963887c9360bd29b2393e6225a"
+
/-!
# `I`-filtrations of modules
@@ -471,7 +471,7 @@ theorem Ideal.iInf_pow_smul_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing
/-- **Krull's intersection theorem** for noetherian local rings. -/
theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h : I ≠ ⊤) :
- (⨅ i : ℕ, I ^ i) = ⊥ := by
+ ⨅ i : ℕ, I ^ i = ⊥ := by
convert I.iInf_pow_smul_eq_bot_of_localRing (M := R) h
ext i
rw [smul_eq_mul, ← Ideal.one_eq_top, mul_one]
@@ -479,7 +479,7 @@ theorem Ideal.iInf_pow_eq_bot_of_localRing [IsNoetherianRing R] [LocalRing R] (h
/-- **Krull's intersection theorem** for noetherian domains. -/
theorem Ideal.iInf_pow_eq_bot_of_isDomain [IsNoetherianRing R] [IsDomain R] (h : I ≠ ⊤) :
- (⨅ i : ℕ, I ^ i) = ⊥ := by
+ ⨅ i : ℕ, I ^ i = ⊥ := by
rw [eq_bot_iff]
intro x hx
by_contra hx'
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -408,7 +408,7 @@ variable {F}
theorem Stable.of_le [IsNoetherianRing R] [h : Module.Finite R M] (hF : F.Stable)
{F' : I.Filtration M} (hf : F' ≤ F) : F'.Stable := by
haveI := isNoetherian_of_fg_of_noetherian' h.1
- rw [← submodule_fg_iff_stable] at hF⊢
+ rw [← submodule_fg_iff_stable] at hF ⊢
any_goals intro i; exact IsNoetherian.noetherian _
have := isNoetherian_of_fg_of_noetherian _ hF
rw [isNoetherian_submodule] at this
@@ -375,7 +375,7 @@ theorem submodule_fg_iff_stable (hF' : ∀ i, (F.N i).FG) : F.submodule.FG ↔ F
constructor
· rintro H
apply H.stablizes_of_iSup_eq
- ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (_H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
+ ⟨fun n₀ => Submodule.span _ (⋃ (i : ℕ) (_ : i ≤ n₀), single R i '' ↑(F.N i)), _⟩
· dsimp
rw [← Submodule.span_iUnion, ← submodule_span_single]
congr 1
The unported dependencies are