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

Commit 820b229

Browse files
committed
feat(data/matrix/reflection): add mul_vec and vec_mul (#18805)
This follows the pattern already established by `mul`. The motivation was an example on Zulip which wanted to compute the product of ```lean def M := !![(2:ℂ), 0, 0; 0, 1, 0; 0, 0, 1] def v := ![(0:ℂ), 0, 1] ``` As before, the meta code that makes this pleasant to use is absent, but I will add it along with the rest of the meta code in #15738.
1 parent 7ebf83e commit 820b229

1 file changed

Lines changed: 60 additions & 5 deletions

File tree

src/data/matrix/reflection.lean

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ corresponding `*_eq` lemmas to be used in a place where they are definitionally
2525
* `matrix.transposeᵣ`
2626
* `matrix.dot_productᵣ`
2727
* `matrix.mulᵣ`
28+
* `matrix.mul_vecᵣ`
29+
* `matrix.vec_mulᵣ`
2830
* `matrix.eta_expand`
2931
3032
-/
@@ -130,17 +132,17 @@ example (a b c d : α) [has_mul α] [add_comm_monoid α] :
130132
def mulᵣ [has_mul α] [has_add α] [has_zero α]
131133
(A : matrix (fin l) (fin m) α) (B : matrix (fin m) (fin n) α) :
132134
matrix (fin l) (fin n) α :=
133-
of $ fin_vec.map (λ v₁, fin_vec.map (λ v₂, dot_productᵣ v₁ v₂) (transposeᵣ B)) A
135+
of $ fin_vec.map (λ v₁, fin_vec.map (λ v₂, dot_productᵣ v₁ v₂) Bᵀ) A
134136

135137
/-- This can be used to prove
136138
```lean
137-
example [add_comm_monoid α] [has_mul α]
138-
(a₁₁ a₁₂ a₁₃ a₂₁ a₂₂ a₂₃ a₃₁ a₃₂ a₃₃ b₁₁ b₁₂ b₁₃ b₂₁ b₂₂ b₂₃ b₃₁ b₃₂ b₃₃ : α) :
139+
example [add_comm_monoid α] [has_mul α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁₁ b₁₂ b₂₁ b₂₂ : α) :
139140
!![a₁₁, a₁₂;
140141
a₂₁, a₂₂] ⬝ !![b₁₁, b₁₂;
141142
b₂₁, b₂₂] =
142143
!![a₁₁*b₁₁ + a₁₂*b₂₁, a₁₁*b₁₂ + a₁₂*b₂₂;
143144
a₂₁*b₁₁ + a₂₂*b₂₁, a₂₁*b₁₂ + a₂₂*b₂₂] :=
145+
(mulᵣ_eq _ _).symm
144146
```
145147
-/
146148
@[simp]
@@ -152,15 +154,68 @@ begin
152154
refl,
153155
end
154156

155-
example [add_comm_monoid α] [has_mul α]
156-
(a₁₁ a₁₂ a₁₃ a₂₁ a₂₂ a₂₃ a₃₁ a₃₂ a₃₃ b₁₁ b₁₂ b₁₃ b₂₁ b₂₂ b₂₃ b₃₁ b₃₂ b₃₃ : α) :
157+
example [add_comm_monoid α] [has_mul α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁₁ b₁₂ b₂₁ b₂₂ : α) :
157158
!![a₁₁, a₁₂;
158159
a₂₁, a₂₂].mul !![b₁₁, b₁₂;
159160
b₂₁, b₂₂] =
160161
!![a₁₁*b₁₁ + a₁₂*b₂₁, a₁₁*b₁₂ + a₁₂*b₂₂;
161162
a₂₁*b₁₁ + a₂₂*b₂₁, a₂₁*b₁₂ + a₂₂*b₂₂] :=
162163
(mulᵣ_eq _ _).symm
163164

165+
/-- `matrix.mul_vec` with better defeq for `fin` -/
166+
def mul_vecᵣ [has_mul α] [has_add α] [has_zero α] (A : matrix (fin l) (fin m) α) (v : fin m → α) :
167+
fin l → α :=
168+
fin_vec.map (λ a, dot_productᵣ a v) A
169+
170+
/-- This can be used to prove
171+
```lean
172+
example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
173+
!![a₁₁, a₁₂;
174+
a₂₁, a₂₂].mul_vec ![b₁, b₂] = ![a₁₁*b₁ + a₁₂*b₂, a₂₁*b₁ + a₂₂*b₂] :=
175+
(mul_vecᵣ_eq _ _).symm
176+
```
177+
-/
178+
@[simp]
179+
lemma mul_vecᵣ_eq [non_unital_non_assoc_semiring α]
180+
(A : matrix (fin l) (fin m) α) (v : fin m → α) :
181+
mul_vecᵣ A v = A.mul_vec v :=
182+
begin
183+
simp [mul_vecᵣ, function.comp],
184+
refl,
185+
end
186+
187+
example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
188+
!![a₁₁, a₁₂;
189+
a₂₁, a₂₂].mul_vec ![b₁, b₂] = ![a₁₁*b₁ + a₁₂*b₂, a₂₁*b₁ + a₂₂*b₂] :=
190+
(mul_vecᵣ_eq _ _).symm
191+
192+
/-- `matrix.vec_mul` with better defeq for `fin` -/
193+
def vec_mulᵣ [has_mul α] [has_add α] [has_zero α] (v : fin l → α) (A : matrix (fin l) (fin m) α):
194+
fin m → α :=
195+
fin_vec.map (λ a, dot_productᵣ v a) Aᵀ
196+
197+
/-- This can be used to prove
198+
```lean
199+
example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
200+
vec_mul ![b₁, b₂] !![a₁₁, a₁₂;
201+
a₂₁, a₂₂] = ![b₁*a₁₁ + b₂*a₂₁, b₁*a₁₂ + b₂*a₂₂] :=
202+
(vec_mulᵣ_eq _ _).symm
203+
```
204+
-/
205+
@[simp]
206+
lemma vec_mulᵣ_eq [non_unital_non_assoc_semiring α]
207+
(v : fin l → α) (A : matrix (fin l) (fin m) α) :
208+
vec_mulᵣ v A = vec_mul v A :=
209+
begin
210+
simp [vec_mulᵣ, function.comp],
211+
refl,
212+
end
213+
214+
example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
215+
vec_mul ![b₁, b₂] !![a₁₁, a₁₂;
216+
a₂₁, a₂₂] = ![b₁*a₁₁ + b₂*a₂₁, b₁*a₁₂ + b₂*a₂₂] :=
217+
(vec_mulᵣ_eq _ _).symm
218+
164219
/-- Expand `A` to `!![A 0 0, ...; ..., A m n]` -/
165220
def eta_expand {m n} (A : matrix (fin m) (fin n) α) : matrix (fin m) (fin n) α :=
166221
matrix.of (fin_vec.eta_expand (λ i, fin_vec.eta_expand (λ j, A i j)))

0 commit comments

Comments
 (0)