Theorem: LinearMap.charpoly_nilpotent_tfae
File: Mathlib/LinearAlgebra/Eigenspace/Zero.lean

tactic: tfae_have 1 → 2
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE
state_after: case tfae_1_to_2
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
⊢ IsNilpotent φ → charpoly φ = X ^ finrank R M

R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE

tactic: tfae_have 2 → 3
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE
state_after: case tfae_2_to_3
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
⊢ charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0

R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE

tactic: tfae_have 3 → 1
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE
state_after: case tfae_3_to_1
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ

R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE

tactic: tfae_have 2 ↔ 4
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE
state_after: case tfae_2_iff_4
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
⊢ charpoly φ = X ^ finrank R M ↔ (charpoly φ).natTrailingDegree = finrank R M

R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
tfae_2_iff_4 : charpoly φ = X ^ finrank R M ↔ (charpoly φ).natTrailingDegree = finrank R M
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE

tactic: tfae_finish
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
tfae_2_iff_4 : charpoly φ = X ^ finrank R M ↔ (charpoly φ).natTrailingDegree = finrank R M
⊢ [IsNilpotent φ, charpoly φ = X ^ finrank R M, ∀ (m : M), ∃ n, (φ ^ n) m = 0,
      (charpoly φ).natTrailingDegree = finrank R M].TFAE
state_after: no goals

tactic: apply IsNilpotent.charpoly_eq_X_pow_finrank
state_before: case tfae_1_to_2
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
⊢ IsNilpotent φ → charpoly φ = X ^ finrank R M
state_after: no goals

tactic: intro h m
state_before: case tfae_2_to_3
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
⊢ charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
state_after: case tfae_2_to_3
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ ∃ n, (φ ^ n) m = 0

tactic: use finrank R M
state_before: case tfae_2_to_3
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ ∃ n, (φ ^ n) m = 0
state_after: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ (φ ^ finrank R M) m = 0

tactic: suffices φ ^ finrank R M = 0 by simp only [this, LinearMap.zero_apply]
state_before: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ (φ ^ finrank R M) m = 0
state_after: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ φ ^ finrank R M = 0

tactic: simpa only [h, map_pow, aeval_X] using φ.aeval_self_charpoly
state_before: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
⊢ φ ^ finrank R M = 0
state_after: no goals

tactic: simp only [this, LinearMap.zero_apply]
state_before: R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
h : charpoly φ = X ^ finrank R M
m : M
this : φ ^ finrank R M = 0
⊢ (φ ^ finrank R M) m = 0
state_after: no goals

tactic: intro h
state_before: case tfae_3_to_1
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
state_after: case tfae_3_to_1
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ IsNilpotent φ

tactic: obtain ⟨n, hn⟩ := Filter.eventually_atTop.mp <| φ.eventually_iSup_ker_pow_eq
state_before: case tfae_3_to_1
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
⊢ IsNilpotent φ
state_after: case tfae_3_to_1.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
⊢ IsNilpotent φ

tactic: use n
state_before: case tfae_3_to_1.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
⊢ IsNilpotent φ
state_after: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
⊢ φ ^ n = 0

tactic: ext x
state_before: case h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
⊢ φ ^ n = 0
state_after: case h.h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
⊢ (φ ^ n) x = 0 x

tactic: rw [zero_apply, ← mem_ker, ← hn n le_rfl]
state_before: case h.h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
⊢ (φ ^ n) x = 0 x
state_after: case h.h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
⊢ x ∈ ⨆ m, ker (φ ^ m)

tactic: obtain ⟨k, hk⟩ := h x
state_before: case h.h
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
⊢ x ∈ ⨆ m, ker (φ ^ m)
state_after: case h.h.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
k : ℕ
hk : (φ ^ k) x = 0
⊢ x ∈ ⨆ m, ker (φ ^ m)

tactic: rw [← mem_ker] at hk
state_before: case h.h.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
k : ℕ
hk : (φ ^ k) x = 0
⊢ x ∈ ⨆ m, ker (φ ^ m)
state_after: case h.h.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
k : ℕ
hk : x ∈ ker (φ ^ k)
⊢ x ∈ ⨆ m, ker (φ ^ m)

tactic: exact Submodule.mem_iSup_of_mem _ hk
state_before: case h.h.intro
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
h : ∀ (m : M), ∃ n, (φ ^ n) m = 0
n : ℕ
hn : ∀ b ≥ n, ⨆ m, ker (φ ^ m) = ker (φ ^ b)
x : M
k : ℕ
hk : x ∈ ker (φ ^ k)
⊢ x ∈ ⨆ m, ker (φ ^ m)
state_after: no goals

tactic: rw [← φ.charpoly_natDegree, φ.charpoly_monic.eq_X_pow_iff_natTrailingDegree_eq_natDegree]
state_before: case tfae_2_iff_4
R : Type u_1
K : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R M
inst✝² : Module K M
inst✝¹ : Module.Finite K M
inst✝ : IsNoetherian R M
φ : Module.End R M
tfae_1_to_2 : IsNilpotent φ → charpoly φ = X ^ finrank R M
tfae_2_to_3 : charpoly φ = X ^ finrank R M → ∀ (m : M), ∃ n, (φ ^ n) m = 0
tfae_3_to_1 : (∀ (m : M), ∃ n, (φ ^ n) m = 0) → IsNilpotent φ
⊢ charpoly φ = X ^ finrank R M ↔ (charpoly φ).natTrailingDegree = finrank R M
state_after: no goals