Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit a83230e

Browse files
committed
feat(linear_algebra/eigenspace): define the maximal generalized eigenspace (#7125)
And prove that it is of the form kernel of `(f - μ • id) ^ k` for some finite `k` for endomorphisms of Noetherian modules.
1 parent 026150f commit a83230e

File tree

2 files changed

+69
-18
lines changed

2 files changed

+69
-18
lines changed

src/linear_algebra/eigenspace.lean

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Authors: Alexander Bentkamp
77
import field_theory.algebraic_closure
88
import linear_algebra.finsupp
99
import linear_algebra.matrix
10+
import order.preorder_hom
1011

1112
/-!
1213
# Eigenvectors and eigenvalues
@@ -295,9 +296,16 @@ begin
295296
end
296297

297298
/-- The generalized eigenspace for a linear map `f`, a scalar `μ`, and an exponent `k ∈ ℕ` is the
298-
kernel of `(f - μ • id) ^ k`. (Def 8.10 of [axler2015])-/
299-
def generalized_eigenspace (f : End R M) (μ : R) (k : ℕ) : submodule R M :=
300-
((f - algebra_map R (End R M) μ) ^ k).ker
299+
kernel of `(f - μ • id) ^ k`. (Def 8.10 of [axler2015]). Furthermore, a generalized eigenspace for
300+
some exponent `k` is contained in the generalized eigenspace for exponents larger than `k`. -/
301+
def generalized_eigenspace (f : End R M) (μ : R) : ℕ →ₘ submodule R M :=
302+
{ to_fun := λ k, ((f - algebra_map R (End R M) μ) ^ k).ker,
303+
monotone' := λ k m hm,
304+
begin
305+
simp only [← pow_sub_mul_pow _ hm],
306+
exact linear_map.ker_le_ker_comp
307+
((f - algebra_map R (End R M) μ) ^ k) ((f - algebra_map R (End R M) μ) ^ (m - k)),
308+
end }
301309

302310
/-- A nonzero element of a generalized eigenspace is a generalized eigenvector.
303311
(Def 8.9 of [axler2015])-/
@@ -322,14 +330,24 @@ begin
322330
exact h linear_map.ker_id
323331
end
324332

325-
/-- A generalized eigenspace for some exponent `k` is contained in
326-
the generalized eigenspace for exponents larger than `k`. -/
327-
lemma generalized_eigenspace_mono {f : End R M} {μ : R} {k : ℕ} {m : ℕ} (hm : k ≤ m) :
328-
f.generalized_eigenspace μ k ≤ f.generalized_eigenspace μ m :=
333+
/-- The union of the kernels of `(f - μ • id) ^ k` over all `k`. -/
334+
def maximal_generalized_eigenspace (f : End R M) (μ : R) : submodule R M :=
335+
⨆ k, f.generalized_eigenspace μ k
336+
337+
/-- If there exists a natural number `k` such that the kernel of `(f - μ • id) ^ k` is the
338+
maximal generalized eigenspace, then this value is the least such `k`. If not, this value is not
339+
meaningful. -/
340+
noncomputable def maximal_generalized_eigenspace_index (f : End R M) (μ : R) :=
341+
monotonic_sequence_limit_index (f.generalized_eigenspace μ)
342+
343+
/-- For an endomorphism of a Noetherian module, the maximal eigenspace is always of the form kernel
344+
`(f - μ • id) ^ k` for some `k`. -/
345+
lemma maximal_generalized_eigenspace_eq [h : is_noetherian R M] (f : End R M) (μ : R) :
346+
maximal_generalized_eigenspace f μ =
347+
f.generalized_eigenspace μ (maximal_generalized_eigenspace_index f μ) :=
329348
begin
330-
simp only [generalized_eigenspace, ←pow_sub_mul_pow _ hm],
331-
exact linear_map.ker_le_ker_comp
332-
((f - algebra_map R (End R M) μ) ^ k) ((f - algebra_map R (End R M) μ) ^ (m - k)),
349+
rw is_noetherian_iff_well_founded at h,
350+
exact (well_founded.supr_eq_monotonic_sequence_limit h (f.generalized_eigenspace μ) : _),
333351
end
334352

335353
/-- A generalized eigenvalue for some exponent `k` is also
@@ -341,21 +359,22 @@ begin
341359
unfold has_generalized_eigenvalue at *,
342360
contrapose! hk,
343361
rw [←le_bot_iff, ←hk],
344-
exact generalized_eigenspace_mono hm
362+
exact (f.generalized_eigenspace μ).monotone hm,
345363
end
346364

347365
/-- The eigenspace is a subspace of the generalized eigenspace. -/
348-
lemma eigenspace_le_generalized_eigenspace {f : End K V} {μ : K} {k : ℕ} (hk : 0 < k) :
366+
lemma eigenspace_le_generalized_eigenspace {f : End R M} {μ : R} {k : ℕ} (hk : 0 < k) :
349367
f.eigenspace μ ≤ f.generalized_eigenspace μ k :=
350-
generalized_eigenspace_mono (nat.succ_le_of_lt hk)
368+
(f.generalized_eigenspace μ).monotone (nat.succ_le_of_lt hk)
351369

352370
/-- All eigenvalues are generalized eigenvalues. -/
353371
lemma has_generalized_eigenvalue_of_has_eigenvalue
354372
{f : End R M} {μ : R} {k : ℕ} (hk : 0 < k) (hμ : f.has_eigenvalue μ) :
355373
f.has_generalized_eigenvalue μ k :=
356374
begin
357375
apply has_generalized_eigenvalue_of_has_generalized_eigenvalue_of_le hk,
358-
rwa [has_generalized_eigenvalue, generalized_eigenspace, pow_one]
376+
rw [has_generalized_eigenvalue, generalized_eigenspace, preorder_hom.coe_fun_mk, pow_one],
377+
exact hμ,
359378
end
360379

361380
/-- All generalized eigenvalues are eigenvalues. -/
@@ -390,11 +409,11 @@ ker_pow_eq_ker_pow_findim_of_le hk
390409
/-- If `f` maps a subspace `p` into itself, then the generalized eigenspace of the restriction
391410
of `f` to `p` is the part of the generalized eigenspace of `f` that lies in `p`. -/
392411
lemma generalized_eigenspace_restrict
393-
(f : End K V) (p : submodule K V) (k : ℕ) (μ : K) (hfp : ∀ (x : V), x ∈ p → f x ∈ p) :
412+
(f : End R M) (p : submodule R M) (k : ℕ) (μ : R) (hfp : ∀ (x : M), x ∈ p → f x ∈ p) :
394413
generalized_eigenspace (linear_map.restrict f hfp) μ k =
395414
submodule.comap p.subtype (f.generalized_eigenspace μ k) :=
396415
begin
397-
rw [generalized_eigenspace, generalized_eigenspace, ←linear_map.ker_comp],
416+
simp only [generalized_eigenspace, preorder_hom.coe_fun_mk, ← linear_map.ker_comp],
398417
induction k with k ih,
399418
{ rw [pow_zero, pow_zero, linear_map.one_eq_id],
400419
apply (submodule.ker_subtype _).symm },
@@ -409,7 +428,7 @@ begin
409428
have h := calc
410429
submodule.comap ((f - algebra_map _ _ μ) ^ findim K V) (f.generalized_eigenspace μ (findim K V))
411430
= ((f - algebra_map _ _ μ) ^ findim K V * (f - algebra_map K (End K V) μ) ^ findim K V).ker :
412-
by { rw [generalized_eigenspace, linear_map.ker_comp], refl }
431+
by { simpa only [generalized_eigenspace, preorder_hom.coe_fun_mk, ← linear_map.ker_comp], }
413432
... = f.generalized_eigenspace μ (findim K V + findim K V) :
414433
by { rw ←pow_add, refl }
415434
... = f.generalized_eigenspace μ (findim K V) :
@@ -427,7 +446,7 @@ calc
427446
0 = findim K (⊥ : submodule K V) : by rw findim_bot
428447
... < findim K (f.eigenspace μ) : submodule.findim_lt_findim_of_lt (bot_lt_iff_ne_bot.2 hx)
429448
... ≤ findim K (f.generalized_eigenspace μ k) :
430-
submodule.findim_mono (generalized_eigenspace_mono (nat.succ_le_of_lt hk))
449+
submodule.findim_mono ((f.generalized_eigenspace μ).monotone (nat.succ_le_of_lt hk))
431450

432451
/-- A linear map maps a generalized eigenrange into itself. -/
433452
lemma map_generalized_eigenrange_le {f : End K V} {μ : K} {n : ℕ} :

src/order/order_iso_nat.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import data.equiv.denumerable
88
import data.set.finite
99
import order.rel_iso
1010
import order.preorder_hom
11+
import order.conditionally_complete_lattice
1112
import logic.function.iterate
1213

1314
namespace rel_embedding
@@ -157,3 +158,34 @@ begin
157158
obtain ⟨n, hn⟩ := h (a.swap : ((<) : ℕ → ℕ → Prop) →r ((<) : α → α → Prop)).to_preorder_hom,
158159
exact n.succ_ne_self.symm (rel_embedding.to_preorder_hom_injective _ (hn _ n.le_succ)), },
159160
end
161+
162+
/-- Given an eventually-constant monotonic sequence `a₀ ≤ a₁ ≤ a₂ ≤ ...` in a partially-ordered
163+
type, `monotonic_sequence_limit_index a` is the least natural number `n` for which `aₙ` reaches the
164+
constant value. For sequences that are not eventually constant, `monotonic_sequence_limit_index a`
165+
is defined, but is a junk value. -/
166+
noncomputable def monotonic_sequence_limit_index {α : Type*} [partial_order α] (a : ℕ →ₘ α) : ℕ :=
167+
Inf { n | ∀ m, n ≤ m → a n = a m }
168+
169+
/-- The constant value of an eventually-constant monotonic sequence `a₀ ≤ a₁ ≤ a₂ ≤ ...` in a
170+
partially-ordered type. -/
171+
noncomputable def monotonic_sequence_limit {α : Type*} [partial_order α] (a : ℕ →ₘ α) :=
172+
a (monotonic_sequence_limit_index a)
173+
174+
lemma well_founded.supr_eq_monotonic_sequence_limit {α : Type*} [complete_lattice α]
175+
(h : well_founded ((>) : α → α → Prop)) (a : ℕ →ₘ α) :
176+
(⨆ m, a m) = monotonic_sequence_limit a :=
177+
begin
178+
suffices : (⨆ (m : ℕ), a m) ≤ monotonic_sequence_limit a,
179+
{ exact le_antisymm this (le_supr a _), },
180+
apply supr_le,
181+
intros m,
182+
by_cases hm : m ≤ monotonic_sequence_limit_index a,
183+
{ exact a.monotone hm, },
184+
{ replace hm := le_of_not_le hm,
185+
let S := { n | ∀ m, n ≤ m → a n = a m },
186+
have hInf : Inf S ∈ S,
187+
{ refine nat.Inf_mem _, rw well_founded.monotone_chain_condition at h, exact h a, },
188+
change Inf S ≤ m at hm,
189+
change a m ≤ a (Inf S),
190+
rw hInf m hm, },
191+
end

0 commit comments

Comments
 (0)