@@ -6,6 +6,7 @@ Author: Alexander Bentkamp.
6
6
7
7
import field_theory.algebraic_closure
8
8
import linear_algebra.finsupp
9
+ import linear_algebra.matrix
9
10
10
11
/-!
11
12
# Eigenvectors and eigenvalues
82
83
... = (b • (f - b⁻¹ • am a)).ker : by rw linear_map.ker_smul _ b hb
83
84
... = (b • f - am a).ker : by rw [smul_sub, smul_inv_smul' hb]
84
85
85
- lemma eigenspace_eval₂_polynomial_degree_1 [field K] [vector_space K V]
86
+ lemma eigenspace_aeval_polynomial_degree_1 [field K] [vector_space K V]
86
87
(f : End K V) (q : polynomial K) (hq : degree q = 1 ) :
87
- eigenspace f (- q.coeff 0 / q.leading_coeff) = (eval₂ am f q).ker :=
88
+ eigenspace f (- q.coeff 0 / q.leading_coeff) = (aeval f q).ker :=
88
89
calc
89
90
eigenspace f (- q.coeff 0 / q.leading_coeff) = (q.leading_coeff • f - am (- q.coeff 0 )).ker
90
91
: by { rw eigenspace_div, intro h, rw leading_coeff_eq_zero_iff_deg_eq_bot.1 h at hq, cases hq }
91
- ... = (eval₂ am f (C q.leading_coeff * X + C (q.coeff 0 ))).ker
92
- : by { rw C_mul', simpa [algebra_map, algebra.to_ring_hom] }
93
- ... = (eval₂ am f q).ker
92
+ ... = (aeval f (C q.leading_coeff * X + C (q.coeff 0 ))).ker
93
+ : by { rw [ C_mul', aeval_def], simpa [algebra_map, algebra.to_ring_hom], }
94
+ ... = (aeval f q).ker
94
95
: by { congr, apply (eq_X_add_C_of_degree_eq_one hq).symm }
95
96
96
- lemma ker_eval₂_ring_hom '_unit_polynomial [field K] [vector_space K V]
97
+ lemma ker_aeval_ring_hom '_unit_polynomial [field K] [vector_space K V]
97
98
(f : End K V) (c : units (polynomial K)) :
98
- ((eval₂_ring_hom' am algebra.commutes f) ↑c ).ker = ⊥ :=
99
+ (aeval f (c : polynomial K) ).ker = ⊥ :=
99
100
begin
100
101
rw polynomial.eq_C_of_degree_eq_zero (degree_coe_units c),
101
- simp only [eval₂_ring_hom', ring_hom.of, ring_hom.coe_mk , eval₂_C],
102
+ simp only [aeval_def , eval₂_C],
102
103
apply ker_algebra_map_End,
103
104
apply coeff_coe_units_zero_ne_zero c
104
105
end
105
106
107
+ theorem aeval_apply_of_has_eigenvector [field K] [vector_space K V] {f : End K V}
108
+ {p : polynomial K} {μ : K} {x : V} (h : f.has_eigenvector μ x) :
109
+ aeval f p x = (p.eval μ) • x :=
110
+ begin
111
+ apply p.induction_on,
112
+ { intro a, simp [module.algebra_map_End_apply] },
113
+ { intros p q hp hq, simp [hp, hq, add_smul] },
114
+ { intros n a hna,
115
+ rw [mul_comm, pow_succ, mul_assoc, alg_hom.map_mul, linear_map.mul_app, mul_comm, hna],
116
+ simp [algebra_map_End_apply, mem_eigenspace_iff.1 h.2 , smul_smul, mul_comm] }
117
+ end
118
+
119
+ section minimal_polynomial
120
+
121
+ variables [field K] [vector_space K V] [finite_dimensional K V] (f : End K V)
122
+
123
+ protected theorem is_integral : is_integral K f :=
124
+ is_integral_of_noetherian (by apply_instance) f
125
+
126
+ variables {f} {μ : K}
127
+
128
+ theorem is_root_of_has_eigenvalue (h : f.has_eigenvalue μ) :
129
+ (minimal_polynomial f.is_integral).is_root μ :=
130
+ begin
131
+ rcases (submodule.ne_bot_iff _).1 h with ⟨w, ⟨H, ne0⟩⟩,
132
+ refine or.resolve_right (smul_eq_zero.1 _) ne0,
133
+ simp [← aeval_apply_of_has_eigenvector ⟨ne0, H⟩, minimal_polynomial.aeval f.is_integral],
134
+ end
135
+
136
+ theorem has_eigenvalue_of_is_root (h : (minimal_polynomial f.is_integral).is_root μ) :
137
+ f.has_eigenvalue μ :=
138
+ begin
139
+ cases dvd_iff_is_root.2 h with p hp,
140
+ rw [has_eigenvalue, eigenspace],
141
+ intro con,
142
+ cases (linear_map.is_unit_iff _).2 con with u hu,
143
+ have p_ne_0 : p ≠ 0 ,
144
+ { intro con,
145
+ apply minimal_polynomial.ne_zero f.is_integral,
146
+ rw [hp, con, mul_zero] },
147
+ have h_deg := minimal_polynomial.degree_le_of_ne_zero f.is_integral p_ne_0 _,
148
+ { rw [hp, degree_mul, degree_X_sub_C, polynomial.degree_eq_nat_degree p_ne_0] at h_deg,
149
+ norm_cast at h_deg,
150
+ linarith, },
151
+ { have h_aeval := minimal_polynomial.aeval f.is_integral,
152
+ revert h_aeval,
153
+ simp [hp, ← hu] },
154
+ end
155
+
156
+ theorem has_eigenvalue_iff_is_root :
157
+ f.has_eigenvalue μ ↔ (minimal_polynomial f.is_integral).is_root μ :=
158
+ ⟨is_root_of_has_eigenvalue, has_eigenvalue_of_is_root⟩
159
+
160
+ end minimal_polynomial
161
+
106
162
/-- Every linear operator on a vector space over an algebraically closed field has
107
163
an eigenvalue. (Axler's Theorem 2.1.) -/
108
164
lemma exists_eigenvalue
@@ -118,35 +174,34 @@ begin
118
174
have h_lin_dep : ¬ linear_independent K (λ n : ℕ, (f ^ n) v),
119
175
{ apply not_linear_independent_of_infinite, },
120
176
-- Therefore, there must be a nonzero polynomial `p` such that `p(f) v = 0`.
121
- obtain ⟨p, h_eval_p, h_p_ne_0⟩ : ∃ p, eval₂ am f p v = 0 ∧ p ≠ 0 ,
122
- { simp only [not_imp.symm],
123
- exact not_forall.1 (λ h, h_lin_dep ((linear_independent_powers_iff_eval₂ f v).2 h)) },
124
- -- Then `p(f)` is not invertible.
125
- have h_eval_p_not_unit : eval₂_ring_hom' am _ f p ∉ is_unit.submonoid (End K V),
177
+ obtain ⟨p, ⟨h_mon, h_eval_p⟩⟩ := f.is_integral,
178
+ have h_eval_p_not_unit : aeval f p ∉ is_unit.submonoid (End K V),
126
179
{ rw [is_unit.mem_submonoid_iff, linear_map.is_unit_iff, linear_map.ker_eq_bot'],
127
180
intro h,
128
- exact hv (h v h_eval_p) },
181
+ apply hv (h v _),
182
+ rw [h_eval_p, linear_map.zero_apply] },
129
183
-- Hence, there must be a factor `q` of `p` such that `q(f)` is not invertible.
130
- obtain ⟨q, hq_factor, hq_nonunit⟩ : ∃ q, q ∈ factors p ∧ ¬ is_unit (eval₂ am f q),
184
+ obtain ⟨q, hq_factor, hq_nonunit⟩ : ∃ q, q ∈ factors p ∧ ¬ is_unit (aeval f q),
131
185
{ simp only [←not_imp, (is_unit.mem_submonoid_iff _).symm],
132
- apply not_forall.1 (λ h, h_eval_p_not_unit (ring_hom_mem_submonoid_of_factors_subset_of_units_subset
186
+ apply not_forall.1 (λ h, h_eval_p_not_unit
187
+ (ring_hom_mem_submonoid_of_factors_subset_of_units_subset
133
188
(eval₂_ring_hom' am algebra.commutes f)
134
- (is_unit.submonoid (End K V)) p h_p_ne_0 h _)),
189
+ (is_unit.submonoid (End K V)) p h_mon.ne_zero h _)),
135
190
simp only [is_unit.mem_submonoid_iff, linear_map.is_unit_iff],
136
- apply ker_eval₂_ring_hom '_unit_polynomial },
191
+ apply ker_aeval_ring_hom '_unit_polynomial },
137
192
-- Since the field is algebraically closed, `q` has degree 1.
138
193
have h_deg_q : q.degree = 1 := is_alg_closed.degree_eq_one_of_irreducible _
139
- (ne_zero_of_mem_factors h_p_ne_0 hq_factor)
140
- ((factors_spec p h_p_ne_0 ).1 q hq_factor),
194
+ (ne_zero_of_mem_factors h_mon.ne_zero hq_factor)
195
+ ((factors_spec p h_mon.ne_zero ).1 q hq_factor),
141
196
-- Then the kernel of `q(f)` is an eigenspace.
142
- have h_eigenspace: eigenspace f (-q.coeff 0 / q.leading_coeff) = (eval₂ am f q).ker,
143
- from eigenspace_eval₂_polynomial_degree_1 f q h_deg_q,
197
+ have h_eigenspace: eigenspace f (-q.coeff 0 / q.leading_coeff) = (aeval f q).ker,
198
+ from eigenspace_aeval_polynomial_degree_1 f q h_deg_q,
144
199
-- Since `q(f)` is not invertible, the kernel is not `⊥`, and thus there exists an eigenvalue.
145
200
show ∃ (c : K), f.has_eigenvalue c,
146
201
{ use -q.coeff 0 / q.leading_coeff,
147
202
rw [has_eigenvalue, h_eigenspace],
148
203
intro h_eval_ker,
149
- exact hq_nonunit ((linear_map.is_unit_iff (eval₂ am f q)).2 h_eval_ker) }
204
+ exact hq_nonunit ((linear_map.is_unit_iff (aeval f q)).2 h_eval_ker) }
150
205
end
151
206
152
207
/-- Eigenvectors corresponding to distinct eigenvalues of a linear operator are linearly
0 commit comments