Theorem: Submodule.exists_isTorsionBy
File: Mathlib/Algebra/Module/Torsion.lean

tactic: let oj := List.argmax (fun i => pOrder hM <| s i) (List.finRange d)
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
⊢ ∃ j, IsTorsionBy R M (p ^ pOrder hM (s j))

tactic: have hoj : oj.isSome :=
  Option.ne_none_iff_isSome.mp fun eq_none =>
    hd <| List.finRange_eq_nil.mp <| List.argmax_eq_none.mp eq_none
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
⊢ ∃ j, IsTorsionBy R M (p ^ pOrder hM (s j))

tactic: use Option.get _ hoj
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
⊢ ∃ j, IsTorsionBy R M (p ^ pOrder hM (s j))

tactic: rw [isTorsionBy_iff_torsionBy_eq_top, eq_top_iff, ← hs, Submodule.span_le,
  Set.range_subset_iff]
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
⊢ IsTorsionBy R M (p ^ pOrder hM (s (Option.get oj hoj)))

tactic: intro i
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
⊢ ∀ (y : Fin d), s y ∈ ↑(torsionBy R M (p ^ pOrder hM (s (Option.get oj hoj))))

tactic: change (p ^ pOrder hM (s (Option.get oj hoj))) • s i = 0
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
i : Fin d
⊢ s i ∈ ↑(torsionBy R M (p ^ pOrder hM (s (Option.get oj hoj))))

tactic: have : pOrder hM (s i) ≤ pOrder hM (s <| Option.get _ hoj) :=
  List.le_of_mem_argmax (List.mem_finRange i) (Option.get_mem hoj)
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
i : Fin d
⊢ p ^ pOrder hM (s (Option.get oj hoj)) • s i = 0

tactic: rw [← Nat.sub_add_cancel this, pow_add, mul_smul, pow_pOrder_smul, smul_zero]
state_before: R : Type u_2
M : Type u_1
inst✝³ : CommSemiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : (x : M) → Decidable (x = 0)
p : R
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
d : ℕ
hd : d ≠ 0
s : Fin d → M
hs : span R (Set.range s) = ⊤
oj : Option (Fin d) := List.argmax (fun i => pOrder hM (s i)) (List.finRange d)
hoj : Option.isSome oj = true
i : Fin d
this : pOrder hM (s i) ≤ pOrder hM (s (Option.get oj hoj))
⊢ p ^ pOrder hM (s (Option.get oj hoj)) • s i = 0