@@ -20,7 +20,6 @@ This definition does not depend on the choice of basis, see `matrix.rank_eq_finr
20
20
## TODO
21
21
22
22
* Show that `matrix.rank` is equal to the row-rank and column-rank
23
- * Generalize away from fields
24
23
25
24
-/
26
25
@@ -30,77 +29,88 @@ namespace matrix
30
29
31
30
open finite_dimensional
32
31
33
- variables {m n o K : Type *} [m_fin : fintype m] [fintype n] [fintype o]
34
- variables [decidable_eq n] [decidable_eq o] [field K]
35
- variables (A : matrix m n K)
32
+ variables {m n o R : Type *} [m_fin : fintype m] [fintype n] [fintype o]
33
+ variables [decidable_eq n] [decidable_eq o] [comm_ring R]
36
34
37
35
/-- The rank of a matrix is the rank of its image. -/
38
- noncomputable def rank : ℕ := finrank K A.to_lin'.range
36
+ noncomputable def rank (A : matrix m n R) : ℕ := finrank R A.to_lin'.range
39
37
40
- @[simp] lemma rank_one : rank (1 : matrix n n K ) = fintype.card n :=
38
+ @[simp] lemma rank_one [strong_rank_condition R] : rank (1 : matrix n n R ) = fintype.card n :=
41
39
by rw [rank, to_lin'_one, linear_map.range_id, finrank_top, finrank_pi]
42
40
43
- @[simp] lemma rank_zero : rank (0 : matrix n n K ) = 0 :=
41
+ @[simp] lemma rank_zero [nontrivial R] : rank (0 : matrix m n R ) = 0 :=
44
42
by rw [rank, linear_equiv.map_zero, linear_map.range_zero, finrank_bot]
45
43
46
- lemma rank_le_card_width : A.rank ≤ fintype.card n :=
44
+ lemma rank_le_card_width [strong_rank_condition R] (A : matrix m n R) : A.rank ≤ fintype.card n :=
47
45
begin
48
- convert le_of_add_le_left (A.to_lin'.finrank_range_add_finrank_ker).le,
49
- exact (finrank_pi K).symm,
46
+ haveI : module.finite R (n → R) := module.finite.pi,
47
+ haveI : module.free R (n → R) := module.free.pi _ _,
48
+ exact A.to_lin'.finrank_range_le.trans_eq (finrank_pi _)
50
49
end
51
50
52
- lemma rank_le_width {m n : ℕ} (A : matrix (fin m) (fin n) K) : A.rank ≤ n :=
51
+ lemma rank_le_width [strong_rank_condition R] {m n : ℕ} (A : matrix (fin m) (fin n) R) :
52
+ A.rank ≤ n :=
53
53
A.rank_le_card_width.trans $ (fintype.card_fin n).le
54
54
55
- lemma rank_mul_le (B : matrix n o K) : (A ⬝ B).rank ≤ A.rank :=
55
+ lemma rank_mul_le [strong_rank_condition R] (A : matrix m n R) (B : matrix n o R) :
56
+ (A ⬝ B).rank ≤ A.rank :=
56
57
begin
57
- refine linear_map.finrank_le_finrank_of_injective (submodule.of_le_injective _),
58
- rw [to_lin'_mul],
59
- exact linear_map.range_comp_le_range _ _,
58
+ rw [rank, rank, to_lin'_mul],
59
+ refine cardinal.to_nat_le_of_le_of_lt_aleph_0 _ (linear_map.rank_comp_le1 _ _),
60
+ rw [←cardinal.lift_lt_aleph_0],
61
+ have := lift_rank_range_le A.to_lin',
62
+ rw [rank_fun', cardinal.lift_nat_cast] at this ,
63
+ exact this.trans_lt (cardinal.nat_lt_aleph_0 (fintype.card n)),
60
64
end
61
65
62
- lemma rank_unit (A : (matrix n n K )ˣ) :
63
- (A : matrix n n K ).rank = fintype.card n :=
66
+ lemma rank_unit [strong_rank_condition R] (A : (matrix n n R )ˣ) :
67
+ (A : matrix n n R ).rank = fintype.card n :=
64
68
begin
65
69
refine le_antisymm (rank_le_card_width A) _,
66
- have := rank_mul_le (A : matrix n n K ) (↑A⁻¹ : matrix n n K ),
70
+ have := rank_mul_le (A : matrix n n R ) (↑A⁻¹ : matrix n n R ),
67
71
rwa [← mul_eq_mul, ← units.coe_mul, mul_inv_self, units.coe_one, rank_one] at this ,
68
72
end
69
73
70
- lemma rank_of_is_unit (A : matrix n n K ) (h : is_unit A) :
74
+ lemma rank_of_is_unit [strong_rank_condition R] (A : matrix n n R ) (h : is_unit A) :
71
75
A.rank = fintype.card n :=
72
76
by { obtain ⟨A, rfl⟩ := h, exact rank_unit A }
73
77
74
78
include m_fin
75
79
76
80
lemma rank_eq_finrank_range_to_lin
77
81
{M₁ M₂ : Type *} [add_comm_group M₁] [add_comm_group M₂]
78
- [module K M₁] [module K M₂] (v₁ : basis m K M₁) (v₂ : basis n K M₂) :
79
- A.rank = finrank K (to_lin v₂ v₁ A).range :=
82
+ [module R M₁] [module R M₂] (A : matrix m n R) ( v₁ : basis m R M₁) (v₂ : basis n R M₂) :
83
+ A.rank = finrank R (to_lin v₂ v₁ A).range :=
80
84
begin
81
- let e₁ := (pi.basis_fun K m).equiv v₁ (equiv.refl _),
82
- let e₂ := (pi.basis_fun K n).equiv v₂ (equiv.refl _),
83
- have range_e₂ : (e₂ : (n → K ) →ₗ[K ] M₂).range = ⊤,
85
+ let e₁ := (pi.basis_fun R m).equiv v₁ (equiv.refl _),
86
+ let e₂ := (pi.basis_fun R n).equiv v₂ (equiv.refl _),
87
+ have range_e₂ : (e₂ : (n → R ) →ₗ[R ] M₂).range = ⊤,
84
88
{ rw linear_map.range_eq_top, exact e₂.surjective },
85
89
refine linear_equiv.finrank_eq (e₁.of_submodules _ _ _),
86
90
rw [← linear_map.range_comp, ← linear_map.range_comp_of_range_eq_top (to_lin v₂ v₁ A) range_e₂],
87
91
congr' 1 ,
88
92
apply linear_map.pi_ext', rintro i, apply linear_map.ext_ring,
89
- have aux₁ := to_lin_self (pi.basis_fun K n) (pi.basis_fun K m) A i,
90
- have aux₂ := basis.equiv_apply (pi.basis_fun K n) i v₂,
93
+ have aux₁ := to_lin_self (pi.basis_fun R n) (pi.basis_fun R m) A i,
94
+ have aux₂ := basis.equiv_apply (pi.basis_fun R n) i v₂,
91
95
rw [to_lin_eq_to_lin'] at aux₁,
92
96
rw [pi.basis_fun_apply, linear_map.coe_std_basis] at aux₁ aux₂,
93
97
simp only [linear_map.comp_apply, e₁, e₂, linear_equiv.coe_coe, equiv.refl_apply, aux₁, aux₂,
94
98
linear_map.coe_single, to_lin_self, linear_equiv.map_sum, linear_equiv.map_smul,
95
99
basis.equiv_apply],
96
100
end
97
101
98
- lemma rank_le_card_height : A.rank ≤ fintype.card m :=
99
- (submodule.finrank_le _).trans (finrank_pi K).le
102
+ lemma rank_le_card_height [strong_rank_condition R] (A : matrix m n R) :
103
+ A.rank ≤ fintype.card m :=
104
+ begin
105
+ haveI : module.finite R (m → R) := module.finite.pi,
106
+ haveI : module.free R (m → R) := module.free.pi _ _,
107
+ exact (submodule.finrank_le _).trans (finrank_pi R).le
108
+ end
100
109
101
110
omit m_fin
102
111
103
- lemma rank_le_height {m n : ℕ} (A : matrix (fin m) (fin n) K) : A.rank ≤ m :=
112
+ lemma rank_le_height [strong_rank_condition R] {m n : ℕ} (A : matrix (fin m) (fin n) R) :
113
+ A.rank ≤ m :=
104
114
A.rank_le_card_height.trans $ (fintype.card_fin m).le
105
115
106
116
end matrix
0 commit comments