@@ -114,89 +114,85 @@ end Infinite
114114
115115variable [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
150146set_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-
325320section Field
326321
327322variable [Field R]
0 commit comments