Skip to content

Commit c7a68e3

Browse files
committed
generalize a bit more
1 parent 07934c3 commit c7a68e3

1 file changed

Lines changed: 42 additions & 47 deletions

File tree

Mathlib/LinearAlgebra/Matrix/Rank.lean

Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -114,89 +114,85 @@ end Infinite
114114

115115
variable [Fintype n] [Fintype o]
116116

117-
section CommRing
118-
119-
variable [CommSemiring R]
120-
121117
/-- The rank of a matrix is the rank of its image. -/
122-
noncomputable def rank (A : Matrix m n R) : ℕ :=
118+
noncomputable def rank [CommSemiring R] (A : Matrix m n R) : ℕ :=
123119
finrank R <| LinearMap.range A.mulVecLin
124120

125121
@[simp]
126-
theorem rank_subsingleton [Subsingleton R] (A : Matrix m n R) : A.rank = 1 :=
122+
theorem rank_subsingleton [CommSemiring R] [Subsingleton R] (A : Matrix m n R) : A.rank = 1 :=
127123
finrank_subsingleton
128124

129125
@[simp]
130-
theorem cRank_one [Nontrivial R] [DecidableEq m] [StrongRankCondition R] :
126+
theorem cRank_one [Semiring R] [Nontrivial R] [DecidableEq m] [StrongRankCondition R] :
131127
(cRank (1 : Matrix m m R)) = lift.{uR} #m := by
132128
have h : LinearIndependent R (1 : Matrix m m R)ᵀ := by
133129
convert Pi.linearIndependent_single_one m R
134130
simp [funext_iff, Matrix.one_eq_pi_single]
135131
rw [cRank, rank_span h, ← lift_umax, ← Cardinal.mk_range_eq_of_injective h.injective, lift_id']
136132

137-
@[simp] theorem eRank_one [Nontrivial R] [DecidableEq m] [StrongRankCondition R] :
133+
@[simp] theorem eRank_one [Semiring R] [Nontrivial R] [DecidableEq m] [StrongRankCondition R] :
138134
(eRank (1 : Matrix m m R)) = ENat.card m := by
139135
rw [eRank, cRank_one, toENat_lift, ENat.card]
140136

141137
@[simp]
142-
theorem rank_one [Nontrivial R] [DecidableEq n] [StrongRankCondition R] :
138+
theorem rank_one [CommSemiring R] [DecidableEq n] [StrongRankCondition R] :
143139
rank (1 : Matrix n n R) = Fintype.card n := by
144140
rw [rank, mulVecLin_one, LinearMap.range_id, finrank_top, finrank_pi]
145141

146142
@[simp]
147-
theorem rank_zero [Nontrivial R] : rank (0 : Matrix m n R) = 0 := by
143+
theorem rank_zero [CommSemiring R] [Nontrivial R] : rank (0 : Matrix m n R) = 0 := by
148144
rw [rank, mulVecLin_zero, LinearMap.range_zero, finrank_bot]
149145

150146
set_option backward.isDefEq.respectTransparency false in
151147
@[simp]
152-
theorem cRank_zero {m n : Type*} [Nontrivial R] : cRank (0 : Matrix m n R) = 0 := by
148+
theorem cRank_zero {m n : Type*} [Semiring R] [Nontrivial R] : cRank (0 : Matrix m n R) = 0 := by
153149
obtain hn | hn := isEmpty_or_nonempty n
154150
· rw [cRank, range_eq_empty, span_empty, rank_bot]
155151
rw [cRank, transpose_zero, range_zero, span_zero_singleton, rank_bot]
156152

157153
@[simp]
158-
theorem eRank_zero {m n : Type*} [Nontrivial R] : eRank (0 : Matrix m n R) = 0 := by
154+
theorem eRank_zero {m n : Type*} [Semiring R] [Nontrivial R] : eRank (0 : Matrix m n R) = 0 := by
159155
simp [eRank]
160156

161-
theorem rank_le_card_width [Nontrivial R] (A : Matrix m n R) [StrongRankCondition R] :
157+
theorem rank_le_card_width [CommSemiring R] [StrongRankCondition R] (A : Matrix m n R) :
162158
A.rank ≤ Fintype.card n :=
163159
A.mulVecLin.finrank_range_le.trans_eq <| finrank_pi R
164160

165-
theorem rank_le_width [Nontrivial R] [StrongRankCondition R] {m n : ℕ}
161+
theorem rank_le_width [CommSemiring R] [StrongRankCondition R] {m n : ℕ}
166162
(A : Matrix (Fin m) (Fin n) R) : A.rank ≤ n :=
167163
A.rank_le_card_width.trans <| (Fintype.card_fin n).le
168164

169-
theorem rank_mul_le_left {R} [CommSemiring R] [StrongRankCondition R] (A : Matrix m n R)
165+
theorem rank_mul_le_left [CommSemiring R] [StrongRankCondition R] (A : Matrix m n R)
170166
(B : Matrix n o R) : (A * B).rank ≤ A.rank := by
171167
nontriviality R
172168
rw [rank, rank, mulVecLin_mul]
173169
exact Cardinal.toNat_le_toNat (LinearMap.rank_comp_le_left ..) (rank_lt_aleph0 R _)
174170

175-
theorem rank_mul_le_right [StrongRankCondition R] (A : Matrix m n R) (B : Matrix n o R) :
176-
(A * B).rank ≤ B.rank := by
171+
theorem rank_mul_le_right [CommSemiring R] [StrongRankCondition R] (A : Matrix m n R)
172+
(B : Matrix n o R) : (A * B).rank ≤ B.rank := by
177173
nontriviality R
178174
rw [rank, rank, mulVecLin_mul]
179175
exact finrank_le_finrank_of_rank_le_rank (LinearMap.lift_rank_comp_le_right _ _)
180176
(rank_lt_aleph0 _ _)
181177

182-
theorem rank_mul_le [StrongRankCondition R] (A : Matrix m n R) (B : Matrix n o R) :
178+
theorem rank_mul_le [CommSemiring R] [StrongRankCondition R] (A : Matrix m n R) (B : Matrix n o R) :
183179
(A * B).rank ≤ min A.rank B.rank :=
184180
le_min (rank_mul_le_left _ _) (rank_mul_le_right _ _)
185181

186-
theorem rank_vecMulVec_le [StrongRankCondition R] (w : m → R) (v : n → R) :
182+
theorem rank_vecMulVec_le [CommSemiring R] [StrongRankCondition R] (w : m → R) (v : n → R) :
187183
(Matrix.vecMulVec w v).rank ≤ 1 := by
188184
rw [Matrix.vecMulVec_eq Unit]
189185
refine le_trans (rank_mul_le_left _ _) ?_
190186
nontriviality R
191187
exact rank_le_card_width _
192188

193-
theorem rank_unit [Nontrivial R] [DecidableEq n] [StrongRankCondition R] (A : (Matrix n n R)ˣ) :
189+
theorem rank_unit [DecidableEq n] [CommSemiring R] [StrongRankCondition R] (A : (Matrix n n R)ˣ) :
194190
(A : Matrix n n R).rank = Fintype.card n := by
195191
apply le_antisymm (rank_le_card_width (A : Matrix n n R)) _
196192
have := rank_mul_le_left (A : Matrix n n R) (↑A⁻¹ : Matrix n n R)
197193
rwa [← Units.val_mul, mul_inv_cancel, Units.val_one, rank_one] at this
198194

199-
theorem rank_of_isUnit [Nontrivial R] [DecidableEq n] [StrongRankCondition R] (A : Matrix n n R)
195+
theorem rank_of_isUnit [DecidableEq n] [CommSemiring R] [StrongRankCondition R] (A : Matrix n n R)
200196
(h : IsUnit A) : A.rank = Fintype.card n := by
201197
obtain ⟨A, rfl⟩ := h
202198
exact rank_unit A
@@ -222,8 +218,8 @@ lemma rank_mul_eq_right_of_isUnit_det {R : Type*} [CommRing R] [Fintype m] [Deci
222218
rw [rank, rank, hAB, LinearMap.range_comp, LinearEquiv.finrank_map_eq]
223219

224220
/-- Taking a subset of the rows and columns reduces the rank. -/
225-
theorem rank_submatrix_le [StrongRankCondition R] [Fintype n₀] (A : Matrix m n R) (r : m₀ → m)
226-
(c : n₀ → n) : (A.submatrix r c).rank ≤ A.rank := by
221+
theorem rank_submatrix_le [CommSemiring R] [StrongRankCondition R] [Fintype n₀] (A : Matrix m n R)
222+
(r : m₀ → m) (c : n₀ → n) : (A.submatrix r c).rank ≤ A.rank := by
227223
nontriviality R
228224
have := Module.Finite.span_of_finite R (Set.finite_range (A.submatrix r id).col)
229225
calc
@@ -241,49 +237,50 @@ theorem rank_submatrix_le [StrongRankCondition R] [Fintype n₀] (A : Matrix m n
241237
(Equiv.refl n).symm from rfl, LinearEquiv.range, Submodule.map_top]
242238
exact Submodule.finrank_map_le _ _
243239

244-
theorem rank_reindex [Fintype n₀] (em : m ≃ m₀) (en : n ≃ n₀) (A : Matrix m n R) :
240+
theorem rank_reindex [Fintype n₀] [CommSemiring R] (em : m ≃ m₀) (en : n ≃ n₀) (A : Matrix m n R) :
245241
rank (A.reindex em en) = rank A := by
246242
rw [rank, rank, mulVecLin_reindex, LinearMap.range_comp, LinearMap.range_comp,
247243
LinearEquiv.range, Submodule.map_top, LinearEquiv.finrank_map_eq]
248244

249245
@[simp]
250-
theorem rank_submatrix [Fintype n₀] (A : Matrix m n R) (em : m₀ ≃ m) (en : n₀ ≃ n) :
251-
rank (A.submatrix em en) = rank A := by
246+
theorem rank_submatrix [Fintype n₀] [CommSemiring R] (A : Matrix m n R) (em : m₀ ≃ m)
247+
(en : n₀ ≃ n) : rank (A.submatrix em en) = rank A := by
252248
simpa only [reindex_apply] using rank_reindex em.symm en.symm A
253249

254250
@[simp]
255-
theorem lift_cRank_submatrix {n : Type un} (A : Matrix m n R) (em : m₀ ≃ m) (en : n₀ ≃ n) :
256-
lift.{um} (cRank (A.submatrix em en)) = lift.{um₀} (cRank A) :=
251+
theorem lift_cRank_submatrix {n : Type un} [Semiring R] (A : Matrix m n R) (em : m₀ ≃ m)
252+
(en : n₀ ≃ n) : lift.{um} (cRank (A.submatrix em en)) = lift.{um₀} (cRank A) :=
257253
(A.lift_cRank_submatrix_le em en).antisymm
258254
<| by simpa using ((A.reindex em.symm en.symm).lift_cRank_submatrix_le em.symm en.symm)
259255

260256
/-- A special case of `lift_cRank_submatrix` for when the row types are in the same universe. -/
261257
@[simp]
262-
theorem cRank_submatrix {m₀ : Type um} {n : Type un} (A : Matrix m n R) (em : m₀ ≃ m)
258+
theorem cRank_submatrix {m₀ : Type um} {n : Type un} [Semiring R] (A : Matrix m n R) (em : m₀ ≃ m)
263259
(en : n₀ ≃ n) : cRank (A.submatrix em en) = cRank A := by
264260
simpa [-lift_cRank_submatrix] using A.lift_cRank_submatrix em en
265261

266-
theorem lift_cRank_reindex {n : Type un} (A : Matrix m n R) (em : m ≃ m₀) (en : n ≃ n₀) :
267-
lift.{um} (cRank (A.reindex em en)) = lift.{um₀} (cRank A) :=
262+
theorem lift_cRank_reindex {n : Type un} [Semiring R] (A : Matrix m n R) (em : m ≃ m₀)
263+
(en : n ≃ n₀) : lift.{um} (cRank (A.reindex em en)) = lift.{um₀} (cRank A) :=
268264
lift_cRank_submatrix ..
269265

270266
/-- A special case of `lift_cRank_reindex` for when the row types are in the same universe. -/
271-
theorem cRank_reindex {m₀ : Type um} {n : Type un} (A : Matrix m n R) (em : m ≃ m₀) (en : n ≃ n₀) :
272-
cRank (A.reindex em en) = cRank A :=
267+
theorem cRank_reindex {m₀ : Type um} {n : Type un} [Semiring R] (A : Matrix m n R) (em : m ≃ m₀)
268+
(en : n ≃ n₀) : cRank (A.reindex em en) = cRank A :=
273269
cRank_submatrix ..
274270

275271
@[simp]
276-
theorem eRank_submatrix {n : Type un} (A : Matrix m n R) (em : m₀ ≃ m) (en : n₀ ≃ n) :
272+
theorem eRank_submatrix {n : Type un} [Semiring R] (A : Matrix m n R) (em : m₀ ≃ m) (en : n₀ ≃ n) :
277273
eRank (A.submatrix em en) = eRank A := by
278274
simpa [-lift_cRank_submatrix] using congr_arg Cardinal.toENat <| A.lift_cRank_submatrix em en
279275

280-
theorem eRank_reindex {m₀ : Type um} {n : Type un} (A : Matrix m n R) (em : m ≃ m₀) (en : n ≃ n₀) :
281-
eRank (A.reindex em en) = eRank A :=
276+
theorem eRank_reindex {m₀ : Type um} {n : Type un} [Semiring R] (A : Matrix m n R) (em : m ≃ m₀)
277+
(en : n ≃ n₀) : eRank (A.reindex em en) = eRank A :=
282278
eRank_submatrix ..
283279

284-
theorem rank_eq_finrank_range_toLin [Finite m] [DecidableEq n] {M₁ M₂ : Type*} [AddCommMonoid M₁]
285-
[AddCommMonoid M₂] [Module R M₁] [Module R M₂] (A : Matrix m n R) (v₁ : Basis m R M₁)
286-
(v₂ : Basis n R M₂) : A.rank = finrank R (LinearMap.range (toLin v₂ v₁ A)) := by
280+
theorem rank_eq_finrank_range_toLin [Finite m] [DecidableEq n] {M₁ M₂ : Type*} [CommSemiring R]
281+
[AddCommMonoid M₁] [AddCommMonoid M₂] [Module R M₁] [Module R M₂] (A : Matrix m n R)
282+
(v₁ : Basis m R M₁) (v₂ : Basis n R M₂) :
283+
A.rank = finrank R (LinearMap.range (toLin v₂ v₁ A)) := by
287284
cases nonempty_fintype m
288285
let e₁ := (Pi.basisFun R m).equiv v₁ (Equiv.refl _)
289286
let e₂ := (Pi.basisFun R n).equiv v₂ (Equiv.refl _)
@@ -300,28 +297,26 @@ theorem rank_eq_finrank_range_toLin [Finite m] [DecidableEq n] {M₁ M₂ : Type
300297
simp only [e₁, e₂, LinearMap.comp_apply, LinearEquiv.coe_coe, Equiv.refl_apply,
301298
aux₁, aux₂, LinearMap.coe_single, toLin_self, map_sum, map_smul, Basis.equiv_apply]
302299

303-
theorem rank_le_card_height [Fintype m] [Nontrivial R] [StrongRankCondition R] (A : Matrix m n R) :
304-
A.rank ≤ Fintype.card m := by
300+
theorem rank_le_card_height [Fintype m] [CommSemiring R] [StrongRankCondition R]
301+
(A : Matrix m n R) : A.rank ≤ Fintype.card m := by
305302
exact (Submodule.finrank_le _).trans (finrank_pi R).le
306303

307-
theorem rank_le_height [Nontrivial R] [StrongRankCondition R] {m n : ℕ}
304+
theorem rank_le_height [CommSemiring R] [StrongRankCondition R] {m n : ℕ}
308305
(A : Matrix (Fin m) (Fin n) R) : A.rank ≤ m :=
309306
A.rank_le_card_height.trans (Fintype.card_fin m).le
310307

311308
/-- The rank of a matrix is the rank of the space spanned by its columns. -/
312-
theorem rank_eq_finrank_span_cols (A : Matrix m n R) :
309+
theorem rank_eq_finrank_span_cols [CommSemiring R] (A : Matrix m n R) :
313310
A.rank = finrank R (Submodule.span R (Set.range A.col)) := by rw [rank, Matrix.range_mulVecLin]
314311

315312
@[simp]
316-
theorem cRank_toNat_eq_rank (A : Matrix m n R) : A.cRank.toNat = A.rank := by
313+
theorem cRank_toNat_eq_rank [CommSemiring R] (A : Matrix m n R) : A.cRank.toNat = A.rank := by
317314
rw [cRank_toNat_eq_finrank, ← rank_eq_finrank_span_cols]
318315

319316
@[simp]
320-
theorem eRank_toNat_eq_rank (A : Matrix m n R) : A.eRank.toNat = A.rank := by
317+
theorem eRank_toNat_eq_rank [CommSemiring R] (A : Matrix m n R) : A.eRank.toNat = A.rank := by
321318
rw [eRank_toNat_eq_finrank, ← rank_eq_finrank_span_cols]
322319

323-
end CommRing
324-
325320
section Field
326321

327322
variable [Field R]

0 commit comments

Comments
 (0)