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

Commit 47a5f81

Browse files
committed
feat(data/matrix/rank): rank of multiplication (#18784)
This adds a universe-polymorphic version of `rank_comp_le_right`, and then uses it to show `(A ⬝ B).rank ≤ B.rank`; previously we only had `(A ⬝ B).rank ≤ A.rank`. For convenience, this adds the spellings `(A ⬝ B).rank ≤ min A.rank B.rank` and `rank (f.comp g) ≤ min (rank f) (rank g)`, as these map well to the way that rank would be described in words.
1 parent 9a48a08 commit 47a5f81

2 files changed

Lines changed: 38 additions & 4 deletions

File tree

src/data/matrix/rank.lean

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace matrix
2929

3030
open finite_dimensional
3131

32-
variables {m n o R : Type*} [m_fin : fintype m] [fintype n] [fintype o]
32+
variables {l m n o R : Type*} [m_fin : fintype m] [fintype n] [fintype o]
3333
variables [decidable_eq n] [decidable_eq o] [comm_ring R]
3434

3535
/-- The rank of a matrix is the rank of its image. -/
@@ -52,19 +52,36 @@ lemma rank_le_width [strong_rank_condition R] {m n : ℕ} (A : matrix (fin m) (f
5252
A.rank ≤ n :=
5353
A.rank_le_card_width.trans $ (fintype.card_fin n).le
5454

55-
lemma rank_mul_le [strong_rank_condition R] (A : matrix m n R) (B : matrix n o R) :
55+
lemma rank_mul_le_left [strong_rank_condition R] (A : matrix m n R) (B : matrix n o R) :
5656
(A ⬝ B).rank ≤ A.rank :=
5757
begin
5858
rw [rank, rank, to_lin'_mul],
5959
exact cardinal.to_nat_le_of_le_of_lt_aleph_0
6060
(rank_lt_aleph_0 _ _) (linear_map.rank_comp_le_left _ _),
6161
end
6262

63+
include m_fin
64+
65+
lemma rank_mul_le_right [strong_rank_condition R] (A : matrix l m R) (B : matrix m n R) :
66+
(A ⬝ B).rank ≤ B.rank :=
67+
begin
68+
letI := classical.dec_eq m,
69+
rw [rank, rank, to_lin'_mul],
70+
exact finrank_le_finrank_of_rank_le_rank
71+
(linear_map.lift_rank_comp_le_right B.to_lin' A.to_lin') (rank_lt_aleph_0 _ _),
72+
end
73+
74+
omit m_fin
75+
76+
lemma rank_mul_le [strong_rank_condition R] (A : matrix m n R) (B : matrix n o R) :
77+
(A ⬝ B).rank ≤ min A.rank B.rank :=
78+
le_min (rank_mul_le_left _ _) (rank_mul_le_right _ _)
79+
6380
lemma rank_unit [strong_rank_condition R] (A : (matrix n n R)ˣ) :
6481
(A : matrix n n R).rank = fintype.card n :=
6582
begin
6683
refine le_antisymm (rank_le_card_width A) _,
67-
have := rank_mul_le (A : matrix n n R) (↑A⁻¹ : matrix n n R),
84+
have := rank_mul_le_left (A : matrix n n R) (↑A⁻¹ : matrix n n R),
6885
rwa [← mul_eq_mul, ← units.coe_mul, mul_inv_self, units.coe_one, rank_one] at this,
6986
end
7087

src/linear_algebra/dimension.lean

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1344,10 +1344,27 @@ begin
13441344
exact linear_map.map_le_range,
13451345
end
13461346

1347+
lemma lift_rank_comp_le_right (g : V →ₗ[K] V') (f : V' →ₗ[K] V'') :
1348+
cardinal.lift.{v'} (rank (f.comp g)) ≤ cardinal.lift.{v''} (rank g) :=
1349+
by rw [rank, rank, linear_map.range_comp]; exact lift_rank_map_le _ _
1350+
1351+
/-- The rank of the composition of two maps is less than the minimum of their ranks. -/
1352+
lemma lift_rank_comp_le (g : V →ₗ[K] V') (f : V' →ₗ[K] V'') :
1353+
cardinal.lift.{v'} (rank (f.comp g)) ≤
1354+
min (cardinal.lift.{v'} (rank f)) (cardinal.lift.{v''} (rank g)) :=
1355+
le_min (cardinal.lift_le.mpr $ rank_comp_le_left _ _) (lift_rank_comp_le_right _ _)
1356+
13471357
variables [add_comm_group V'₁] [module K V'₁]
13481358

13491359
lemma rank_comp_le_right (g : V →ₗ[K] V') (f : V' →ₗ[K] V'₁) : rank (f.comp g) ≤ rank g :=
1350-
by rw [rank, rank, linear_map.range_comp]; exact rank_map_le _ _
1360+
by simpa only [cardinal.lift_id] using lift_rank_comp_le_right g f
1361+
1362+
/-- The rank of the composition of two maps is less than the minimum of their ranks.
1363+
1364+
See `lift_rank_comp_le` for the universe-polymorphic version. -/
1365+
lemma rank_comp_le (g : V →ₗ[K] V') (f : V' →ₗ[K] V'₁) :
1366+
rank (f.comp g) ≤ min (rank f) (rank g) :=
1367+
by simpa only [cardinal.lift_id] using lift_rank_comp_le g f
13511368

13521369
end ring
13531370

0 commit comments

Comments
 (0)