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

tactic: have := le_refl I.radical
state_before: R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
⊢ ∃ n, I.radical ^ n ≤ I
state_after: R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
this : I.radical ≤ I.radical
⊢ ∃ n, I.radical ^ n ≤ I

tactic: revert this
state_before: R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
this : I.radical ≤ I.radical
⊢ ∃ n, I.radical ^ n ≤ I
state_after: R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
⊢ I.radical ≤ I.radical → ∃ n, I.radical ^ n ≤ I

tactic: refine Submodule.fg_induction _ _ (fun J => J ≤ I.radical → ∃ n : ℕ, J ^ n ≤ I) ?_ ?_ _ h
state_before: R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
⊢ I.radical ≤ I.radical → ∃ n, I.radical ^ n ≤ I
state_after: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
⊢ ∀ (x : R), (fun J => J ≤ I.radical → ∃ n, J ^ n ≤ I) (Submodule.span R {x})

case refine_2
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
⊢ ∀ (M₁ M₂ : Submodule R R),
    (fun J => J ≤ I.radical → ∃ n, J ^ n ≤ I) M₁ →
      (fun J => J ≤ I.radical → ∃ n, J ^ n ≤ I) M₂ → (fun J => J ≤ I.radical → ∃ n, J ^ n ≤ I) (M₁ ⊔ M₂)

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

tactic: obtain ⟨n, hn⟩ := hx (subset_span (Set.mem_singleton x))
state_before: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
x : R
hx : Submodule.span R {x} ≤ I.radical
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I
state_after: case refine_1.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
x : R
hx : Submodule.span R {x} ≤ I.radical
n : ℕ
hn : x ^ n ∈ 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_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
x : R
hx : Submodule.span R {x} ≤ I.radical
n : ℕ
hn : x ^ n ∈ I
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I
state_after: no goals

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

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

tactic: obtain ⟨n, hn⟩ := hJ fun x hx => hJK <| Ideal.mem_sup_left hx
state_before: case refine_2
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
⊢ ∃ n, (J ⊔ K) ^ n ≤ I
state_after: case refine_2.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ 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_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I
state_after: case refine_2.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I

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

tactic: rw [← Ideal.add_eq_sup, add_pow, Ideal.sum_eq_sup, Finset.sup_le_iff]
state_before: case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ (J ⊔ K) ^ (n + m) ≤ I
state_after: case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∀ b ∈ Finset.range (n + m + 1), J ^ b * K ^ (n + m - b) * ↑((n + m).choose b) ≤ I

tactic: refine fun i _ => Ideal.mul_le_right.trans ?_
state_before: case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∀ b ∈ Finset.range (n + m + 1), J ^ b * K ^ (n + m - b) * ↑((n + m).choose b) ≤ I
state_after: case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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: obtain h | h := le_or_lt n i
state_before: case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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
state_after: case h.inl
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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

case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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: apply Ideal.mul_le_right.trans ((Ideal.pow_le_pow_right h).trans hn)
state_before: case h.inl
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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
state_after: no goals

tactic: apply Ideal.mul_le_left.trans
state_before: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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
state_after: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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: refine (Ideal.pow_le_pow_right ?_).trans hm
state_before: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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
state_after: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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: rw [add_comm, Nat.add_sub_assoc h.le]
state_before: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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
state_after: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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)

tactic: apply Nat.le_add_right
state_before: case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : I.radical.FG
J K : Submodule R R
hJ : J ≤ I.radical → ∃ n, J ^ n ≤ I
hK : K ≤ I.radical → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ I.radical
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)
state_after: no goals