@@ -4,15 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Aaron Anderson, Jalex Stark
5
5
-/
6
6
7
- import algebra.polynomial.big_operators
8
- import data.matrix.char_p
9
- import field_theory.finite.basic
10
- import group_theory.perm.cycles
7
+ import data.polynomial.expand
11
8
import linear_algebra.matrix.charpoly.basic
12
- import linear_algebra.matrix.trace
13
- import linear_algebra.matrix.to_lin
14
- import ring_theory.polynomial.basic
15
- import ring_theory.power_basis
16
9
17
10
/-!
18
11
# Characteristic polynomials
@@ -182,54 +175,8 @@ begin
182
175
not_false_iff] }
183
176
end
184
177
185
- @[simp] lemma finite_field.matrix.charpoly_pow_card {K : Type *} [field K] [fintype K]
186
- (M : matrix n n K) : (M ^ (fintype.card K)).charpoly = M.charpoly :=
187
- begin
188
- casesI (is_empty_or_nonempty n).symm,
189
- { cases char_p.exists K with p hp, letI := hp,
190
- rcases finite_field.card K p with ⟨⟨k, kpos⟩, ⟨hp, hk⟩⟩,
191
- haveI : fact p.prime := ⟨hp⟩,
192
- dsimp at hk, rw hk at *,
193
- apply (frobenius_inj K[X] p).iterate k,
194
- repeat { rw iterate_frobenius, rw ← hk },
195
- rw ← finite_field.expand_card,
196
- unfold charpoly, rw [alg_hom.map_det, ← coe_det_monoid_hom,
197
- ← (det_monoid_hom : matrix n n K[X] →* K[X]).map_pow],
198
- apply congr_arg det,
199
- refine mat_poly_equiv.injective _,
200
- rw [alg_equiv.map_pow, mat_poly_equiv_charmatrix, hk, sub_pow_char_pow_of_commute, ← C_pow],
201
- { exact (id (mat_poly_equiv_eq_X_pow_sub_C (p ^ k) M) : _) },
202
- { exact (C M).commute_X } },
203
- { -- TODO[ gh-6025 ] : remove this `haveI` once `subsingleton_of_empty_right` is a global instance
204
- haveI : subsingleton (matrix n n K) := subsingleton_of_empty_right,
205
- exact congr_arg _ (subsingleton.elim _ _), },
206
- end
207
-
208
- @[simp] lemma zmod.charpoly_pow_card (M : matrix n n (zmod p)) :
209
- (M ^ p).charpoly = M.charpoly :=
210
- by { have h := finite_field.matrix.charpoly_pow_card M, rwa zmod.card at h, }
211
-
212
- lemma finite_field.trace_pow_card {K : Type *} [field K] [fintype K]
213
- (M : matrix n n K) : trace (M ^ (fintype.card K)) = trace M ^ (fintype.card K) :=
214
- begin
215
- casesI is_empty_or_nonempty n,
216
- { simp [zero_pow fintype.card_pos, matrix.trace], },
217
- rw [matrix.trace_eq_neg_charpoly_coeff, matrix.trace_eq_neg_charpoly_coeff,
218
- finite_field.matrix.charpoly_pow_card, finite_field.pow_card]
219
- end
220
-
221
- lemma zmod.trace_pow_card {p : ℕ} [fact p.prime] (M : matrix n n (zmod p)) :
222
- trace (M ^ p) = (trace M)^p :=
223
- by { have h := finite_field.trace_pow_card M, rwa zmod.card at h, }
224
-
225
178
namespace matrix
226
179
227
- theorem is_integral : is_integral R M := ⟨M.charpoly, ⟨charpoly_monic M, aeval_self_charpoly M⟩⟩
228
-
229
- theorem minpoly_dvd_charpoly {K : Type *} [field K] (M : matrix n n K) :
230
- (minpoly K M) ∣ M.charpoly :=
231
- minpoly.dvd _ _ (aeval_self_charpoly M)
232
-
233
180
/-- Any matrix polynomial `p` is equivalent under evaluation to `p %ₘ M.charpoly`; that is, `p`
234
181
is equivalent to a polynomial with degree less than the dimension of the matrix. -/
235
182
lemma aeval_eq_aeval_mod_charpoly (M : matrix n n R) (p : R[X]) :
@@ -243,29 +190,3 @@ lemma pow_eq_aeval_mod_charpoly (M : matrix n n R) (k : ℕ) : M^k = aeval M (X^
243
190
by rw [←aeval_eq_aeval_mod_charpoly, map_pow, aeval_X]
244
191
245
192
end matrix
246
-
247
- section power_basis
248
-
249
- open algebra
250
-
251
- /-- The characteristic polynomial of the map `λ x, a * x` is the minimal polynomial of `a`.
252
-
253
- In combination with `det_eq_sign_charpoly_coeff` or `trace_eq_neg_charpoly_coeff`
254
- and a bit of rewriting, this will allow us to conclude the
255
- field norm resp. trace of `x` is the product resp. sum of `x`'s conjugates.
256
- -/
257
- lemma charpoly_left_mul_matrix {K S : Type *} [field K] [comm_ring S] [algebra K S]
258
- (h : power_basis K S) :
259
- (left_mul_matrix h.basis h.gen).charpoly = minpoly K h.gen :=
260
- begin
261
- apply minpoly.unique,
262
- { apply matrix.charpoly_monic },
263
- { apply (injective_iff_map_eq_zero (left_mul_matrix _)).mp (left_mul_matrix_injective h.basis),
264
- rw [← polynomial.aeval_alg_hom_apply, aeval_self_charpoly] },
265
- { intros q q_monic root_q,
266
- rw [matrix.charpoly_degree_eq_dim, fintype.card_fin, degree_eq_nat_degree q_monic.ne_zero],
267
- apply with_bot.some_le_some.mpr,
268
- exact h.dim_le_nat_degree_of_root q_monic.ne_zero root_q }
269
- end
270
-
271
- end power_basis
0 commit comments