@@ -53,7 +53,7 @@ namespace Module
53
53
54
54
namespace End
55
55
56
- open FiniteDimensional
56
+ open FiniteDimensional Set
57
57
58
58
variable {K R : Type v} {V M : Type w} [CommRing R] [AddCommGroup M] [Module R M] [Field K]
59
59
[AddCommGroup V] [Module K V]
@@ -141,117 +141,6 @@ theorem eigenspace_div (f : End K V) (a b : K) (hb : b ≠ 0) :
141
141
_ = LinearMap.ker (b • f - algebraMap K (End K V) a) := by rw [smul_sub, smul_inv_smul₀ hb]
142
142
#align module.End.eigenspace_div Module.End.eigenspace_div
143
143
144
- /-- The eigenspaces of a linear operator form an independent family of subspaces of `V`. That is,
145
- any eigenspace has trivial intersection with the span of all the other eigenspaces. -/
146
- theorem eigenspaces_independent (f : End K V) : CompleteLattice.Independent f.eigenspace := by
147
- classical
148
- -- Define an operation from `Π₀ μ : K, f.eigenspace μ`, the vector space of finitely-supported
149
- -- choices of an eigenvector from each eigenspace, to `V`, by sending a collection to its sum.
150
- let S : @LinearMap K K _ _ (RingHom.id K) (Π₀ μ : K, f.eigenspace μ) V
151
- (@DFinsupp.addCommMonoid K (fun μ => f.eigenspace μ) _) _
152
- (@DFinsupp.module K _ (fun μ => f.eigenspace μ) _ _ _) _ :=
153
- @DFinsupp.lsum K K ℕ _ V _ _ _ _ _ _ _ _ _ fun μ => (f.eigenspace μ).subtype
154
- -- We need to show that if a finitely-supported collection `l` of representatives of the
155
- -- eigenspaces has sum `0`, then it itself is zero.
156
- suffices ∀ l : Π₀ μ, f.eigenspace μ, S l = 0 → l = 0 by
157
- rw [CompleteLattice.independent_iff_dfinsupp_lsum_injective]
158
- change Function.Injective S
159
- rw [← @LinearMap.ker_eq_bot K K (Π₀ μ, f.eigenspace μ) V _ _
160
- (@DFinsupp.addCommGroup K (fun μ => f.eigenspace μ) _)]
161
- rw [eq_bot_iff]
162
- exact this
163
- intro l hl
164
- -- We apply induction on the finite set of eigenvalues from which `l` selects a nonzero
165
- -- eigenvector, i.e. on the support of `l`.
166
- induction' h_l_support : l.support using Finset.induction with μ₀ l_support' hμ₀ ih generalizing l
167
- -- If the support is empty, all coefficients are zero and we are done.
168
- · exact DFinsupp.support_eq_empty.1 h_l_support
169
- -- Now assume that the support of `l` contains at least one eigenvalue `μ₀`. We define a new
170
- -- collection of representatives `l'` to apply the induction hypothesis on later. The collection
171
- -- of representatives `l'` is derived from `l` by multiplying the coefficient of the eigenvector
172
- -- with eigenvalue `μ` by `μ - μ₀`.
173
- · let l' := DFinsupp.mapRange.linearMap
174
- (fun μ => (μ - μ₀) • @LinearMap.id K (f.eigenspace μ) _ _ _) l
175
- -- The support of `l'` is the support of `l` without `μ₀`.
176
- have h_l_support' : l'.support = l_support' := by
177
- rw [← Finset.erase_insert hμ₀, ← h_l_support]
178
- ext a
179
- have : ¬(a = μ₀ ∨ l a = 0 ) ↔ ¬a = μ₀ ∧ ¬l a = 0 := not_or
180
- simp only [DFinsupp.mapRange.linearMap_apply, DFinsupp.mapRange_apply,
181
- DFinsupp.mem_support_iff, Finset.mem_erase, id.def, LinearMap.id_coe, LinearMap.smul_apply,
182
- Ne.def, smul_eq_zero, sub_eq_zero, this]
183
- -- The entries of `l'` add up to `0`.
184
- have total_l' : S l' = 0 := by
185
- let g := f - algebraMap K (End K V) μ₀
186
- let a : Π₀ _ : K, V := DFinsupp.mapRange.linearMap (fun μ => (f.eigenspace μ).subtype) l
187
- calc
188
- S l' =
189
- DFinsupp.lsum ℕ (fun μ => (f.eigenspace μ).subtype.comp ((μ - μ₀) • LinearMap.id)) l := ?_
190
- _ = DFinsupp.lsum ℕ (fun μ => g.comp (f.eigenspace μ).subtype) l := ?_
191
- _ = DFinsupp.lsum ℕ (fun _ => g) a := ?_
192
- _ = g (DFinsupp.lsum ℕ (fun _ => (LinearMap.id : V →ₗ[K] V)) a) := ?_
193
- _ = g (S l) := ?_
194
- _ = 0 := by rw [hl, g.map_zero]
195
- · exact DFinsupp.sum_mapRange_index.linearMap
196
- · congr
197
- ext μ v
198
- simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, LinearMap.id_coe,
199
- id.def, sub_smul, Submodule.subtype_apply, Submodule.coe_sub, Submodule.coe_smul_of_tower,
200
- LinearMap.sub_apply, mem_eigenspace_iff.1 v.prop, algebraMap_end_apply]
201
- · rw [DFinsupp.sum_mapRange_index.linearMap]
202
- · simp only [DFinsupp.sumAddHom_apply, LinearMap.id_coe, map_dfinsupp_sum, id.def,
203
- LinearMap.toAddMonoidHom_coe, DFinsupp.lsum_apply_apply]
204
- · simp only [DFinsupp.sum_mapRange_index.linearMap, LinearMap.id_comp]
205
- -- Therefore, by the induction hypothesis, all entries of `l'` are zero.
206
- have l'_eq_0 := ih l' total_l' h_l_support'
207
- -- By the definition of `l'`, this means that `(μ - μ₀) • l μ = 0` for all `μ`.
208
- have h_smul_eq_0 : ∀ μ, (μ - μ₀) • l μ = 0 := by
209
- intro μ
210
- calc
211
- (μ - μ₀) • l μ = l' μ := by
212
- simp only [LinearMap.id_coe, id.def, LinearMap.smul_apply, DFinsupp.mapRange_apply,
213
- DFinsupp.mapRange.linearMap_apply]
214
- _ = 0 := by rw [l'_eq_0]; rfl
215
- -- Thus, the eigenspace-representatives in `l` for all `μ ≠ μ₀` are `0`.
216
- have h_lμ_eq_0 : ∀ μ : K, μ ≠ μ₀ → l μ = 0 := by
217
- intro μ hμ
218
- apply or_iff_not_imp_left.1 (smul_eq_zero.1 (h_smul_eq_0 μ))
219
- rwa [sub_eq_zero]
220
- -- So if we sum over all these representatives, we obtain `0`.
221
- have h_sum_l_support'_eq_0 : (Finset.sum l_support' fun μ => (l μ : V)) = 0 := by
222
- rw [← Finset.sum_const_zero]
223
- apply Finset.sum_congr rfl
224
- intro μ hμ
225
- rw [Submodule.coe_eq_zero, h_lμ_eq_0]
226
- rintro rfl
227
- exact hμ₀ hμ
228
- -- The only potentially nonzero eigenspace-representative in `l` is the one corresponding to
229
- -- `μ₀`. But since the overall sum is `0` by assumption, this representative must also be `0`.
230
- have : l μ₀ = 0 := by
231
- simp only [DFinsupp.lsum_apply_apply, DFinsupp.sumAddHom_apply,
232
- LinearMap.toAddMonoidHom_coe, DFinsupp.sum, h_l_support, Submodule.subtype_apply,
233
- Submodule.coe_eq_zero, Finset.sum_insert hμ₀, h_sum_l_support'_eq_0, add_zero] at hl
234
- exact hl
235
- -- Thus, all coefficients in `l` are `0`.
236
- show l = 0
237
- · ext μ
238
- by_cases h_cases : μ = μ₀
239
- · rwa [h_cases, SetLike.coe_eq_coe, DFinsupp.coe_zero, Pi.zero_apply]
240
- · exact congr_arg _ (h_lμ_eq_0 μ h_cases)
241
- #align module.End.eigenspaces_independent Module.End.eigenspaces_independent
242
-
243
- /-- Eigenvectors corresponding to distinct eigenvalues of a linear operator are linearly
244
- independent. (Lemma 5.10 of [ axler2015 ] )
245
-
246
- We use the eigenvalues as indexing set to ensure that there is only one eigenvector for each
247
- eigenvalue in the image of `xs`. -/
248
- theorem eigenvectors_linearIndependent (f : End K V) (μs : Set K) (xs : μs → V)
249
- (h_eigenvec : ∀ μ : μs, f.HasEigenvector μ (xs μ)) : LinearIndependent K xs :=
250
- CompleteLattice.Independent.linearIndependent _
251
- (f.eigenspaces_independent.comp Subtype.coe_injective) (fun μ => (h_eigenvec μ).1 ) fun μ =>
252
- (h_eigenvec μ).2
253
- #align module.End.eigenvectors_linear_independent Module.End.eigenvectors_linearIndependent
254
-
255
144
/-- The generalized eigenspace for a linear map `f`, a scalar `μ`, and an exponent `k ∈ ℕ` is the
256
145
kernel of `(f - μ • id) ^ k`. (Def 8.10 of [ axler2015 ] ). Furthermore, a generalized eigenspace for
257
146
some exponent `k` is contained in the generalized eigenspace for exponents larger than `k`. -/
@@ -379,13 +268,128 @@ theorem generalizedEigenspace_le_generalizedEigenspace_finrank [FiniteDimensiona
379
268
ker_pow_le_ker_pow_finrank _ _
380
269
#align module.End.generalized_eigenspace_le_generalized_eigenspace_finrank Module.End.generalizedEigenspace_le_generalizedEigenspace_finrank
381
270
271
+ @[simp] theorem iSup_generalizedEigenspace_eq_generalizedEigenspace_finrank
272
+ [FiniteDimensional K V] (f : End K V) (μ : K) :
273
+ ⨆ k, f.generalizedEigenspace μ k = f.generalizedEigenspace μ (finrank K V) :=
274
+ le_antisymm (iSup_le (generalizedEigenspace_le_generalizedEigenspace_finrank f μ)) (le_iSup _ _)
275
+
382
276
/-- Generalized eigenspaces for exponents at least `finrank K V` are equal to each other. -/
383
277
theorem generalizedEigenspace_eq_generalizedEigenspace_finrank_of_le [FiniteDimensional K V]
384
278
(f : End K V) (μ : K) {k : ℕ} (hk : finrank K V ≤ k) :
385
279
f.generalizedEigenspace μ k = f.generalizedEigenspace μ (finrank K V) :=
386
280
ker_pow_eq_ker_pow_finrank_of_le hk
387
281
#align module.End.generalized_eigenspace_eq_generalized_eigenspace_finrank_of_le Module.End.generalizedEigenspace_eq_generalizedEigenspace_finrank_of_le
388
282
283
+ lemma mapsTo_generalizedEigenspace_of_comm {f g : End R M} (h : Commute f g) (μ : R) (k : ℕ) :
284
+ MapsTo g (f.generalizedEigenspace μ k) (f.generalizedEigenspace μ k) := by
285
+ replace h : Commute ((f - μ • (1 : End R M)) ^ k) g :=
286
+ (h.sub_left <| Algebra.commute_algebraMap_left μ g).pow_left k
287
+ intro x hx
288
+ simp only [SetLike.mem_coe, mem_generalizedEigenspace] at hx ⊢
289
+ rw [← LinearMap.comp_apply, ← LinearMap.mul_eq_comp, h.eq, LinearMap.mul_eq_comp,
290
+ LinearMap.comp_apply, hx, map_zero]
291
+
292
+ lemma mapsTo_iSup_generalizedEigenspace_of_comm {f g : End R M} (h : Commute f g) (μ : R) :
293
+ MapsTo g ↑(⨆ k, f.generalizedEigenspace μ k) ↑(⨆ k, f.generalizedEigenspace μ k) := by
294
+ simp only [MapsTo, Submodule.coe_iSup_of_chain, mem_iUnion, SetLike.mem_coe]
295
+ rintro x ⟨k, hk⟩
296
+ exact ⟨k, f.mapsTo_generalizedEigenspace_of_comm h μ k hk⟩
297
+
298
+ lemma disjoint_generalizedEigenspace [NoZeroSMulDivisors R M]
299
+ (f : End R M) {μ₁ μ₂ : R} (hμ : μ₁ ≠ μ₂) (k l : ℕ) :
300
+ Disjoint (f.generalizedEigenspace μ₁ k) (f.generalizedEigenspace μ₂ l) := by
301
+ nontriviality M
302
+ have := NoZeroSMulDivisors.isReduced R M
303
+ rw [disjoint_iff]
304
+ set p := f.generalizedEigenspace μ₁ k ⊓ f.generalizedEigenspace μ₂ l
305
+ by_contra hp
306
+ replace hp : Nontrivial p := Submodule.nontrivial_iff_ne_bot.mpr hp
307
+ let f₁ : End R p := (f - algebraMap R (End R M) μ₁).restrict <| MapsTo.inter_inter
308
+ (mapsTo_generalizedEigenspace_of_comm (Algebra.mul_sub_algebraMap_commutes f μ₁) μ₁ k)
309
+ (mapsTo_generalizedEigenspace_of_comm (Algebra.mul_sub_algebraMap_commutes f μ₁) μ₂ l)
310
+ let f₂ : End R p := (f - algebraMap R (End R M) μ₂).restrict <| MapsTo.inter_inter
311
+ (mapsTo_generalizedEigenspace_of_comm (Algebra.mul_sub_algebraMap_commutes f μ₂) μ₁ k)
312
+ (mapsTo_generalizedEigenspace_of_comm (Algebra.mul_sub_algebraMap_commutes f μ₂) μ₂ l)
313
+ have : IsNilpotent (f₂ - f₁) := by
314
+ apply Commute.isNilpotent_sub (x := f₂) (y := f₁) _ ⟨l, ?_⟩ ⟨k, ?_⟩
315
+ · ext; simp [smul_sub, sub_sub, smul_comm μ₁, add_sub_left_comm]
316
+ all_goals ext ⟨x, _, _⟩; simpa [LinearMap.restrict_apply, LinearMap.pow_restrict _] using ‹_›
317
+ have hf₁₂ : f₂ - f₁ = algebraMap R (End R p) (μ₁ - μ₂) := by ext; simp [sub_smul]
318
+ rw [hf₁₂, IsNilpotent.map_iff (NoZeroSMulDivisors.algebraMap_injective _ _),
319
+ isNilpotent_iff_eq_zero, sub_eq_zero] at this
320
+ contradiction
321
+
322
+ lemma disjoint_iSup_generalizedEigenspace [NoZeroSMulDivisors R M]
323
+ (f : End R M) {μ₁ μ₂ : R} (hμ : μ₁ ≠ μ₂) :
324
+ Disjoint (⨆ k, f.generalizedEigenspace μ₁ k) (⨆ k, f.generalizedEigenspace μ₂ k) := by
325
+ simp_rw [(f.generalizedEigenspace μ₁).mono.directed_le.disjoint_iSup_left,
326
+ (f.generalizedEigenspace μ₂).mono.directed_le.disjoint_iSup_right]
327
+ exact disjoint_generalizedEigenspace f hμ
328
+
329
+ lemma injOn_generalizedEigenspace [NoZeroSMulDivisors R M] (f : End R M) :
330
+ InjOn (⨆ k, f.generalizedEigenspace · k) {μ | ⨆ k, f.generalizedEigenspace μ k ≠ ⊥} := by
331
+ rintro μ₁ _ μ₂ hμ₂ (hμ₁₂ : ⨆ k, f.generalizedEigenspace μ₁ k = ⨆ k, f.generalizedEigenspace μ₂ k)
332
+ by_contra contra
333
+ apply hμ₂
334
+ simpa only [hμ₁₂, disjoint_self] using f.disjoint_iSup_generalizedEigenspace contra
335
+
336
+ theorem independent_generalizedEigenspace [NoZeroSMulDivisors R M] (f : End R M) :
337
+ CompleteLattice.Independent (fun μ ↦ ⨆ k, f.generalizedEigenspace μ k) := by
338
+ classical
339
+ suffices ∀ μ (s : Finset R) (_ : μ ∉ s), Disjoint (⨆ k, f.generalizedEigenspace μ k)
340
+ (s.sup fun μ ↦ ⨆ k, f.generalizedEigenspace μ k) by
341
+ simp_rw [CompleteLattice.independent_iff_supIndep_of_injOn f.injOn_generalizedEigenspace,
342
+ Finset.supIndep_iff_disjoint_erase]
343
+ exact fun s μ _ ↦ this _ _ (s.not_mem_erase μ)
344
+ intro μ₁ s
345
+ induction' s using Finset.induction_on with μ₂ s _ ih; simp
346
+ intro hμ₁₂
347
+ obtain ⟨hμ₁₂ : μ₁ ≠ μ₂, hμ₁ : μ₁ ∉ s⟩ := by rwa [Finset.mem_insert, not_or] at hμ₁₂
348
+ specialize ih hμ₁
349
+ rw [Finset.sup_insert, disjoint_iff, Submodule.eq_bot_iff]
350
+ rintro x ⟨hx, hx'⟩
351
+ simp only [SetLike.mem_coe] at hx hx'
352
+ suffices x ∈ ⨆ k, generalizedEigenspace f μ₂ k by
353
+ rw [← Submodule.mem_bot (R := R), ← (f.disjoint_iSup_generalizedEigenspace hμ₁₂).eq_bot]
354
+ exact ⟨hx, this⟩
355
+ obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.mp hx'; clear hx'
356
+ let g := f - algebraMap R (End R M) μ₂
357
+ obtain ⟨k : ℕ, hk : (g ^ k) y = 0 ⟩ := by simpa using hy
358
+ have hyz : (g ^ k) (y + z) ∈
359
+ (⨆ k, generalizedEigenspace f μ₁ k) ⊓ s.sup fun μ ↦ ⨆ k, f.generalizedEigenspace μ k := by
360
+ refine ⟨f.mapsTo_iSup_generalizedEigenspace_of_comm ?_ μ₁ hx, ?_⟩
361
+ · exact Algebra.mul_sub_algebraMap_pow_commutes f μ₂ k
362
+ · rw [SetLike.mem_coe, map_add, hk, zero_add]
363
+ suffices (s.sup fun μ ↦ ⨆ k, f.generalizedEigenspace μ k).map (g ^ k) ≤
364
+ s.sup fun μ ↦ ⨆ k, f.generalizedEigenspace μ k by exact this (Submodule.mem_map_of_mem hz)
365
+ simp_rw [Finset.sup_eq_iSup, Submodule.map_iSup (ι := R), Submodule.map_iSup (ι := _ ∈ s)]
366
+ refine iSup₂_mono fun μ _ ↦ ?_
367
+ rintro - ⟨u, hu, rfl⟩
368
+ refine f.mapsTo_iSup_generalizedEigenspace_of_comm ?_ μ hu
369
+ exact Algebra.mul_sub_algebraMap_pow_commutes f μ₂ k
370
+ rw [ih.eq_bot, Submodule.mem_bot] at hyz
371
+ simp_rw [Submodule.mem_iSup_of_chain, mem_generalizedEigenspace]
372
+ exact ⟨k, hyz⟩
373
+
374
+ /-- The eigenspaces of a linear operator form an independent family of subspaces of `M`. That is,
375
+ any eigenspace has trivial intersection with the span of all the other eigenspaces. -/
376
+ theorem eigenspaces_independent [NoZeroSMulDivisors R M] (f : End R M) :
377
+ CompleteLattice.Independent f.eigenspace :=
378
+ f.independent_generalizedEigenspace.mono <| fun μ ↦ le_iSup (generalizedEigenspace f μ) 1
379
+
380
+ /-- Eigenvectors corresponding to distinct eigenvalues of a linear operator are linearly
381
+ independent. (Lemma 5.10 of [ axler2015 ] )
382
+
383
+ We use the eigenvalues as indexing set to ensure that there is only one eigenvector for each
384
+ eigenvalue in the image of `xs`. -/
385
+ theorem eigenvectors_linearIndependent [NoZeroSMulDivisors R M]
386
+ (f : End R M) (μs : Set R) (xs : μs → M)
387
+ (h_eigenvec : ∀ μ : μs, f.HasEigenvector μ (xs μ)) : LinearIndependent R xs :=
388
+ CompleteLattice.Independent.linearIndependent _
389
+ (f.eigenspaces_independent.comp Subtype.coe_injective) (fun μ => (h_eigenvec μ).1 ) fun μ =>
390
+ (h_eigenvec μ).2
391
+ #align module.End.eigenvectors_linear_independent Module.End.eigenvectors_linearIndependent
392
+
389
393
/-- If `f` maps a subspace `p` into itself, then the generalized eigenspace of the restriction
390
394
of `f` to `p` is the part of the generalized eigenspace of `f` that lies in `p`. -/
391
395
theorem generalizedEigenspace_restrict (f : End R M) (p : Submodule R M) (k : ℕ) (μ : R)
@@ -400,6 +404,12 @@ theorem generalizedEigenspace_restrict (f : End R M) (p : Submodule R M) (k :
400
404
LinearMap.comp_assoc]
401
405
#align module.End.generalized_eigenspace_restrict Module.End.generalizedEigenspace_restrict
402
406
407
+ lemma _root_.Submodule.inf_generalizedEigenspace (f : End R M) (p : Submodule R M) {k : ℕ} {μ : R}
408
+ (hfp : ∀ x : M, x ∈ p → f x ∈ p) :
409
+ p ⊓ f.generalizedEigenspace μ k =
410
+ (generalizedEigenspace (LinearMap.restrict f hfp) μ k).map p.subtype := by
411
+ rw [f.generalizedEigenspace_restrict _ _ _ hfp, Submodule.map_comap_eq, Submodule.range_subtype]
412
+
403
413
/-- If `p` is an invariant submodule of an endomorphism `f`, then the `μ`-eigenspace of the
404
414
restriction of `f` to `p` is a submodule of the `μ`-eigenspace of `f`. -/
405
415
theorem eigenspace_restrict_le_eigenspace (f : End R M) {p : Submodule R M} (hfp : ∀ x ∈ p, f x ∈ p)
0 commit comments