Theorem: FiniteField.Matrix.charpoly_pow_card
File: Mathlib/LinearAlgebra/Matrix/Charpoly/FiniteField.lean

tactic: cases (isEmpty_or_nonempty n).symm
state_before: n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: cases' CharP.exists K with p hp
state_before: case inl
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: letI := hp
state_before: case inl.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp : CharP K p
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: rcases FiniteField.card K p with ⟨⟨k, kpos⟩, ⟨hp, hk⟩⟩
state_before: case inl.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp : CharP K p
this : CharP K p := hp
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: haveI : Fact p.Prime := ⟨hp⟩
state_before: case inl.intro.intro.mk.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ ↑{ val := k, property := kpos }
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: dsimp at hk
state_before: case inl.intro.intro.mk.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ ↑{ val := k, property := kpos }
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: rw [hk]
state_before: case inl.intro.intro.mk.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ Fintype.card K) = charpoly M

tactic: apply (frobenius_inj K[X] p).iterate k
state_before: case inl.intro.intro.mk.intro
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ p ^ k) = charpoly M

tactic: repeat' rw [iterate_frobenius (R := K[X])]; rw [← hk]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ (↑(frobenius K[X] p)^[k]) (charpoly (M ^ p ^ k)) = (↑(frobenius K[X] p)^[k]) (charpoly M)

tactic: rw [← FiniteField.expand_card]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ Fintype.card K) ^ Fintype.card K = charpoly M ^ Fintype.card K

tactic: unfold charpoly
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑(expand K (Fintype.card K)) (charpoly (M ^ Fintype.card K)) = charpoly M ^ Fintype.card K

tactic: rw [AlgHom.map_det, ← coe_detMonoidHom, ← (detMonoidHom : Matrix n n K[X] →* K[X]).map_pow]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑(expand K (Fintype.card K)) (det (charmatrix (M ^ Fintype.card K))) = det (charmatrix M) ^ Fintype.card K

tactic: apply congr_arg det
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑detMonoidHom (↑(AlgHom.mapMatrix (expand K (Fintype.card K))) (charmatrix (M ^ Fintype.card K))) =
    ↑detMonoidHom (charmatrix M ^ Fintype.card K)

tactic: refine' matPolyEquiv.injective _
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑(AlgHom.mapMatrix (expand K (Fintype.card K))) (charmatrix (M ^ Fintype.card K)) = charmatrix M ^ Fintype.card K

tactic: rw [AlgEquiv.map_pow, matPolyEquiv_charmatrix, hk, sub_pow_char_pow_of_commute, ← C_pow]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑matPolyEquiv (↑(AlgHom.mapMatrix (expand K (Fintype.card K))) (charmatrix (M ^ Fintype.card K))) =
    ↑matPolyEquiv (charmatrix M ^ Fintype.card K)

tactic: rw [iterate_frobenius (R := K[X])]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ Fintype.card K) ^ Fintype.card K = charpoly M ^ Fintype.card K

tactic: rw [← hk]
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ charpoly (M ^ Fintype.card K) ^ Fintype.card K = charpoly M ^ p ^ k

tactic: exact (id (matPolyEquiv_eq_x_pow_sub_c (p ^ k) M) : _)
state_before: case inl.intro.intro.mk.intro.a
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ ↑matPolyEquiv (↑(AlgHom.mapMatrix (expand K (p ^ k))) (charmatrix (M ^ p ^ k))) = X ^ p ^ k - ↑C (M ^ p ^ k)

tactic: exact (C M).commute_X
state_before: case inl.intro.intro.mk.intro.a.h
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : Nonempty n
p : ℕ
hp✝ : CharP K p
this✝ : CharP K p := hp✝
k : ℕ
kpos : 0 < k
hp : Nat.Prime p
hk : Fintype.card K = p ^ k
this : Fact (Nat.Prime p)
⊢ Commute X (↑C M)

tactic: exact congr_arg _ (Subsingleton.elim _ _)
state_before: case inr
n : Type u_2
inst✝³ : DecidableEq n
inst✝² : Fintype n
K : Type u_1
inst✝¹ : Field K
inst✝ : Fintype K
M : Matrix n n K
h✝ : IsEmpty n
⊢ charpoly (M ^ Fintype.card K) = charpoly M