Theorem: Ideal.exists_radical_pow_le_of_fg
File: Mathlib/RingTheory/Finiteness.lean

tactic: have := le_refl I.radical
state_before: R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∃ n, radical I ^ n ≤ I

tactic: revert this
state_before: R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
this : radical I ≤ radical I
⊢ ∃ n, radical I ^ n ≤ I

tactic: refine' Submodule.fg_induction _ _ (fun J => J ≤ I.radical → ∃ n : ℕ, J ^ n ≤ I) _ _ _ h
state_before: R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ radical I ≤ radical I → ∃ n, radical I ^ n ≤ I

tactic: intro x hx
state_before: case refine'_1
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∀ (x : R), (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) (Submodule.span R {x})

tactic: obtain ⟨n, hn⟩ := hx (subset_span (Set.mem_singleton x))
state_before: case refine'_1
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I

tactic: exact ⟨n, by rwa [← Ideal.span, span_singleton_pow, span_le, Set.singleton_subset_iff]⟩
state_before: case refine'_1.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
n : ℕ
hn : x ^ n ∈ I
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I

tactic: rwa [← Ideal.span, span_singleton_pow, span_le, Set.singleton_subset_iff]
state_before: R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
n : ℕ
hn : x ^ n ∈ I
⊢ Submodule.span R {x} ^ n ≤ I

tactic: intro J K hJ hK hJK
state_before: case refine'_2
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∀ (M₁ M₂ : Submodule R R),
    (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) M₁ →
      (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) M₂ → (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) (M₁ ⊔ M₂)

tactic: obtain ⟨n, hn⟩ := hJ fun x hx => hJK <| Ideal.mem_sup_left hx
state_before: case refine'_2
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I

tactic: obtain ⟨m, hm⟩ := hK fun x hx => hJK <| Ideal.mem_sup_right hx
state_before: case refine'_2.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I

tactic: use n + m
state_before: case refine'_2.intro.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I

tactic: rw [← Ideal.add_eq_sup, add_pow, Ideal.sum_eq_sup, Finset.sup_le_iff]
state_before: case refine'_2.intro.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ (J ⊔ K) ^ (n + m) ≤ I

tactic: refine' fun i _ => Ideal.mul_le_right.trans _
state_before: case refine'_2.intro.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∀ (b : ℕ), b ∈ Finset.range (n + m + 1) → J ^ b * K ^ (n + m - b) * ↑(Nat.choose (n + m) b) ≤ I

tactic: obtain h | h := le_or_lt n i
state_before: case refine'_2.intro.intro
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
⊢ J ^ i * K ^ (n + m - i) ≤ I

tactic: apply Ideal.mul_le_right.trans ((Ideal.pow_le_pow h).trans hn)
state_before: case refine'_2.intro.intro.inl
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : n ≤ i
⊢ J ^ i * K ^ (n + m - i) ≤ I

tactic: apply Ideal.mul_le_left.trans
state_before: case refine'_2.intro.intro.inr
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ J ^ i * K ^ (n + m - i) ≤ I

tactic: refine' (Ideal.pow_le_pow _).trans hm
state_before: case refine'_2.intro.intro.inr
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ K ^ (n + m - i) ≤ I

tactic: rw [add_comm, Nat.add_sub_assoc h.le]
state_before: case refine'_2.intro.intro.inr
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ m ≤ n + m - i

tactic: apply Nat.le_add_right
state_before: case refine'_2.intro.intro.inr
R✝ : Type ?u.375076
M : Type ?u.375079
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_1
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ m ≤ m + (n - i)