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

Commit 463e753

Browse files
committed
feat(linear_algebra/finite_dimensional): generalisations to division_ring (#8822)
I generalise a few results about finite dimensional modules from fields to division rings. Mostly this is me trying out @alexjbest's `generalisation_linter`. (review: it works really well, and is very helpful for finding the right home for lemmas, but it is slow). Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
1 parent 9c886ff commit 463e753

File tree

5 files changed

+208
-181
lines changed

5 files changed

+208
-181
lines changed

src/analysis/normed_space/finite_dimension.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ begin
112112
{ left,
113113
have : finrank 𝕜 f.range = 1,
114114
{ refine le_antisymm _ (zero_lt_iff.mpr H),
115-
simpa [finrank_of_field] using f.range.finrank_le },
115+
simpa [finrank_self] using f.range.finrank_le },
116116
rw [this, add_comm, nat.add_one] at Z,
117117
exact nat.succ.inj Z } },
118118
have : is_closed (f.ker : set E),

src/field_theory/finite/polynomial.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ calc module.rank K (R σ K) =
159159
linear_equiv.dim_eq
160160
(finsupp.supported_equiv_finsupp {s : σ →₀ ℕ | ∀n:σ, s n ≤ fintype.card K - 1 })
161161
... = cardinal.mk {s : σ →₀ ℕ | ∀ (n : σ), s n ≤ fintype.card K - 1} :
162-
by rw [finsupp.dim_eq, dim_of_ring, mul_one]
162+
by rw [finsupp.dim_eq, dim_self, mul_one]
163163
... = cardinal.mk {s : σ → ℕ | ∀ (n : σ), s n < fintype.card K } :
164164
begin
165165
refine quotient.sound ⟨equiv.subtype_equiv finsupp.equiv_fun_on_fintype $ assume f, _⟩,

src/linear_algebra/dimension.lean

Lines changed: 74 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ begin
227227
apply dim_range_le,
228228
end
229229

230+
theorem dim_quotient_le (p : submodule R M) :
231+
module.rank R p.quotient ≤ module.rank R M :=
232+
(mkq p).dim_le_of_surjective (surjective_quot_mk _)
233+
230234
variables [nontrivial R]
231235

232236
lemma {m} cardinal_lift_le_dim_of_linear_independent
@@ -717,6 +721,13 @@ theorem basis.mk_range_eq_dim (v : basis ι R M) :
717721
cardinal.mk (range v) = module.rank R M :=
718722
v.reindex_range.mk_eq_dim''
719723

724+
/-- If a vector space has a finite basis, then its dimension (seen as a cardinal) is equal to the
725+
cardinality of the basis. -/
726+
lemma dim_eq_card_basis {ι : Type w} [fintype ι] (h : basis ι R M) :
727+
module.rank R M = fintype.card ι :=
728+
by rw [←h.mk_range_eq_dim, cardinal.fintype_card,
729+
set.card_range_of_injective h.injective]
730+
720731
theorem basis.mk_eq_dim (v : basis ι R M) :
721732
cardinal.lift.{w v} (cardinal.mk ι) = cardinal.lift.{v w} (module.rank R M) :=
722733
by rw [←v.mk_range_eq_dim, cardinal.mk_range_eq_of_injective v.injective]
@@ -757,7 +768,7 @@ by { rw [← @set_of_mem_eq _ s, ← subtype.range_coe_subtype], exact dim_span
757768

758769
variables (R)
759770

760-
lemma dim_of_ring : module.rank R R = 1 :=
771+
lemma dim_self : module.rank R R = 1 :=
761772
by rw [←cardinal.lift_inj, ← (basis.singleton punit R).mk_eq_dim, cardinal.mk_punit]
762773

763774
end strong_rank_condition
@@ -852,6 +863,68 @@ begin
852863
⟨equiv.ulift.trans (equiv.sum_congr equiv.ulift equiv.ulift).symm ⟩),
853864
end
854865

866+
-- TODO the remainder of this section should generalize beyond division rings.
867+
868+
lemma dim_zero_iff_forall_zero : module.rank K V = 0 ↔ ∀ x : V, x = 0 :=
869+
begin
870+
split,
871+
{ intros h x,
872+
have card_mk_range := (basis.of_vector_space K V).mk_range_eq_dim,
873+
rw [h, cardinal.mk_emptyc_iff, coe_of_vector_space, subtype.range_coe] at card_mk_range,
874+
simpa [card_mk_range] using (of_vector_space K V).mem_span x },
875+
{ intro h,
876+
have : (⊤ : submodule K V) = ⊥,
877+
{ ext x, simp [h x] },
878+
rw [←dim_top, this, dim_bot] }
879+
end
880+
881+
lemma dim_zero_iff : module.rank K V = 0 ↔ subsingleton V :=
882+
dim_zero_iff_forall_zero.trans (subsingleton_iff_forall_eq 0).symm
883+
884+
lemma dim_pos_iff_exists_ne_zero : 0 < module.rank K V ↔ ∃ x : V, x ≠ 0 :=
885+
begin
886+
rw ←not_iff_not,
887+
simpa using dim_zero_iff_forall_zero
888+
end
889+
890+
lemma dim_pos_iff_nontrivial : 0 < module.rank K V ↔ nontrivial V :=
891+
dim_pos_iff_exists_ne_zero.trans (nontrivial_iff_exists_ne 0).symm
892+
893+
lemma dim_pos [h : nontrivial V] : 0 < module.rank K V :=
894+
dim_pos_iff_nontrivial.2 h
895+
896+
897+
section fintype
898+
variable [fintype η]
899+
variables [∀i, add_comm_group (φ i)] [∀i, module K (φ i)]
900+
901+
open linear_map
902+
903+
lemma dim_pi : module.rank K (Πi, φ i) = cardinal.sum (λi, module.rank K (φ i)) :=
904+
begin
905+
let b := assume i, basis.of_vector_space K (φ i),
906+
let this : basis (Σ j, _) K (Π j, φ j) := pi.basis b,
907+
rw [←cardinal.lift_inj, ← this.mk_eq_dim],
908+
simp [λ i, (b i).mk_range_eq_dim.symm, cardinal.sum_mk]
909+
end
910+
911+
lemma dim_fun {V η : Type u} [fintype η] [add_comm_group V] [module K V] :
912+
module.rank K (η → V) = fintype.card η * module.rank K V :=
913+
by rw [dim_pi, cardinal.sum_const, cardinal.fintype_card]
914+
915+
lemma dim_fun_eq_lift_mul :
916+
module.rank K (η → V) = (fintype.card η : cardinal.{max u₁' v}) *
917+
cardinal.lift.{v u₁'} (module.rank K V) :=
918+
by rw [dim_pi, cardinal.sum_const_eq_lift_mul, cardinal.fintype_card, cardinal.lift_nat_cast]
919+
920+
lemma dim_fun' : module.rank K (η → K) = fintype.card η :=
921+
by rw [dim_fun_eq_lift_mul, dim_self, cardinal.lift_one, mul_one, cardinal.nat_cast_inj]
922+
923+
lemma dim_fin_fun (n : ℕ) : module.rank K (fin n → K) = n :=
924+
by simp [dim_fun']
925+
926+
end fintype
927+
855928
end division_ring
856929

857930
section field
@@ -863,10 +936,6 @@ theorem dim_quotient_add_dim (p : submodule K V) :
863936
module.rank K p.quotient + module.rank K p = module.rank K V :=
864937
by classical; exact let ⟨f⟩ := quotient_prod_linear_equiv p in dim_prod.symm.trans f.dim_eq
865938

866-
theorem dim_quotient_le (p : submodule K V) :
867-
module.rank K p.quotient ≤ module.rank K V :=
868-
by { rw ← dim_quotient_add_dim p, exact self_le_add_right _ _ }
869-
870939
/-- rank-nullity theorem -/
871940
theorem dim_range_add_dim_ker (f : V →ₗ[K] V₁) :
872941
module.rank K f.range + module.rank K f.ker = module.rank K V :=
@@ -944,37 +1013,6 @@ by { rw [← dim_sup_add_dim_inf_eq], exact self_le_add_right _ _ }
9441013

9451014
end
9461015

947-
section fintype
948-
variable [fintype η]
949-
variables [∀i, add_comm_group (φ i)] [∀i, module K (φ i)]
950-
951-
open linear_map
952-
953-
lemma dim_pi : module.rank K (Πi, φ i) = cardinal.sum (λi, module.rank K (φ i)) :=
954-
begin
955-
let b := assume i, basis.of_vector_space K (φ i),
956-
let this : basis (Σ j, _) K (Π j, φ j) := pi.basis b,
957-
rw [←cardinal.lift_inj, ← this.mk_eq_dim],
958-
simp [λ i, (b i).mk_range_eq_dim.symm, cardinal.sum_mk]
959-
end
960-
961-
lemma dim_fun {V η : Type u} [fintype η] [add_comm_group V] [module K V] :
962-
module.rank K (η → V) = fintype.card η * module.rank K V :=
963-
by rw [dim_pi, cardinal.sum_const, cardinal.fintype_card]
964-
965-
lemma dim_fun_eq_lift_mul :
966-
module.rank K (η → V) = (fintype.card η : cardinal.{max u₁' v}) *
967-
cardinal.lift.{v u₁'} (module.rank K V) :=
968-
by rw [dim_pi, cardinal.sum_const_eq_lift_mul, cardinal.fintype_card, cardinal.lift_nat_cast]
969-
970-
lemma dim_fun' : module.rank K (η → K) = fintype.card η :=
971-
by rw [dim_fun_eq_lift_mul, dim_of_ring, cardinal.lift_one, mul_one, cardinal.nat_cast_inj]
972-
973-
lemma dim_fin_fun (n : ℕ) : module.rank K (fin n → K) = n :=
974-
by simp [dim_fun']
975-
976-
end fintype
977-
9781016
lemma exists_mem_ne_zero_of_ne_bot {s : submodule K V} (h : s ≠ ⊥) : ∃ b : V, b ∈ s ∧ b ≠ 0 :=
9791017
begin
9801018
classical,
@@ -1035,21 +1073,6 @@ end rank
10351073

10361074
-- TODO The remainder of this file could be generalized to arbitrary rings.
10371075

1038-
lemma dim_zero_iff_forall_zero : module.rank K V = 0 ↔ ∀ x : V, x = 0 :=
1039-
begin
1040-
split,
1041-
{ intros h x,
1042-
have card_mk_range := (basis.of_vector_space K V).mk_range_eq_dim,
1043-
rw [h, cardinal.mk_emptyc_iff, coe_of_vector_space, subtype.range_coe] at card_mk_range,
1044-
simpa [card_mk_range] using (of_vector_space K V).mem_span x },
1045-
{ intro h,
1046-
have : (⊤ : submodule K V) = ⊥,
1047-
{ ext x, simp [h x] },
1048-
rw [←dim_top, this, dim_bot] }
1049-
end
1050-
1051-
lemma dim_zero_iff : module.rank K V = 0 ↔ subsingleton V :=
1052-
dim_zero_iff_forall_zero.trans (subsingleton_iff_forall_eq 0).symm
10531076

10541077
/-- The `ι` indexed basis on `V`, where `ι` is an empty type and `V` is zero-dimensional.
10551078
@@ -1067,19 +1090,6 @@ end
10671090
basis.of_dim_eq_zero hV i = 0 :=
10681091
rfl
10691092

1070-
1071-
lemma dim_pos_iff_exists_ne_zero : 0 < module.rank K V ↔ ∃ x : V, x ≠ 0 :=
1072-
begin
1073-
rw ←not_iff_not,
1074-
simpa using dim_zero_iff_forall_zero
1075-
end
1076-
1077-
lemma dim_pos_iff_nontrivial : 0 < module.rank K V ↔ nontrivial V :=
1078-
dim_pos_iff_exists_ne_zero.trans (nontrivial_iff_exists_ne 0).symm
1079-
1080-
lemma dim_pos [h : nontrivial V] : 0 < module.rank K V :=
1081-
dim_pos_iff_nontrivial.2 h
1082-
10831093
lemma le_dim_iff_exists_linear_independent {c : cardinal} :
10841094
c ≤ module.rank K V ↔ ∃ s : set V, cardinal.mk s = c ∧ linear_independent K (coe : s → V) :=
10851095
begin

0 commit comments

Comments
 (0)