Theorem: LinearMap.exists_isNilRegular_of_finrank_le_card
File: Mathlib/Algebra/Module/LinearMap/Polynomial.lean

Proof steps:
state_before: R : Type u_1
L : Type u_2
M : Type u_3
n : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
⊢ ∃ x, φ.IsNilRegular x
state_after: R : Type u_1
L : Type u_2
M : Type u_3
n : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
⊢ ∃ x, φ.IsNilRegular x
tactic: let b := chooseBasis R L
state_before: R : Type u_1
L : Type u_2
M : Type u_3
n : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
⊢ ∃ x, φ.IsNilRegular x
state_after: R : Type u_1
L : Type u_2
M : Type u_3
n : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
⊢ ∃ x, φ.IsNilRegular x
tactic: let bₘ := chooseBasis R M
state_before: R : Type u_1
L : Type u_2
M : Type u_3
n : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
⊢ ∃ x, φ.IsNilRegular x
state_after: R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
⊢ ∃ x, φ.IsNilRegular x
tactic: let n := Fintype.card (ChooseBasisIndex R M)
state_before: R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
⊢ ∃ x, φ.IsNilRegular x
state_after: R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
⊢ ∃ x, φ.IsNilRegular x
tactic: have aux :
    ((polyCharpoly φ b).coeff (nilRank φ)).IsHomogeneous (n - nilRank φ) :=
    polyCharpoly_coeff_isHomogeneous _ b (nilRank φ) (n - nilRank φ)
      (by simp [nilRank_le_card φ bₘ, finrank_eq_card_chooseBasisIndex])
state_before: R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
⊢ ∃ x, φ.IsNilRegular x
state_after: case intro
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
⊢ ∃ x, φ.IsNilRegular x
tactic: obtain ⟨x, hx⟩ : ∃ r, eval r ((polyCharpoly _ b).coeff (nilRank φ)) ≠ 0 := by
    by_contra! h₀
    apply polyCharpoly_coeff_nilRank_ne_zero φ b
    apply aux.eq_zero_of_forall_eval_eq_zero_of_le_card h₀ (le_trans _ h)
    simp only [finrank_eq_card_chooseBasisIndex, Nat.cast_le, Nat.sub_le]
state_before: case intro
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
⊢ ∃ x, φ.IsNilRegular x
state_after: case intro
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
c : ChooseBasisIndex R L →₀ R := Finsupp.equivFunOnFinite.symm x
⊢ ∃ x, φ.IsNilRegular x
tactic: let c := Finsupp.equivFunOnFinite.symm x
state_before: case intro
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
c : ChooseBasisIndex R L →₀ R := Finsupp.equivFunOnFinite.symm x
⊢ ∃ x, φ.IsNilRegular x
state_after: case h
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
c : ChooseBasisIndex R L →₀ R := Finsupp.equivFunOnFinite.symm x
⊢ φ.IsNilRegular (b.repr.symm c)
tactic: use b.repr.symm c
state_before: case h
R : Type u_1
L : Type u_2
M : Type u_3
n✝ : Type u_4
ι : Type u_5
ι' : Type u_6
ιM : Type u_7
inst✝¹⁵ : CommRing R
inst✝¹⁴ : AddCommGroup L
inst✝¹³ : Module R L
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
φ : L →ₗ[R] Module.End R M
inst✝¹⁰ : Fintype ι
inst✝⁹ : Fintype ι'
inst✝⁸ : Fintype ιM
inst✝⁷ : DecidableEq ι
inst✝⁶ : DecidableEq ι'
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
b✝ : Basis ι R L
inst✝³ : Module.Finite R L
inst✝² : Module.Free R L
inst✝¹ : Nontrivial R
x✝ : L
inst✝ : IsDomain R
h : ↑(finrank R M) ≤ #R
b : Basis (ChooseBasisIndex R L) R L := chooseBasis R L
bₘ : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
n : ℕ := Fintype.card (ChooseBasisIndex R M)
aux : ((φ.polyCharpoly b).coeff φ.nilRank).IsHomogeneous (n - φ.nilRank)
x : ChooseBasisIndex R L → R
hx : (eval x) ((φ.polyCharpoly b).coeff φ.nilRank) ≠ 0
c : ChooseBasisIndex R L →₀ R := Finsupp.equivFunOnFinite.symm x
⊢ φ.IsNilRegular (b.repr.symm c)
state_after: no goals
tactic: rwa [isNilRegular_iff_coeff_polyCharpoly_nilRank_ne_zero _ b, LinearEquiv.apply_symm_apply]