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

Commit f5f879e

Browse files
adamtopazurkudVierkantor
committed
feat(linear_algebra/dimension): linear equiv iff eq dim (#5559)
See related zulip discussion https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there.20code.20for.20X.3F/topic/Classification.20of.20finite-dimensional.20vector.20spaces/near/221357275 Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
1 parent 9f6300e commit f5f879e

File tree

4 files changed

+95
-25
lines changed

4 files changed

+95
-25
lines changed

src/linear_algebra/basis.lean

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def module_equiv_finsupp (hv : is_basis R v) : M ≃ₗ[R] ι →₀ R :=
235235

236236
/-- Isomorphism between the two modules, given two modules `M` and `M'` with respective bases
237237
`v` and `v'` and a bijection between the indexing sets of the two bases. -/
238-
def equiv_of_is_basis {v : ι → M} {v' : ι' → M'} (hv : is_basis R v) (hv' : is_basis R v')
238+
def linear_equiv_of_is_basis {v : ι → M} {v' : ι' → M'} (hv : is_basis R v) (hv' : is_basis R v')
239239
(e : ι ≃ ι') : M ≃ₗ[R] M' :=
240240
{ inv_fun := hv'.constr (v ∘ e.symm),
241241
left_inv := have (hv'.constr (v ∘ e.symm)).comp (hv.constr (v' ∘ e)) = linear_map.id,
@@ -248,7 +248,7 @@ def equiv_of_is_basis {v : ι → M} {v' : ι' → M'} (hv : is_basis R v) (hv'
248248

249249
/-- Isomorphism between the two modules, given two modules `M` and `M'` with respective bases
250250
`v` and `v'` and a bijection between the two bases. -/
251-
def equiv_of_is_basis' {v : ι → M} {v' : ι' → M'} (f : M → M') (g : M' → M)
251+
def linear_equiv_of_is_basis' {v : ι → M} {v' : ι' → M'} (f : M → M') (g : M' → M)
252252
(hv : is_basis R v) (hv' : is_basis R v')
253253
(hf : ∀i, f (v i) ∈ range v') (hg : ∀i, g (v' i) ∈ range v)
254254
(hgf : ∀i, g (f (v i)) = v i) (hfg : ∀i, f (g (v' i)) = v' i) :
@@ -266,33 +266,33 @@ def equiv_of_is_basis' {v : ι → M} {v' : ι' → M'} (f : M → M') (g : M'
266266
λ y, congr_arg (λ h:M' →ₗ[R] M', h y) this,
267267
..hv.constr (f ∘ v) }
268268

269-
@[simp] lemma equiv_of_is_basis_comp {ι'' : Type*} {v : ι → M} {v' : ι' → M'} {v'' : ι'' → M''}
270-
(hv : is_basis R v) (hv' : is_basis R v') (hv'' : is_basis R v'')
269+
@[simp] lemma linear_equiv_of_is_basis_comp {ι'' : Type*} {v : ι → M} {v' : ι' → M'}
270+
{v'' : ι'' → M''} (hv : is_basis R v) (hv' : is_basis R v') (hv'' : is_basis R v'')
271271
(e : ι ≃ ι') (f : ι' ≃ ι'' ) :
272-
(equiv_of_is_basis hv hv' e).trans (equiv_of_is_basis hv' hv'' f) =
273-
equiv_of_is_basis hv hv'' (e.trans f) :=
272+
(linear_equiv_of_is_basis hv hv' e).trans (linear_equiv_of_is_basis hv' hv'' f) =
273+
linear_equiv_of_is_basis hv hv'' (e.trans f) :=
274274
begin
275275
apply linear_equiv.injective_to_linear_map,
276276
apply hv.ext,
277277
intros i,
278-
simp [equiv_of_is_basis]
278+
simp [linear_equiv_of_is_basis]
279279
end
280280

281-
@[simp] lemma equiv_of_is_basis_refl :
282-
equiv_of_is_basis hv hv (equiv.refl ι) = linear_equiv.refl R M :=
281+
@[simp] lemma linear_equiv_of_is_basis_refl :
282+
linear_equiv_of_is_basis hv hv (equiv.refl ι) = linear_equiv.refl R M :=
283283
begin
284284
apply linear_equiv.injective_to_linear_map,
285285
apply hv.ext,
286286
intros i,
287-
simp [equiv_of_is_basis]
287+
simp [linear_equiv_of_is_basis]
288288
end
289289

290-
lemma equiv_of_is_basis_trans_symm (e : ι ≃ ι') {v' : ι' → M'} (hv' : is_basis R v') :
291-
(equiv_of_is_basis hv hv' e).trans (equiv_of_is_basis hv' hv e.symm) = linear_equiv.refl R M :=
290+
lemma linear_equiv_of_is_basis_trans_symm (e : ι ≃ ι') {v' : ι' → M'} (hv' : is_basis R v') :
291+
(linear_equiv_of_is_basis hv hv' e).trans (linear_equiv_of_is_basis hv' hv e.symm) = linear_equiv.refl R M :=
292292
by simp
293293

294-
lemma equiv_of_is_basis_symm_trans (e : ι ≃ ι') {v' : ι' → M'} (hv' : is_basis R v') :
295-
(equiv_of_is_basis hv' hv e.symm).trans (equiv_of_is_basis hv hv' e) = linear_equiv.refl R M' :=
294+
lemma linear_equiv_of_is_basis_symm_trans (e : ι ≃ ι') {v' : ι' → M'} (hv' : is_basis R v') :
295+
(linear_equiv_of_is_basis hv' hv e.symm).trans (linear_equiv_of_is_basis hv hv' e) = linear_equiv.refl R M' :=
296296
by simp
297297

298298
lemma is_basis_inl_union_inr {v : ι → M} {v' : ι' → M'}

src/linear_algebra/dimension.lean

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,61 @@ hb.mk_eq_dim'' ▸ cardinal.card_le_of (λ s, @finset.card_map _ _ ⟨_, subtype
145145

146146
variables [add_comm_group V'] [vector_space K V']
147147

148+
/-- Two linearly equivalent vector spaces have the same dimension, a version with different
149+
universes. -/
150+
theorem linear_equiv.lift_dim_eq (f : V ≃ₗ[K] V') :
151+
cardinal.lift.{v v'} (dim K V) = cardinal.lift.{v' v} (dim K V') :=
152+
let ⟨b, hb⟩ := exists_is_basis K V in
153+
calc cardinal.lift.{v v'} (dim K V) = cardinal.lift.{v v'} (cardinal.mk b) :
154+
congr_arg _ hb.mk_eq_dim''.symm
155+
... = cardinal.lift.{v' v} (dim K V') : (f.is_basis hb).mk_eq_dim
156+
148157
/-- Two linearly equivalent vector spaces have the same dimension. -/
149158
theorem linear_equiv.dim_eq (f : V ≃ₗ[K] V₁) :
150159
dim K V = dim K V₁ :=
151-
by letI := classical.dec_eq V;
152-
letI := classical.dec_eq V₁; exact
153-
let ⟨b, hb⟩ := exists_is_basis K V in
154-
cardinal.lift_inj.1 $ hb.mk_eq_dim.symm.trans (f.is_basis hb).mk_eq_dim
160+
cardinal.lift_inj.1 f.lift_dim_eq
161+
162+
/-- Two vector spaces are isomorphic if they have the same dimension. -/
163+
theorem nonempty_linear_equiv_of_lift_dim_eq
164+
(cond : cardinal.lift.{v v'} (dim K V) = cardinal.lift.{v' v} (dim K V')) :
165+
nonempty (V ≃ₗ[K] V') :=
166+
begin
167+
obtain ⟨B, h⟩ := exists_is_basis K V,
168+
obtain ⟨B', h'⟩ := exists_is_basis K V',
169+
have : cardinal.lift.{v v'} (cardinal.mk B) = cardinal.lift.{v' v} (cardinal.mk B'),
170+
by rw [h.mk_eq_dim'', cond, h'.mk_eq_dim''],
171+
exact (cardinal.lift_mk_eq.{v v' 0}.1 this).map (linear_equiv_of_is_basis h h')
172+
end
173+
174+
/-- Two vector spaces are isomorphic if they have the same dimension. -/
175+
theorem nonempty_linear_equiv_of_dim_eq (cond : dim K V = dim K V₁) :
176+
nonempty (V ≃ₗ[K] V₁) :=
177+
nonempty_linear_equiv_of_lift_dim_eq $ congr_arg _ cond
178+
179+
section
180+
181+
variables (V V' V₁)
182+
183+
/-- Two vector spaces are isomorphic if they have the same dimension. -/
184+
def linear_equiv.of_lift_dim_eq
185+
(cond : cardinal.lift.{v v'} (dim K V) = cardinal.lift.{v' v} (dim K V')) :
186+
V ≃ₗ[K] V' :=
187+
classical.choice (nonempty_linear_equiv_of_lift_dim_eq cond)
188+
189+
/-- Two vector spaces are isomorphic if they have the same dimension. -/
190+
def linear_equiv.of_dim_eq (cond : dim K V = dim K V₁) : V ≃ₗ[K] V₁ :=
191+
classical.choice (nonempty_linear_equiv_of_dim_eq cond)
192+
193+
end
194+
195+
/-- Two vector spaces are isomorphic if and only if they have the same dimension. -/
196+
theorem linear_equiv.nonempty_equiv_iff_lift_dim_eq :
197+
nonempty (V ≃ₗ[K] V') ↔ cardinal.lift.{v v'} (dim K V) = cardinal.lift.{v' v} (dim K V') :=
198+
⟨λ ⟨h⟩, linear_equiv.lift_dim_eq h, λ h, nonempty_linear_equiv_of_lift_dim_eq h⟩
199+
200+
/-- Two vector spaces are isomorphic if and only if they have the same dimension. -/
201+
theorem linear_equiv.nonempty_equiv_iff_dim_eq : nonempty (V ≃ₗ[K] V₁) ↔ dim K V = dim K V₁ :=
202+
⟨λ ⟨h⟩, linear_equiv.dim_eq h, λ h, nonempty_linear_equiv_of_dim_eq h⟩
155203

156204
@[simp] lemma dim_bot : dim K (⊥ : submodule K V) = 0 :=
157205
by letI := classical.dec_eq V;

src/linear_algebra/finite_dimensional.lean

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -644,18 +644,40 @@ theorem findim_eq (f : V ≃ₗ[K] V₂) [finite_dimensional K V] :
644644
findim K V = findim K V₂ :=
645645
begin
646646
haveI : finite_dimensional K V₂ := f.finite_dimensional,
647-
rcases exists_is_basis_finite K V with ⟨s, s_basis, s_finite⟩,
648-
letI : fintype s := s_finite.fintype,
649-
have A : findim K V = fintype.card s := findim_eq_card_basis s_basis,
650-
have : is_basis K (λx:s, f (subtype.val x)) := f.is_basis s_basis,
651-
have B : findim K V₂ = fintype.card s := findim_eq_card_basis this,
652-
rw [A, B]
647+
simpa [← findim_eq_dim] using f.lift_dim_eq
653648
end
654649

655650
end linear_equiv
656651

657652
namespace finite_dimensional
658653

654+
/--
655+
Two finite-dimensional vector spaces are isomorphic if they have the same (finite) dimension.
656+
-/
657+
theorem nonempty_linear_equiv_of_findim_eq [finite_dimensional K V] [finite_dimensional K V₂]
658+
(cond : findim K V = findim K V₂) : nonempty (V ≃ₗ[K] V₂) :=
659+
nonempty_linear_equiv_of_lift_dim_eq $ by simp only [← findim_eq_dim, cond, lift_nat_cast]
660+
661+
/--
662+
Two finite-dimensional vector spaces are isomorphic if and only if they have the same (finite) dimension.
663+
-/
664+
theorem nonempty_linear_equiv_iff_findim_eq [finite_dimensional K V] [finite_dimensional K V₂] :
665+
nonempty (V ≃ₗ[K] V₂) ↔ findim K V = findim K V₂ :=
666+
⟨λ ⟨h⟩, h.findim_eq, λ h, nonempty_linear_equiv_of_findim_eq h⟩
667+
668+
section
669+
670+
variables (V V₂)
671+
672+
/--
673+
Two finite-dimensional vector spaces are isomorphic if they have the same (finite) dimension.
674+
-/
675+
noncomputable def linear_equiv.of_findim_eq [finite_dimensional K V] [finite_dimensional K V₂]
676+
(cond : findim K V = findim K V₂) : V ≃ₗ[K] V₂ :=
677+
classical.choice $ nonempty_linear_equiv_of_findim_eq cond
678+
679+
end
680+
659681
lemma eq_of_le_of_findim_le {S₁ S₂ : submodule K V} [finite_dimensional K S₂] (hle : S₁ ≤ S₂)
660682
(hd : findim K S₂ ≤ findim K S₁) : S₁ = S₂ :=
661683
begin

src/linear_algebra/matrix.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ lemma is_basis.iff_det {v : ι → M} : is_basis R v ↔ is_unit (he.det v) :=
451451
begin
452452
split,
453453
{ intro hv,
454-
suffices : is_unit (linear_map.to_matrix he he (equiv_of_is_basis he hv $ equiv.refl ι)).det,
454+
suffices : is_unit (linear_map.to_matrix he he (linear_equiv_of_is_basis he hv $ equiv.refl ι)).det,
455455
{ rw [is_basis.det_apply, is_basis.to_matrix_eq_to_matrix_constr],
456456
exact this },
457457
apply linear_equiv.is_unit_det },

0 commit comments

Comments
 (0)