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

Commit 4ae9792

Browse files
committed
chore(data/matrix/basic): add lemmas about dot_product and mul_vec (#8325)
This renames: * `mul_vec_one` to `one_mul_vec` * `mul_vec_zero` to `zero_mul_vec` and adds the new lemmas: * `sub_mul_vec` * `mul_vec_sub` * `zero_mul_vec` * `mul_vec_zero` * `sub_dot_product` * `dot_product_sub` Some existing lemmas have had their variables extracted to sections. Co-authored-by: l534zhan <luming.zhang@merton.ox.ac.uk>
1 parent b577bb2 commit 4ae9792

File tree

2 files changed

+56
-42
lines changed

2 files changed

+56
-42
lines changed

src/data/matrix/basic.lean

Lines changed: 55 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -257,76 +257,84 @@ by simp_rw [dot_product, mul_comm]
257257
dot_product v w = v ⟨⟩ * w ⟨⟩ :=
258258
by simp [dot_product]
259259

260-
@[simp] lemma dot_product_zero [non_unital_non_assoc_semiring α] (v : m → α) :
261-
dot_product v 0 = 0 :=
262-
by simp [dot_product]
260+
section non_unital_non_assoc_semiring
261+
variables [non_unital_non_assoc_semiring α] (u v w : m → α)
263262

264-
@[simp] lemma dot_product_zero' [non_unital_non_assoc_semiring α] (v : m → α) :
265-
dot_product v (λ _, 0) = 0 :=
266-
dot_product_zero v
263+
@[simp] lemma dot_product_zero : dot_product v 0 = 0 := by simp [dot_product]
267264

268-
@[simp] lemma zero_dot_product [non_unital_non_assoc_semiring α] (v : m → α) :
269-
dot_product 0 v = 0 :=
270-
by simp [dot_product]
265+
@[simp] lemma dot_product_zero' : dot_product v (λ _, 0) = 0 := dot_product_zero v
271266

272-
@[simp] lemma zero_dot_product' [non_unital_non_assoc_semiring α] (v : m → α) :
273-
dot_product (λ _, (0 : α)) v = 0 :=
274-
zero_dot_product v
267+
@[simp] lemma zero_dot_product : dot_product 0 v = 0 := by simp [dot_product]
275268

276-
@[simp] lemma add_dot_product [non_unital_non_assoc_semiring α] (u v w : m → α) :
277-
dot_product (u + v) w = dot_product u w + dot_product v w :=
269+
@[simp] lemma zero_dot_product' : dot_product (λ _, (0 : α)) v = 0 := zero_dot_product v
270+
271+
@[simp] lemma add_dot_product : dot_product (u + v) w = dot_product u w + dot_product v w :=
278272
by simp [dot_product, add_mul, finset.sum_add_distrib]
279273

280-
@[simp] lemma dot_product_add [non_unital_non_assoc_semiring α] (u v w : m → α) :
281-
dot_product u (v + w) = dot_product u v + dot_product u w :=
274+
@[simp] lemma dot_product_add : dot_product u (v + w) = dot_product u v + dot_product u w :=
282275
by simp [dot_product, mul_add, finset.sum_add_distrib]
283276

284-
@[simp] lemma diagonal_dot_product [decidable_eq m] [non_unital_non_assoc_semiring α]
285-
(v w : m → α) (i : m) :
286-
dot_product (diagonal v i) w = v i * w i :=
277+
end non_unital_non_assoc_semiring
278+
279+
section non_unital_non_assoc_semiring_decidable
280+
variables [decidable_eq m] [non_unital_non_assoc_semiring α] (u v w : m → α)
281+
282+
@[simp] lemma diagonal_dot_product (i : m) : dot_product (diagonal v i) w = v i * w i :=
287283
have ∀ j ≠ i, diagonal v i j * w j = 0 := λ j hij, by simp [diagonal_apply_ne' hij],
288284
by convert finset.sum_eq_single i (λ j _, this j) _ using 1; simp
289285

290-
@[simp] lemma dot_product_diagonal [decidable_eq m] [non_unital_non_assoc_semiring α]
291-
(v w : m → α) (i : m) :
292-
dot_product v (diagonal w i) = v i * w i :=
286+
@[simp] lemma dot_product_diagonal (i : m) : dot_product v (diagonal w i) = v i * w i :=
293287
have ∀ j ≠ i, v j * diagonal w i j = 0 := λ j hij, by simp [diagonal_apply_ne' hij],
294288
by convert finset.sum_eq_single i (λ j _, this j) _ using 1; simp
295289

296-
@[simp] lemma dot_product_diagonal' [decidable_eq m] [non_unital_non_assoc_semiring α]
297-
(v w : m → α) (i : m) :
298-
dot_product v (λ j, diagonal w j i) = v i * w i :=
290+
@[simp] lemma dot_product_diagonal' (i : m) : dot_product v (λ j, diagonal w j i) = v i * w i :=
299291
have ∀ j ≠ i, v j * diagonal w j i = 0 := λ j hij, by simp [diagonal_apply_ne hij],
300292
by convert finset.sum_eq_single i (λ j _, this j) _ using 1; simp
301293

302-
@[simp] lemma neg_dot_product [ring α] (v w : m → α) : dot_product (-v) w = - dot_product v w :=
303-
by simp [dot_product]
294+
end non_unital_non_assoc_semiring_decidable
304295

305-
@[simp] lemma dot_product_neg [ring α] (v w : m → α) : dot_product v (-w) = - dot_product v w :=
306-
by simp [dot_product]
296+
section ring
297+
variables [ring α] (u v w : m → α)
298+
299+
@[simp] lemma neg_dot_product : dot_product (-v) w = - dot_product v w := by simp [dot_product]
300+
301+
@[simp] lemma dot_product_neg : dot_product v (-w) = - dot_product v w := by simp [dot_product]
307302

308-
@[simp] lemma smul_dot_product [monoid R] [has_mul α] [add_comm_monoid α] [distrib_mul_action R α]
309-
[is_scalar_tower R α α] (x : R) (v w : m → α) :
303+
@[simp] lemma sub_dot_product : dot_product (u - v) w = dot_product u w - dot_product v w :=
304+
by simp [sub_eq_add_neg]
305+
306+
@[simp] lemma dot_product_sub : dot_product u (v - w) = dot_product u v - dot_product u w :=
307+
by simp [sub_eq_add_neg]
308+
309+
end ring
310+
311+
section distrib_mul_action
312+
variables [monoid R] [has_mul α] [add_comm_monoid α] [distrib_mul_action R α]
313+
314+
@[simp] lemma smul_dot_product [is_scalar_tower R α α] (x : R) (v w : m → α) :
310315
dot_product (x • v) w = x • dot_product v w :=
311316
by simp [dot_product, finset.smul_sum, smul_mul_assoc]
312317

313-
@[simp] lemma dot_product_smul [monoid R] [has_mul α] [add_comm_monoid α] [distrib_mul_action R α]
314-
[smul_comm_class R α α] (x : R) (v w : m → α) :
318+
@[simp] lemma dot_product_smul [smul_comm_class R α α] (x : R) (v w : m → α) :
315319
dot_product v (x • w) = x • dot_product v w :=
316320
by simp [dot_product, finset.smul_sum, mul_smul_comm]
317321

318-
lemma star_dot_product_star [semiring α] [star_ring α] (v w : m → α) :
319-
dot_product (star v) (star w) = star (dot_product w v) :=
322+
end distrib_mul_action
323+
324+
section star_ring
325+
variables [semiring α] [star_ring α] (v w : m → α)
326+
327+
lemma star_dot_product_star : dot_product (star v) (star w) = star (dot_product w v) :=
320328
by simp [dot_product]
321329

322-
lemma star_dot_product [semiring α] [star_ring α] (v w : m → α) :
323-
dot_product (star v) w = star (dot_product (star w) v) :=
330+
lemma star_dot_product : dot_product (star v) w = star (dot_product (star w) v) :=
324331
by simp [dot_product]
325332

326-
lemma dot_product_star [semiring α] [star_ring α] (v w : m → α) :
327-
dot_product v (star w) = star (dot_product w (star v)) :=
333+
lemma dot_product_star : dot_product v (star w) = star (dot_product w (star v)) :=
328334
by simp [dot_product]
329335

336+
end star_ring
337+
330338
end dot_product
331339

332340
/-- `M ⬝ N` is the usual product of matrices `M` and `N`, i.e. we have that
@@ -676,7 +684,13 @@ dot_product_diagonal' v w x
676684
@[simp] lemma mul_vec_zero (A : matrix m n α) : mul_vec A 0 = 0 :=
677685
by { ext, simp [mul_vec] }
678686

679-
@[simp] lemma vec_mul_zero (A : matrix m n α) : vec_mul 0 A = 0 :=
687+
@[simp] lemma zero_vec_mul (A : matrix m n α) : vec_mul 0 A = 0 :=
688+
by { ext, simp [vec_mul] }
689+
690+
@[simp] lemma zero_mul_vec (v : n → α) : mul_vec (0 : matrix m n α) v = 0 :=
691+
by { ext, simp [mul_vec] }
692+
693+
@[simp] lemma vec_mul_zero (v : m → α) : vec_mul v (0 : matrix m n α) = 0 :=
680694
by { ext, simp [vec_mul] }
681695

682696
lemma vec_mul_vec_eq (w : m → α) (v : n → α) :
@@ -722,7 +736,7 @@ end non_unital_semiring
722736
section non_assoc_semiring
723737
variables [non_assoc_semiring α]
724738

725-
@[simp] lemma mul_vec_one [decidable_eq m] (v : m → α) : mul_vec 1 v = v :=
739+
@[simp] lemma one_mul_vec [decidable_eq m] (v : m → α) : mul_vec 1 v = v :=
726740
by { ext, rw [←diagonal_one, mul_vec_diagonal, one_mul] }
727741

728742
@[simp] lemma vec_mul_one [decidable_eq m] (v : m → α) : vec_mul v 1 = v :=

src/linear_algebra/matrix/nonsingular_inverse.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,6 @@ if the determinant is not a unit. A sufficient (but still not necessary) conditi
489489
divides `b`. -/
490490
@[simp] lemma mul_vec_cramer (A : matrix n n α) (b : n → α) :
491491
A.mul_vec (cramer A b) = A.det • b :=
492-
by rw [cramer_eq_adjugate_mul_vec, mul_vec_mul_vec, mul_adjugate, smul_mul_vec_assoc, mul_vec_one]
492+
by rw [cramer_eq_adjugate_mul_vec, mul_vec_mul_vec, mul_adjugate, smul_mul_vec_assoc, one_mul_vec]
493493

494494
end matrix

0 commit comments

Comments
 (0)