-- Mathlib/LinearAlgebra/Matrix/Charpoly/Coeff.lean
theorem charpoly_sub_diagonal_degree_lt :
    (M.charpoly - ∏ i : n, (X - C (M i i))).degree < ↑(Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ (∑ x ∈ univ.erase (Equiv.refl n), ↑↑(Equiv.Perm.sign x) * ∏ i : n, M.charmatrix (x i) i +
          ↑↑(Equiv.Perm.sign (Equiv.refl n)) * ∏ i : n, M.charmatrix ((Equiv.refl n) i) i -
        ∏ i : n, (X - C (M i i))).degree <
    ↑(Fintype.card n - 1)

Tactic:
simp only [charmatrix_apply_eq, one_mul, Equiv.Perm.sign_refl, id, Int.cast_one,
  Units.val_one, add_sub_cancel_right, Equiv.coe_refl]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ (∑ x ∈ univ.erase (Equiv.refl n), ↑↑(Equiv.Perm.sign x) * ∏ i : n, M.charmatrix (x i) i).degree <
    ↑(Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ ∑ x ∈ univ.erase (Equiv.refl n), ↑↑(Equiv.Perm.sign x) * ∏ i : n, M.charmatrix (x i) i ∈
    degreeLT R (Fintype.card n - 1)

Tactic:
apply Submodule.sum_mem (degreeLT R (Fintype.card n - 1))

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ ∀ c ∈ univ.erase (Equiv.refl n),
    ↑↑(Equiv.Perm.sign c) * ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).degree < ↑(Fintype.card n - 1)

Tactic:
apply lt_of_le_of_lt degree_le_natDegree _

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ↑(∏ i : n, M.charmatrix (c i) i).natDegree < ↑(Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).natDegree < Fintype.card n - 1

Tactic:
apply lt_of_le_of_lt _ (Equiv.Perm.fixed_point_card_lt_of_ne_one (ne_of_mem_erase hc))

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).natDegree ≤ #(filter (fun x => c x = x) univ)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).natDegree ≤ #(filter (fun x => c x = x) univ)

Tactic:
apply le_trans (Polynomial.natDegree_prod_le univ fun i : n => charmatrix M (c i) i) _

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ #(filter (fun x => c x = x) univ)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)

Tactic:
rw [mem_degreeLT]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).degree < ↑(Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ ∑ x ∈ filter (fun x => c x = x) univ, 1

Tactic:
rw [sum_filter]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ ∑ a : n, if c a = a then 1 else 0

Proof state:
case h
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
i✝ : n
a✝ : i✝ ∈ univ
⊢ (M.charmatrix (c i✝) i✝).natDegree ≤ if c i✝ = i✝ then 1 else 0

Tactic:
apply charmatrix_apply_natDegree_le

Result:
no goals

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ #(filter (fun x => c x = x) univ)

Tactic:
rw [card_eq_sum_ones]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ ∑ x ∈ filter (fun x => c x = x) univ, 1

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ↑(∏ i : n, M.charmatrix (c i) i).natDegree < ↑(Fintype.card n - 1)

Tactic:
rw [Nat.cast_lt]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ (∏ i : n, M.charmatrix (c i) i).natDegree < Fintype.card n - 1

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ (∑ x ∈ univ.erase (Equiv.refl n), ↑↑(Equiv.Perm.sign x) * ∏ i : n, M.charmatrix (x i) i).degree <
    ↑(Fintype.card n - 1)

Tactic:
rw [← mem_degreeLT]

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ ∑ x ∈ univ.erase (Equiv.refl n), ↑↑(Equiv.Perm.sign x) * ∏ i : n, M.charmatrix (x i) i ∈
    degreeLT R (Fintype.card n - 1)

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∑ i : n, (M.charmatrix (c i) i).natDegree ≤ ∑ a : n, if c a = a then 1 else 0

Tactic:
apply sum_le_sum

Result:
case h
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∀ i ∈ univ, (M.charmatrix (c i) i).natDegree ≤ if c i = i then 1 else 0

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
⊢ ∀ c ∈ univ.erase (Equiv.refl n),
    ↑↑(Equiv.Perm.sign c) * ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)

Tactic:
intro c hc

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ↑↑(Equiv.Perm.sign c) * ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)

Proof state:
case h
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∀ i ∈ univ, (M.charmatrix (c i) i).natDegree ≤ if c i = i then 1 else 0

Tactic:
intros

Result:
case h
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
i✝ : n
a✝ : i✝ ∈ univ
⊢ (M.charmatrix (c i✝) i✝).natDegree ≤ if c i✝ = i✝ then 1 else 0

Proof state:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ↑↑(Equiv.Perm.sign c) • ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)

Tactic:
apply Submodule.smul_mem (degreeLT R (Fintype.card n - 1)) ↑↑(Equiv.Perm.sign c)

Result:
R : Type u
inst✝² : CommRing R
n : Type v
inst✝¹ : DecidableEq n
inst✝ : Fintype n
M : Matrix n n R
c : n ≃ n
hc : c ∈ univ.erase (Equiv.refl n)
⊢ ∏ i : n, M.charmatrix (c i) i ∈ degreeLT R (Fintype.card n - 1)