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

Commit 0531cb0

Browse files
author
Oliver Nash
committed
feat(algebra/classical_lie_algebras): add definitions of missing classical Lie algebras (#3661)
Copying from the comments I have added at the top of `classical_lie_algebras.lean`: ## Main definitions * `lie_algebra.symplectic.sp` * `lie_algebra.orthogonal.so` * `lie_algebra.orthogonal.so'` * `lie_algebra.orthogonal.so_indefinite_equiv` * `lie_algebra.orthogonal.type_D` * `lie_algebra.orthogonal.type_B` * `lie_algebra.orthogonal.type_D_equiv_so'` * `lie_algebra.orthogonal.type_B_equiv_so'`
1 parent 37119b4 commit 0531cb0

File tree

6 files changed

+496
-9
lines changed

6 files changed

+496
-9
lines changed

src/algebra/classical_lie_algebras.lean

Lines changed: 273 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,72 @@ Copyright (c) 2020 Oliver Nash. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Oliver Nash
55
-/
6+
import algebra.invertible
67
import algebra.lie_algebra
78
import linear_algebra.matrix
89

910
/-!
1011
# Classical Lie algebras
1112
1213
This file is the place to find definitions and basic properties of the classical Lie algebras:
13-
* Aₙ sl(n+1)
14-
* Bₙ so(2n+1)
15-
* Cₙ sp(2n)
16-
* Dₙ so(2n)
14+
* Aₗ = sl(l+1)
15+
* Bₗ ≃ so(l+1, l) ≃ so(2l+1)
16+
* Cₗ = sp(l)
17+
* Dₗ ≃ so(l, l) ≃ so(2l)
1718
18-
As of April 2020, the definition of Aₙ is in place while the others still need to be provided.
19+
## Main definitions
20+
21+
* `lie_algebra.special_linear.sl`
22+
* `lie_algebra.symplectic.sp`
23+
* `lie_algebra.orthogonal.so`
24+
* `lie_algebra.orthogonal.so'`
25+
* `lie_algebra.orthogonal.so_indefinite_equiv`
26+
* `lie_algebra.orthogonal.type_D`
27+
* `lie_algebra.orthogonal.type_B`
28+
* `lie_algebra.orthogonal.type_D_equiv_so'`
29+
* `lie_algebra.orthogonal.type_B_equiv_so'`
30+
31+
## Implementation notes
32+
33+
### Matrices or endomorphisms
34+
35+
Given a finite type and a commutative ring, the corresponding square matrices are equivalent to the
36+
endomorphisms of the corresponding finite-rank free module as Lie algebras, see `lie_equiv_matrix'`.
37+
We can thus define the classical Lie algebras as Lie subalgebras either of matrices or of
38+
endomorphisms. We have opted for the former. At the time of writing (August 2020) it is unclear
39+
which approach should be preferred so the choice should be assumed to be somewhat arbitrary.
40+
41+
### Diagonal quadratic form or diagonal Cartan subalgebra
42+
43+
For the algebras of type `B` and `D`, there are two natural definitions. For example since the
44+
the `2l × 2l` matrix:
45+
$$
46+
J = \left[\begin{align}{cc}
47+
0_l & 1_l\\
48+
1_l & 0_l
49+
\end{align}\right]
50+
$$
51+
defines a symmetric bilinear form equivalent to that defined by the identity matrix `I`, we can
52+
define the algebras of type `D` to be the Lie subalgebra of skew-adjoint matrices either for `J` or
53+
for `I`. Both definitions have their advantages (in particular the `J`-skew-adjoint matrices define
54+
a Lie algebra for which the diagonal matrices form a Cartan subalgebra) and so we provide both.
55+
We thus also provide equivalences `type_D_equiv_so'`, `so_indefinite_equiv` which show the two
56+
definitions are equivalent. Similarly for the algebras of type `B`.
1957
2058
## Tags
2159
22-
classical lie algebra, special linear
60+
classical lie algebra, special linear, symplectic, orthogonal
2361
-/
2462

2563
universes u₁ u₂
2664

2765
namespace lie_algebra
2866
open_locale matrix
2967

30-
variables (n : Type u₁) (R : Type u₂)
31-
variables [fintype n] [decidable_eq n] [comm_ring R]
68+
variables (n p q l : Type u₁) (R : Type u₂)
69+
variables [fintype n] [fintype l] [fintype p] [fintype q]
70+
variables [decidable_eq n] [decidable_eq p] [decidable_eq q] [decidable_eq l]
71+
variables [comm_ring R]
3272

3373
local attribute [instance] matrix.lie_ring
3474
local attribute [instance] matrix.lie_algebra
@@ -90,4 +130,229 @@ end
90130

91131
end special_linear
92132

133+
namespace symplectic
134+
135+
/-- The matrix defining the canonical skew-symmetric bilinear form. -/
136+
def J : matrix (l ⊕ l) (l ⊕ l) R := matrix.from_blocks 0 (-1) 1 0
137+
138+
/-- The symplectic Lie algebra: skew-adjoint matrices with respect to the canonical skew-symmetric
139+
bilinear form. -/
140+
def sp : lie_subalgebra R (matrix (l ⊕ l) (l ⊕ l) R) :=
141+
skew_adjoint_matrices_lie_subalgebra (J l R)
142+
143+
end symplectic
144+
145+
namespace orthogonal
146+
147+
/-- The definite orthogonal Lie subalgebra: skew-adjoint matrices with respect to the symmetric
148+
bilinear form defined by the identity matrix. -/
149+
def so : lie_subalgebra R (matrix n n R) :=
150+
skew_adjoint_matrices_lie_subalgebra (1 : matrix n n R)
151+
152+
/-- The indefinite diagonal matrix with `p` 1s and `q` -1s. -/
153+
def indefinite_diagonal : matrix (p ⊕ q) (p ⊕ q) R :=
154+
matrix.diagonal $ sum.elim (λ _, 1) (λ _, -1)
155+
156+
/-- The indefinite orthogonal Lie subalgebra: skew-adjoint matrices with respect to the symmetric
157+
bilinear form defined by the indefinite diagonal matrix. -/
158+
def so' : lie_subalgebra R (matrix (p ⊕ q) (p ⊕ q) R) :=
159+
skew_adjoint_matrices_lie_subalgebra $ indefinite_diagonal p q R
160+
161+
/-- A matrix for transforming the indefinite diagonal bilinear form into the definite one, provided
162+
the parameter `i` is a square root of -1. -/
163+
def Pso (i : R) : matrix (p ⊕ q) (p ⊕ q) R :=
164+
matrix.diagonal $ sum.elim (λ _, 1) (λ _, i)
165+
166+
lemma Pso_inv {i : R} (hi : i*i = -1) : (Pso p q R i) * (Pso p q R (-i)) = 1 :=
167+
begin
168+
ext x y, rcases x; rcases y,
169+
{ -- x y : p
170+
by_cases h : x = y; simp [Pso, indefinite_diagonal, h], },
171+
{ -- x : p, y : q
172+
simp [Pso, indefinite_diagonal], },
173+
{ -- x : q, y : p
174+
simp [Pso, indefinite_diagonal], },
175+
{ -- x y : q
176+
by_cases h : x = y; simp [Pso, indefinite_diagonal, h, hi], },
177+
end
178+
179+
lemma is_unit_Pso {i : R} (hi : i*i = -1) : is_unit (Pso p q R i) :=
180+
⟨{ val := Pso p q R i,
181+
inv := Pso p q R (-i),
182+
val_inv := Pso_inv p q R hi,
183+
inv_val := by { apply matrix.nonsing_inv_left_right, exact Pso_inv p q R hi, }, },
184+
rfl⟩
185+
186+
lemma indefinite_diagonal_transform {i : R} (hi : i*i = -1) :
187+
(Pso p q R i)ᵀ ⬝ (indefinite_diagonal p q R) ⬝ (Pso p q R i) = 1 :=
188+
begin
189+
ext x y, rcases x; rcases y,
190+
{ -- x y : p
191+
by_cases h : x = y; simp [Pso, indefinite_diagonal, h], },
192+
{ -- x : p, y : q
193+
simp [Pso, indefinite_diagonal], },
194+
{ -- x : q, y : p
195+
simp [Pso, indefinite_diagonal], },
196+
{ -- x y : q
197+
by_cases h : x = y; simp [Pso, indefinite_diagonal, h, hi], },
198+
end
199+
200+
/-- An equivalence between the indefinite and definite orthogonal Lie algebras, over a ring
201+
containing a square root of -1. -/
202+
noncomputable def so_indefinite_equiv {i : R} (hi : i*i = -1) : so' p q R ≃ₗ⁅R⁆ so (p ⊕ q) R :=
203+
begin
204+
apply (skew_adjoint_matrices_lie_subalgebra_equiv
205+
(indefinite_diagonal p q R) (Pso p q R i) (is_unit_Pso p q R hi)).trans,
206+
apply lie_algebra.equiv.of_eq,
207+
ext A, rw indefinite_diagonal_transform p q R hi, refl,
208+
end
209+
210+
lemma so_indefinite_equiv_apply {i : R} (hi : i*i = -1) (A : so' p q R) :
211+
(so_indefinite_equiv p q R hi A : matrix (p ⊕ q) (p ⊕ q) R) = (Pso p q R i)⁻¹ ⬝ (A : matrix (p ⊕ q) (p ⊕ q) R) ⬝ (Pso p q R i) :=
212+
by erw [lie_algebra.equiv.trans_apply, lie_algebra.equiv.of_eq_apply,
213+
skew_adjoint_matrices_lie_subalgebra_equiv_apply]
214+
215+
/-- A matrix defining a canonical even-rank symmetric bilinear form.
216+
217+
It looks like this as a `2l x 2l` matrix of `l x l` blocks:
218+
[ 0 1 ]
219+
[ 1 0 ]
220+
-/
221+
def JD : matrix (l ⊕ l) (l ⊕ l) R := matrix.from_blocks 0 1 1 0
222+
223+
/-- The classical Lie algebra of type D as a Lie subalgebra of matrices associated to the matrix
224+
`JD`. -/
225+
def type_D := skew_adjoint_matrices_lie_subalgebra (JD l R)
226+
227+
/-- A matrix transforming the bilinear form defined by the matrix `JD` into a split-signature
228+
diagonal matrix.
229+
230+
It looks like this as a `2l x 2l` matrix of `l x l` blocks:
231+
[ 1 -1 ]
232+
[ 1 1 ]
233+
-/
234+
def PD : matrix (l ⊕ l) (l ⊕ l) R := matrix.from_blocks 1 (-1) 1 1
235+
236+
/-- The split-signature diagonal matrix. -/
237+
def S := indefinite_diagonal l l R
238+
239+
lemma S_as_blocks : S l R = matrix.from_blocks 1 0 0 (-1) :=
240+
begin
241+
rw [← matrix.diagonal_one, matrix.diagonal_neg, matrix.from_blocks_diagonal],
242+
refl,
243+
end
244+
245+
lemma JD_transform : (PD l R)ᵀ ⬝ (JD l R) ⬝ (PD l R) = (2 : R) • (S l R) :=
246+
begin
247+
have h : (PD l R)ᵀ ⬝ (JD l R) = matrix.from_blocks 1 1 1 (-1) := by
248+
{ simp [PD, JD, matrix.from_blocks_transpose, matrix.from_blocks_multiply], },
249+
erw [h, S_as_blocks, matrix.from_blocks_multiply, matrix.from_blocks_smul],
250+
congr; simp [two_smul],
251+
end
252+
253+
lemma PD_inv [invertible (2 : R)] : (PD l R) * (⅟(2 : R) • (PD l R)ᵀ) = 1 :=
254+
begin
255+
have h : ⅟(2 : R) • (1 : matrix l l R) + ⅟(2 : R) • 1 = 1 := by
256+
rw [← smul_add, ← (two_smul R _), smul_smul, inv_of_mul_self, one_smul],
257+
erw [matrix.from_blocks_transpose, matrix.from_blocks_smul, matrix.mul_eq_mul,
258+
matrix.from_blocks_multiply],
259+
simp [h],
260+
end
261+
262+
lemma is_unit_PD [invertible (2 : R)] : is_unit (PD l R) :=
263+
⟨{ val := PD l R,
264+
inv := ⅟(2 : R) • (PD l R)ᵀ,
265+
val_inv := PD_inv l R,
266+
inv_val := by { apply matrix.nonsing_inv_left_right, exact PD_inv l R, }, },
267+
rfl⟩
268+
269+
/-- An equivalence between two possible definitions of the classical Lie algebra of type D. -/
270+
noncomputable def type_D_equiv_so' [invertible (2 : R)] :
271+
type_D l R ≃ₗ⁅R⁆ so' l l R :=
272+
begin
273+
apply (skew_adjoint_matrices_lie_subalgebra_equiv (JD l R) (PD l R) (is_unit_PD l R)).trans,
274+
apply lie_algebra.equiv.of_eq,
275+
ext A,
276+
rw [JD_transform, ← unit_of_invertible_val (2 : R), lie_subalgebra.mem_coe,
277+
mem_skew_adjoint_matrices_lie_subalgebra_unit_smul],
278+
refl,
279+
end
280+
281+
/-- A matrix defining a canonical odd-rank symmetric bilinear form.
282+
283+
It looks like this as a `(2l+1) x (2l+1)` matrix of blocks:
284+
[ 2 0 0 ]
285+
[ 0 0 1 ]
286+
[ 0 1 0 ]
287+
where sizes of the blocks are:
288+
[`1 x 1` `1 x l` `1 x l`]
289+
[`l x 1` `l x l` `l x l`]
290+
[`l x 1` `l x l` `l x l`]
291+
-/
292+
def JB := matrix.from_blocks ((2 : R) • 1 : matrix punit punit R) 0 0 (JD l R)
293+
294+
/-- The classical Lie algebra of type B as a Lie subalgebra of matrices associated to the matrix
295+
`JB`. -/
296+
def type_B := skew_adjoint_matrices_lie_subalgebra (JB l R)
297+
298+
/-- A matrix transforming the bilinear form defined by the matrix `JB` into an
299+
almost-split-signature diagonal matrix.
300+
301+
It looks like this as a `(2l+1) x (2l+1)` matrix of blocks:
302+
[ 1 0 0 ]
303+
[ 0 1 -1 ]
304+
[ 0 1 1 ]
305+
where sizes of the blocks are:
306+
[`1 x 1` `1 x l` `1 x l`]
307+
[`l x 1` `l x l` `l x l`]
308+
[`l x 1` `l x l` `l x l`]
309+
-/
310+
def PB := matrix.from_blocks (1 : matrix punit punit R) 0 0 (PD l R)
311+
312+
lemma PB_inv [invertible (2 : R)] : (PB l R) * (matrix.from_blocks 1 0 0 (PD l R)⁻¹) = 1 :=
313+
begin
314+
simp [PB, matrix.from_blocks_multiply, (PD l R).mul_nonsing_inv, is_unit_PD,
315+
← (PD l R).is_unit_iff_is_unit_det]
316+
end
317+
318+
lemma is_unit_PB [invertible (2 : R)] : is_unit (PB l R) :=
319+
⟨{ val := PB l R,
320+
inv := matrix.from_blocks 1 0 0 (PD l R)⁻¹,
321+
val_inv := PB_inv l R,
322+
inv_val := by { apply matrix.nonsing_inv_left_right, exact PB_inv l R, }, },
323+
rfl⟩
324+
325+
lemma JB_transform : (PB l R)ᵀ ⬝ (JB l R) ⬝ (PB l R) = (2 : R) • matrix.from_blocks 1 0 0 (S l R) :=
326+
by simp [PB, JB, JD_transform, matrix.from_blocks_transpose, matrix.from_blocks_multiply,
327+
matrix.from_blocks_smul]
328+
329+
lemma indefinite_diagonal_assoc :
330+
indefinite_diagonal ((punit : Type u₁) ⊕ l) l R =
331+
matrix.reindex_lie_equiv (equiv.sum_assoc punit l l).symm
332+
(matrix.from_blocks 1 0 0 (indefinite_diagonal l l R)) :=
333+
begin
334+
ext i j,
335+
rcases i with ⟨⟨i₁ | i₂⟩ | i₃⟩;
336+
rcases j with ⟨⟨j₁ | j₂⟩ | j₃⟩;
337+
simp [indefinite_diagonal, matrix.diagonal],
338+
end
339+
340+
/-- An equivalence between two possible definitions of the classical Lie algebra of type B. -/
341+
noncomputable def type_B_equiv_so' [invertible (2 : R)] :
342+
type_B l R ≃ₗ⁅R⁆ so' ((punit : Type u₁) ⊕ l) l R :=
343+
begin
344+
apply (skew_adjoint_matrices_lie_subalgebra_equiv (JB l R) (PB l R) (is_unit_PB l R)).trans,
345+
symmetry,
346+
apply (skew_adjoint_matrices_lie_subalgebra_equiv_transpose
347+
(indefinite_diagonal ((punit : Type u₁) ⊕ l) l R)
348+
(matrix.reindex_alg_equiv (equiv.sum_assoc punit l l)) (matrix.reindex_transpose _ _)).trans,
349+
apply lie_algebra.equiv.of_eq,
350+
ext A,
351+
rw [JB_transform, ← unit_of_invertible_val (2 : R), lie_subalgebra.mem_coe, lie_subalgebra.mem_coe,
352+
mem_skew_adjoint_matrices_lie_subalgebra_unit_smul],
353+
simpa [indefinite_diagonal_assoc],
354+
end
355+
356+
end orthogonal
357+
93358
end lie_algebra

src/algebra/lie_algebra.lean

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ def lie_subalgebra.map (f : L →ₗ⁅R⁆ L₂) (L' : lie_subalgebra R L) : li
502502

503503
@[simp] lemma lie_subalgebra.mem_map_submodule (e : L ≃ₗ⁅R⁆ L₂) (L' : lie_subalgebra R L) (x : L₂) :
504504
x ∈ L'.map (e : L →ₗ⁅R⁆ L₂) ↔ x ∈ (L' : submodule R L).map (e : L →ₗ[R] L₂) :=
505-
by refl
505+
iff.rfl
506506

507507
end lie_subalgebra
508508

@@ -763,6 +763,27 @@ def lie_conj : module.End R M₁ ≃ₗ⁅R⁆ module.End R M₂ :=
763763

764764
end linear_equiv
765765

766+
namespace alg_equiv
767+
768+
variables {R : Type u} {A₁ : Type v} {A₂ : Type w}
769+
variables [comm_ring R] [ring A₁] [ring A₂] [algebra R A₁] [algebra R A₂]
770+
variables (e : A₁ ≃ₐ[R] A₂)
771+
772+
local attribute [instance] lie_ring.of_associative_ring
773+
local attribute [instance] lie_algebra.of_associative_algebra
774+
775+
/-- An equivalence of associative algebras is an equivalence of associated Lie algebras. -/
776+
def to_lie_equiv : A₁ ≃ₗ⁅R⁆ A₂ :=
777+
{ to_fun := e.to_fun,
778+
map_lie := λ x y, by simp [lie_ring.of_associative_ring_bracket],
779+
..e.to_linear_equiv }
780+
781+
@[simp] lemma to_lie_equiv_apply (x : A₁) : e.to_lie_equiv x = e x := rfl
782+
783+
@[simp] lemma to_lie_equiv_symm_apply (x : A₂) : e.to_lie_equiv.symm x = e.symm x := rfl
784+
785+
end alg_equiv
786+
766787
section matrices
767788
open_locale matrix
768789

@@ -909,6 +930,10 @@ end
909930
def skew_adjoint_matrices_lie_subalgebra : lie_subalgebra R (matrix n n R) :=
910931
{ lie_mem := J.is_skew_adjoint_bracket, ..(skew_adjoint_matrices_submodule J) }
911932

933+
@[simp] lemma mem_skew_adjoint_matrices_lie_subalgebra (A : matrix n n R) :
934+
A ∈ skew_adjoint_matrices_lie_subalgebra J ↔ A ∈ skew_adjoint_matrices_submodule J :=
935+
iff.rfl
936+
912937
/-- An invertible matrix `P` gives a Lie algebra equivalence between those endomorphisms that are
913938
skew-adjoint with respect to a square matrix `J` and those with respect to `PᵀJP`. -/
914939
noncomputable def skew_adjoint_matrices_lie_subalgebra_equiv (P : matrix n n R) (h : is_unit P) :
@@ -928,4 +953,34 @@ lemma skew_adjoint_matrices_lie_subalgebra_equiv_apply
928953
↑(skew_adjoint_matrices_lie_subalgebra_equiv J P h A) = P⁻¹ ⬝ ↑A ⬝ P :=
929954
by simp [skew_adjoint_matrices_lie_subalgebra_equiv]
930955

956+
/-- An equivalence of matrix algebras commuting with the transpose endomorphisms restricts to an
957+
equivalence of Lie algebras of skew-adjoint matrices. -/
958+
def skew_adjoint_matrices_lie_subalgebra_equiv_transpose {m : Type w} [fintype m] [decidable_eq m]
959+
(e : matrix n n R ≃ₐ[R] matrix m m R) (h : ∀ A, (e A)ᵀ = e (Aᵀ)) :
960+
skew_adjoint_matrices_lie_subalgebra J ≃ₗ⁅R⁆ skew_adjoint_matrices_lie_subalgebra (e J) :=
961+
lie_algebra.equiv.of_subalgebras _ _ e.to_lie_equiv
962+
begin
963+
ext A,
964+
suffices : J.is_skew_adjoint (e.symm A) ↔ (e J).is_skew_adjoint A, by simpa [this],
965+
simp [matrix.is_skew_adjoint, matrix.is_adjoint_pair, ← matrix.mul_eq_mul,
966+
← h, ← function.injective.eq_iff e.injective],
967+
end
968+
969+
@[simp] lemma skew_adjoint_matrices_lie_subalgebra_equiv_transpose_apply
970+
{m : Type w} [fintype m] [decidable_eq m]
971+
(e : matrix n n R ≃ₐ[R] matrix m m R) (h : ∀ A, (e A)ᵀ = e (Aᵀ))
972+
(A : skew_adjoint_matrices_lie_subalgebra J) :
973+
(skew_adjoint_matrices_lie_subalgebra_equiv_transpose J e h A : matrix m m R) = e A :=
974+
rfl
975+
976+
lemma mem_skew_adjoint_matrices_lie_subalgebra_unit_smul (u : units R) (J A : matrix n n R) :
977+
A ∈ skew_adjoint_matrices_lie_subalgebra ((u : R) • J) ↔ A ∈ skew_adjoint_matrices_lie_subalgebra J :=
978+
begin
979+
change A ∈ skew_adjoint_matrices_submodule ((u : R) • J) ↔ A ∈ skew_adjoint_matrices_submodule J,
980+
simp only [mem_skew_adjoint_matrices_submodule, matrix.is_skew_adjoint, matrix.is_adjoint_pair],
981+
split; intros h,
982+
{ simpa using congr_arg (λ B, (↑u⁻¹ : R) • B) h, },
983+
{ simp [h], },
984+
end
985+
931986
end skew_adjoint_matrices

0 commit comments

Comments
 (0)