Skip to content

Commit 7fbfeaf

Browse files
ocfnashj-loreaux
andcommitted
feat: generalized eigenspaces are independent (#8177)
The main change is to upgrade the existing `Module.End.eigenspaces_independent`, which applied only to eigenspaces (and required a `[Field K]` assumption) to `Module.End.independent_generalizedEigenspace`, which applies to generalized eigenspaces (and requires only `[NoZeroSMulDivisors R M]`) Co-authored-by: Jireh Loreaux <loreaujy@gmail.com>
1 parent d34f0e9 commit 7fbfeaf

File tree

2 files changed

+133
-124
lines changed

2 files changed

+133
-124
lines changed

Mathlib/LinearAlgebra/Eigenspace/Basic.lean

Lines changed: 122 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ namespace Module
5353

5454
namespace End
5555

56-
open FiniteDimensional
56+
open FiniteDimensional Set
5757

5858
variable {K R : Type v} {V M : Type w} [CommRing R] [AddCommGroup M] [Module R M] [Field K]
5959
[AddCommGroup V] [Module K V]
@@ -141,117 +141,6 @@ theorem eigenspace_div (f : End K V) (a b : K) (hb : b ≠ 0) :
141141
_ = LinearMap.ker (b • f - algebraMap K (End K V) a) := by rw [smul_sub, smul_inv_smul₀ hb]
142142
#align module.End.eigenspace_div Module.End.eigenspace_div
143143

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-
255144
/-- The generalized eigenspace for a linear map `f`, a scalar `μ`, and an exponent `k ∈ ℕ` is the
256145
kernel of `(f - μ • id) ^ k`. (Def 8.10 of [axler2015]). Furthermore, a generalized eigenspace for
257146
some exponent `k` is contained in the generalized eigenspace for exponents larger than `k`. -/
@@ -379,13 +268,128 @@ theorem generalizedEigenspace_le_generalizedEigenspace_finrank [FiniteDimensiona
379268
ker_pow_le_ker_pow_finrank _ _
380269
#align module.End.generalized_eigenspace_le_generalized_eigenspace_finrank Module.End.generalizedEigenspace_le_generalizedEigenspace_finrank
381270

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+
382276
/-- Generalized eigenspaces for exponents at least `finrank K V` are equal to each other. -/
383277
theorem generalizedEigenspace_eq_generalizedEigenspace_finrank_of_le [FiniteDimensional K V]
384278
(f : End K V) (μ : K) {k : ℕ} (hk : finrank K V ≤ k) :
385279
f.generalizedEigenspace μ k = f.generalizedEigenspace μ (finrank K V) :=
386280
ker_pow_eq_ker_pow_finrank_of_le hk
387281
#align module.End.generalized_eigenspace_eq_generalized_eigenspace_finrank_of_le Module.End.generalizedEigenspace_eq_generalizedEigenspace_finrank_of_le
388282

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+
389393
/-- If `f` maps a subspace `p` into itself, then the generalized eigenspace of the restriction
390394
of `f` to `p` is the part of the generalized eigenspace of `f` that lies in `p`. -/
391395
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 :
400404
LinearMap.comp_assoc]
401405
#align module.End.generalized_eigenspace_restrict Module.End.generalizedEigenspace_restrict
402406

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+
403413
/-- If `p` is an invariant submodule of an endomorphism `f`, then the `μ`-eigenspace of the
404414
restriction of `f` to `p` is a submodule of the `μ`-eigenspace of `f`. -/
405415
theorem eigenspace_restrict_le_eigenspace (f : End R M) {p : Submodule R M} (hfp : ∀ x ∈ p, f x ∈ p)

Mathlib/LinearAlgebra/Eigenspace/Minpoly.lean

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,18 @@ theorem hasEigenvalue_iff_isRoot : f.HasEigenvalue μ ↔ (minpoly K f).IsRoot
9696
⟨isRoot_of_hasEigenvalue, hasEigenvalue_of_isRoot⟩
9797
#align module.End.has_eigenvalue_iff_is_root Module.End.hasEigenvalue_iff_isRoot
9898

99+
variable (f)
100+
101+
lemma finite_hasEigenvalue : Set.Finite f.HasEigenvalue := by
102+
have h : minpoly K f ≠ 0 := minpoly.ne_zero f.isIntegral
103+
convert (minpoly K f).rootSet_finite K
104+
ext μ
105+
change f.HasEigenvalue μ ↔ _
106+
rw [hasEigenvalue_iff_isRoot, mem_rootSet_of_ne h, IsRoot, coe_aeval_eq_eval]
107+
99108
/-- An endomorphism of a finite-dimensional vector space has finitely many eigenvalues. -/
100-
noncomputable instance (f : End K V) : Fintype f.Eigenvalues :=
101-
Set.Finite.fintype <| show {μ | eigenspace f μ ≠ ⊥}.Finite by
102-
have h : minpoly K f ≠ 0 := minpoly.ne_zero f.isIntegral
103-
convert (minpoly K f).rootSet_finite K
104-
ext μ
105-
-- Porting note: was the below, but this applied unwanted simp lemmas
106-
-- ```
107-
-- classical simp [Polynomial.rootSet_def, Polynomial.mem_roots h, ← hasEigenvalue_iff_isRoot,
108-
-- HasEigenvalue]
109-
-- ```
110-
rw [Set.mem_setOf_eq, ← HasEigenvalue, hasEigenvalue_iff_isRoot, mem_rootSet_of_ne h, IsRoot,
111-
coe_aeval_eq_eval]
109+
noncomputable instance : Fintype f.Eigenvalues :=
110+
Set.Finite.fintype f.finite_hasEigenvalue
112111

113112
end End
114113

0 commit comments

Comments
 (0)