Theorem: Submodule.mem_of_span_eq_top_of_smul_pow_mem
File: Mathlib/RingTheory/Ideal/Operations.lean

tactic: obtain ⟨s', hs₁, hs₂⟩ := (Ideal.span_eq_top_iff_finite _).mp hs
state_before: R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
H : ∀ (r : ↑s), ∃ n, ↑r ^ n • x ∈ M'
⊢ x ∈ M'

tactic: replace H : ∀ r : s', ∃ n : ℕ, ((r : R) ^ n  : R) • x ∈ M' := fun r => H ⟨_, hs₁ r.2⟩
state_before: case intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
H : ∀ (r : ↑s), ∃ n, ↑r ^ n • x ∈ M'
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
⊢ x ∈ M'

tactic: choose n₁ n₂ using H
state_before: case intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
H : ∀ (r : { x // x ∈ s' }), ∃ n, ↑r ^ n • x ∈ M'
⊢ x ∈ M'

tactic: let N := s'.attach.sup n₁
state_before: case intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
⊢ x ∈ M'

tactic: have hs' := Ideal.span_pow_eq_top (s' : Set R) hs₂ N
state_before: case intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
⊢ x ∈ M'

tactic: apply M'.mem_of_span_top_of_smul_mem _ hs'
state_before: case intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
hs' : Ideal.span ((fun x => x ^ N) '' ↑s') = ⊤
⊢ x ∈ M'

tactic: rintro ⟨_, r, hr, rfl⟩
state_before: case intro.intro.H
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
hs' : Ideal.span ((fun x => x ^ N) '' ↑s') = ⊤
⊢ ∀ (r : ↑((fun x => x ^ N) '' ↑s')), ↑r • x ∈ M'

tactic: convert M'.smul_mem (r ^ (N - n₁ ⟨r, hr⟩)) (n₂ ⟨r, hr⟩) using 1
state_before: case intro.intro.H.mk.intro.intro
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
hs' : Ideal.span ((fun x => x ^ N) '' ↑s') = ⊤
r : R
hr : r ∈ ↑s'
⊢ ↑{ val := (fun x => x ^ N) r, property := (_ : ∃ a, a ∈ ↑s' ∧ (fun x => x ^ N) a = (fun x => x ^ N) r) } • x ∈ M'

tactic: simp only [Subtype.coe_mk, smul_smul, ← pow_add]
state_before: case h.e'_4
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
hs' : Ideal.span ((fun x => x ^ N) '' ↑s') = ⊤
r : R
hr : r ∈ ↑s'
⊢ ↑{ val := (fun x => x ^ N) r, property := (_ : ∃ a, a ∈ ↑s' ∧ (fun x => x ^ N) a = (fun x => x ^ N) r) } • x =
    r ^ (N - n₁ { val := r, property := hr }) • ↑{ val := r, property := hr } ^ n₁ { val := r, property := hr } • x

tactic: rw [tsub_add_cancel_of_le (Finset.le_sup (s'.mem_attach _) : n₁ ⟨r, hr⟩ ≤ N)]
state_before: case h.e'_4
R : Type u
M : Type v
F : Type ?u.123597
G : Type ?u.123600
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
I J : Ideal R
N✝ P : Submodule R M
S : Set R
T : Set M
M' : Submodule R M
s : Set R
hs : Ideal.span s = ⊤
x : M
s' : Finset R
hs₁ : ↑s' ⊆ s
hs₂ : Ideal.span ↑s' = ⊤
n₁ : { x // x ∈ s' } → ℕ
n₂ : ∀ (r : { x // x ∈ s' }), ↑r ^ n₁ r • x ∈ M'
N : ℕ := Finset.sup (Finset.attach s') n₁
hs' : Ideal.span ((fun x => x ^ N) '' ↑s') = ⊤
r : R
hr : r ∈ ↑s'
⊢ r ^ Finset.sup (Finset.attach s') n₁ • x =
    r ^ (Finset.sup (Finset.attach s') n₁ - n₁ { val := r, property := hr } + n₁ { val := r, property := hr }) • x