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

Proof steps:
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 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
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 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
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 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
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_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 φ
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: tfae_finish