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

Commit d244509

Browse files
feat(data/matrix/basic): Add alg_equiv and linear_equiv instances for transpose. (#15386)
`transpose` has natural bundlings as an `alg_equiv` and a `linear_equiv` for which we already have the substantial lemmas. Similarly, `conj_transpose` can be bundled as a `linear_equiv`. This also alters the other bundled versions to take explicit variables as this saves the need for many type annotations, and makes the necessary edits to fix proofs. Co-authored-by: Wrenna Robson <34025592+linesthatinterlace@users.noreply.github.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 168d6ba commit d244509

File tree

3 files changed

+63
-15
lines changed

3 files changed

+63
-15
lines changed

src/data/matrix/basic.lean

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,8 @@ by ext i j; refl
13691369
lemma transpose_map {f : α → β} {M : matrix m n α} : Mᵀ.map f = (M.map f)ᵀ :=
13701370
by { ext, refl }
13711371

1372+
variables (m n α)
1373+
13721374
/-- `matrix.transpose` as an `add_equiv` -/
13731375
@[simps apply]
13741376
def transpose_add_equiv [has_add α] : matrix m n α ≃+ matrix n m α :=
@@ -1379,19 +1381,33 @@ def transpose_add_equiv [has_add α] : matrix m n α ≃+ matrix n m α :=
13791381
map_add' := transpose_add }
13801382

13811383
@[simp] lemma transpose_add_equiv_symm [has_add α] :
1382-
(transpose_add_equiv : matrix m n α ≃+ matrix n m α).symm = transpose_add_equiv := rfl
1384+
(transpose_add_equiv m n α).symm = transpose_add_equiv n m α := rfl
1385+
1386+
variables {m n α}
13831387

13841388
lemma transpose_list_sum [add_monoid α] (l : list (matrix m n α)) :
13851389
l.sumᵀ = (l.map transpose).sum :=
1386-
(transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_list_sum l
1390+
(transpose_add_equiv m n α).to_add_monoid_hom.map_list_sum l
13871391

13881392
lemma transpose_multiset_sum [add_comm_monoid α] (s : multiset (matrix m n α)) :
13891393
s.sumᵀ = (s.map transpose).sum :=
1390-
(transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_multiset_sum s
1394+
(transpose_add_equiv m n α).to_add_monoid_hom.map_multiset_sum s
13911395

13921396
lemma transpose_sum [add_comm_monoid α] {ι : Type*} (s : finset ι) (M : ι → matrix m n α) :
13931397
(∑ i in s, M i)ᵀ = ∑ i in s, (M i)ᵀ :=
1394-
(transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_sum _ s
1398+
(transpose_add_equiv m n α).to_add_monoid_hom.map_sum _ s
1399+
1400+
variables (m n R α)
1401+
1402+
/-- `matrix.transpose` as a `linear_map` -/
1403+
@[simps apply]
1404+
def transpose_linear_equiv [semiring R] [add_comm_monoid α] [module R α] :
1405+
matrix m n α ≃ₗ[R] matrix n m α := { map_smul' := transpose_smul, ..transpose_add_equiv m n α}
1406+
1407+
@[simp] lemma transpose_linear_equiv_symm [semiring R] [add_comm_monoid α] [module R α] :
1408+
(transpose_linear_equiv m n R α).symm = transpose_linear_equiv n m R α := rfl
1409+
1410+
variables {m n R α}
13951411

13961412
variables (m α)
13971413

@@ -1403,7 +1419,7 @@ def transpose_ring_equiv [add_comm_monoid α] [comm_semigroup α] [fintype m] :
14031419
inv_fun := λ M, M.unopᵀ,
14041420
map_mul' := λ M N, (congr_arg mul_opposite.op (transpose_mul M N)).trans
14051421
(mul_opposite.op_mul _ _),
1406-
..transpose_add_equiv.trans mul_opposite.op_add_equiv }
1422+
..(transpose_add_equiv m m α).trans mul_opposite.op_add_equiv }
14071423

14081424
variables {m α}
14091425

@@ -1415,6 +1431,20 @@ lemma transpose_list_prod [comm_semiring α] [fintype m] [decidable_eq m] (l : l
14151431
l.prodᵀ = (l.map transpose).reverse.prod :=
14161432
(transpose_ring_equiv m α).unop_map_list_prod l
14171433

1434+
variables (R m α)
1435+
1436+
/-- `matrix.transpose` as an `alg_equiv` to the opposite ring -/
1437+
@[simps]
1438+
def transpose_alg_equiv [comm_semiring R] [comm_semiring α] [fintype m] [decidable_eq m]
1439+
[algebra R α] : matrix m m α ≃ₐ[R] (matrix m m α)ᵐᵒᵖ :=
1440+
{ to_fun := λ M, mul_opposite.op (Mᵀ),
1441+
commutes' := λ r, by simp only [algebra_map_eq_diagonal, diagonal_transpose,
1442+
mul_opposite.algebra_map_apply],
1443+
..(transpose_add_equiv m m α).trans mul_opposite.op_add_equiv,
1444+
..transpose_ring_equiv m α }
1445+
1446+
variables {R m α}
1447+
14181448
end transpose
14191449

14201450
section conj_transpose
@@ -1520,6 +1550,8 @@ lemma conj_transpose_map [has_star α] [has_star β] {A : matrix m n α} (f : α
15201550
Aᴴ.map f = (A.map f)ᴴ :=
15211551
matrix.ext $ λ i j, hf _
15221552

1553+
variables (m n α)
1554+
15231555
/-- `matrix.conj_transpose` as an `add_equiv` -/
15241556
@[simps apply]
15251557
def conj_transpose_add_equiv [add_monoid α] [star_add_monoid α] : matrix m n α ≃+ matrix n m α :=
@@ -1530,21 +1562,37 @@ def conj_transpose_add_equiv [add_monoid α] [star_add_monoid α] : matrix m n
15301562
map_add' := conj_transpose_add }
15311563

15321564
@[simp] lemma conj_transpose_add_equiv_symm [add_monoid α] [star_add_monoid α] :
1533-
(conj_transpose_add_equiv : matrix m n α ≃+ matrix n m α).symm = conj_transpose_add_equiv := rfl
1565+
(conj_transpose_add_equiv m n α).symm = conj_transpose_add_equiv n m α := rfl
1566+
1567+
variables {m n α}
15341568

15351569
lemma conj_transpose_list_sum [add_monoid α] [star_add_monoid α] (l : list (matrix m n α)) :
15361570
l.sumᴴ = (l.map conj_transpose).sum :=
1537-
(conj_transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_list_sum l
1571+
(conj_transpose_add_equiv m n α).to_add_monoid_hom.map_list_sum l
15381572

15391573
lemma conj_transpose_multiset_sum [add_comm_monoid α] [star_add_monoid α]
15401574
(s : multiset (matrix m n α)) :
15411575
s.sumᴴ = (s.map conj_transpose).sum :=
1542-
(conj_transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_multiset_sum s
1576+
(conj_transpose_add_equiv m n α).to_add_monoid_hom.map_multiset_sum s
15431577

15441578
lemma conj_transpose_sum [add_comm_monoid α] [star_add_monoid α] {ι : Type*} (s : finset ι)
15451579
(M : ι → matrix m n α) :
15461580
(∑ i in s, M i)ᴴ = ∑ i in s, (M i)ᴴ :=
1547-
(conj_transpose_add_equiv : matrix m n α ≃+ matrix n m α).to_add_monoid_hom.map_sum _ s
1581+
(conj_transpose_add_equiv m n α).to_add_monoid_hom.map_sum _ s
1582+
1583+
variables (m n R α)
1584+
1585+
/-- `matrix.conj_transpose` as a `linear_map` -/
1586+
@[simps apply]
1587+
def conj_transpose_linear_equiv [comm_semiring R] [star_ring R] [add_comm_monoid α]
1588+
[star_add_monoid α] [module R α] [star_module R α] : matrix m n α ≃ₗ⋆[R] matrix n m α :=
1589+
{ map_smul' := conj_transpose_smul, ..conj_transpose_add_equiv m n α}
1590+
1591+
@[simp] lemma conj_transpose_linear_equiv_symm [comm_semiring R] [star_ring R] [add_comm_monoid α]
1592+
[star_add_monoid α] [module R α] [star_module R α] :
1593+
(conj_transpose_linear_equiv m n R α).symm = conj_transpose_linear_equiv n m R α := rfl
1594+
1595+
variables {m n R α}
15481596

15491597
variables (m α)
15501598

@@ -1556,7 +1604,7 @@ def conj_transpose_ring_equiv [semiring α] [star_ring α] [fintype m] :
15561604
inv_fun := λ M, M.unopᴴ,
15571605
map_mul' := λ M N, (congr_arg mul_opposite.op (conj_transpose_mul M N)).trans
15581606
(mul_opposite.op_mul _ _),
1559-
..conj_transpose_add_equiv.trans mul_opposite.op_add_equiv }
1607+
..(conj_transpose_add_equiv m m α).trans mul_opposite.op_add_equiv }
15601608

15611609
variables {m α}
15621610

src/ring_theory/trace.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ end
420420
lemma trace_matrix_of_matrix_mul_vec [fintype κ] (b : κ → B) (P : matrix κ κ A) :
421421
trace_matrix A ((P.map (algebra_map A B)).mul_vec b) = P ⬝ (trace_matrix A b) ⬝ Pᵀ :=
422422
begin
423-
refine add_equiv.injective transpose_add_equiv _,
423+
refine add_equiv.injective (transpose_add_equiv _ _ _) _,
424424
rw [transpose_add_equiv_apply, transpose_add_equiv_apply, ← vec_mul_transpose,
425425
← transpose_map, trace_matrix_of_matrix_vec_mul, transpose_transpose, transpose_mul,
426426
transpose_transpose, transpose_mul]

src/topology/instances/matrix.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,15 @@ variables [semiring α] [add_comm_monoid R] [topological_space R] [module α R]
267267

268268
lemma has_sum.matrix_transpose {f : X → matrix m n R} {a : matrix m n R} (hf : has_sum f a) :
269269
has_sum (λ x, (f x)ᵀ) aᵀ :=
270-
(hf.map (@matrix.transpose_add_equiv m n R _) continuous_id.matrix_transpose : _)
270+
(hf.map (matrix.transpose_add_equiv m n R) continuous_id.matrix_transpose : _)
271271

272272
lemma summable.matrix_transpose {f : X → matrix m n R} (hf : summable f) :
273273
summable (λ x, (f x)ᵀ) :=
274274
hf.has_sum.matrix_transpose.summable
275275

276276
@[simp] lemma summable_matrix_transpose {f : X → matrix m n R} :
277277
summable (λ x, (f x)ᵀ) ↔ summable f :=
278-
(summable.map_iff_of_equiv (@matrix.transpose_add_equiv m n R _)
278+
(summable.map_iff_of_equiv (matrix.transpose_add_equiv m n R)
279279
(@continuous_id (matrix m n R) _).matrix_transpose (continuous_id.matrix_transpose) : _)
280280

281281
lemma matrix.transpose_tsum [t2_space R] {f : X → matrix m n R} : (∑' x, f x)ᵀ = ∑' x, (f x)ᵀ :=
@@ -289,7 +289,7 @@ end
289289
lemma has_sum.matrix_conj_transpose [star_add_monoid R] [has_continuous_star R]
290290
{f : X → matrix m n R} {a : matrix m n R} (hf : has_sum f a) :
291291
has_sum (λ x, (f x)ᴴ) aᴴ :=
292-
(hf.map (@matrix.conj_transpose_add_equiv m n R _ _) continuous_id.matrix_conj_transpose : _)
292+
(hf.map (matrix.conj_transpose_add_equiv m n R) continuous_id.matrix_conj_transpose : _)
293293

294294
lemma summable.matrix_conj_transpose [star_add_monoid R] [has_continuous_star R]
295295
{f : X → matrix m n R} (hf : summable f) :
@@ -299,7 +299,7 @@ hf.has_sum.matrix_conj_transpose.summable
299299
@[simp] lemma summable_matrix_conj_transpose [star_add_monoid R] [has_continuous_star R]
300300
{f : X → matrix m n R} :
301301
summable (λ x, (f x)ᴴ) ↔ summable f :=
302-
(summable.map_iff_of_equiv (@matrix.conj_transpose_add_equiv m n R _ _)
302+
(summable.map_iff_of_equiv (matrix.conj_transpose_add_equiv m n R)
303303
(@continuous_id (matrix m n R) _).matrix_conj_transpose (continuous_id.matrix_conj_transpose) : _)
304304

305305
lemma matrix.conj_transpose_tsum [star_add_monoid R] [has_continuous_star R] [t2_space R]

0 commit comments

Comments
 (0)