Theorem: LinearMap.polyCharpoly_coeff_eq_zero_of_basis
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
H : (φ.polyCharpoly b).coeff k = 0
⊢ (φ.polyCharpoly b').coeff k = 0
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
H :
  ↑(MvPolynomial.bind₁ (toMvPolynomial b (Module.Free.chooseBasis R M).end φ))
      ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) =
    0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' (Module.Free.chooseBasis R M).end φ))
      ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) =
    0
tactic: rw [polyCharpoly, polyCharpolyAux, Polynomial.coeff_map] at H ⊢
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
H :
  ↑(MvPolynomial.bind₁ (toMvPolynomial b (Module.Free.chooseBasis R M).end φ))
      ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) =
    0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' (Module.Free.chooseBasis R M).end φ))
      ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) =
    0
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
H : ↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
tactic: set B := (Module.Free.chooseBasis R M).end
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
H : ↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
H : ↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
tactic: set g := toMvPolynomial b' b LinearMap.id
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
H : ↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
H :
  (MvPolynomial.bind₁ g)
      (↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k)) =
    (MvPolynomial.bind₁ g) 0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
tactic: apply_fun (MvPolynomial.bind₁ g) at H
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
H :
  (MvPolynomial.bind₁ g)
      (↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k)) =
    (MvPolynomial.bind₁ g) 0
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
H :
  (MvPolynomial.bind₁ g)
      (↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k)) =
    (MvPolynomial.bind₁ g) 0
this : toMvPolynomial b' B φ = fun i => (MvPolynomial.bind₁ g) (toMvPolynomial b B φ i)
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
tactic: have : toMvPolynomial b' B φ = fun i ↦ (MvPolynomial.bind₁ g) (toMvPolynomial b B φ i) :=
    funext <| toMvPolynomial_comp b' b B φ LinearMap.id
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✝ b : Basis ι R L
b' : Basis ι' R L
k : ℕ
B : Basis (Module.Free.ChooseBasisIndex R M × Module.Free.ChooseBasisIndex R M) R (Module.End R M) :=
  (Module.Free.chooseBasis R M).end
g : ι → MvPolynomial ι' R := toMvPolynomial b' b id
H :
  (MvPolynomial.bind₁ g)
      (↑(MvPolynomial.bind₁ (toMvPolynomial b B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k)) =
    (MvPolynomial.bind₁ g) 0
this : toMvPolynomial b' B φ = fun i => (MvPolynomial.bind₁ g) (toMvPolynomial b B φ i)
⊢ ↑(MvPolynomial.bind₁ (toMvPolynomial b' B φ)) ((charpoly.univ R (Module.Free.ChooseBasisIndex R M)).coeff k) = 0
state_after: no goals
tactic: rwa [map_zero, RingHom.coe_coe, MvPolynomial.bind₁_bind₁, ← this] at H