Skip to content

Commit 70b6992

Browse files
committed
feat: Generalize quadratic isometries to quadratic maps (#14719)
Also `.prod` and `.pi`, since these are heavily entangled with `Isometry` and `IsometryEquiv`. Follows on from #7569.
1 parent a721a5b commit 70b6992

File tree

11 files changed

+140
-135
lines changed

11 files changed

+140
-135
lines changed

Mathlib/LinearAlgebra/CliffordAlgebra/Basic.lean

+4-4
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ theorem map_apply_ι (f : Q₁ →qᵢ Q₂) (m : M₁) : map f (ι Q₁ m) = ι
333333

334334
variable (Q₁) in
335335
@[simp]
336-
theorem map_id : map (QuadraticForm.Isometry.id Q₁) = AlgHom.id R (CliffordAlgebra Q₁) := by
336+
theorem map_id : map (QuadraticMap.Isometry.id Q₁) = AlgHom.id R (CliffordAlgebra Q₁) := by
337337
ext m; exact map_apply_ι _ m
338338
#align clifford_algebra.map_id CliffordAlgebra.map_id
339339

@@ -342,7 +342,7 @@ theorem map_comp_map (f : Q₂ →qᵢ Q₃) (g : Q₁ →qᵢ Q₂) :
342342
(map f).comp (map g) = map (f.comp g) := by
343343
ext m
344344
dsimp only [LinearMap.comp_apply, AlgHom.comp_apply, AlgHom.toLinearMap_apply, AlgHom.id_apply]
345-
rw [map_apply_ι, map_apply_ι, map_apply_ι, QuadraticForm.Isometry.comp_apply]
345+
rw [map_apply_ι, map_apply_ι, map_apply_ι, QuadraticMap.Isometry.comp_apply]
346346
#align clifford_algebra.map_comp_map CliffordAlgebra.map_comp_map
347347

348348
@[simp]
@@ -358,7 +358,7 @@ is a retraction of `CliffordAlgebra.map f`. -/
358358
lemma leftInverse_map_of_leftInverse {Q₁ : QuadraticForm R M₁} {Q₂ : QuadraticForm R M₂}
359359
(f : Q₁ →qᵢ Q₂) (g : Q₂ →qᵢ Q₁) (h : LeftInverse g f) : LeftInverse (map g) (map f) := by
360360
refine fun x => ?_
361-
replace h : g.comp f = QuadraticForm.Isometry.id Q₁ := DFunLike.ext _ _ h
361+
replace h : g.comp f = QuadraticMap.Isometry.id Q₁ := DFunLike.ext _ _ h
362362
rw [← AlgHom.comp_apply, map_comp_map, h, map_id, AlgHom.coe_id, id_eq]
363363

364364
/-- If a linear map preserves the quadratic forms and is surjective, then the algebra
@@ -401,7 +401,7 @@ theorem equivOfIsometry_trans (e₁₂ : Q₁.IsometryEquiv Q₂) (e₂₃ : Q
401401

402402
@[simp]
403403
theorem equivOfIsometry_refl :
404-
(equivOfIsometry <| QuadraticForm.IsometryEquiv.refl Q₁) = AlgEquiv.refl := by
404+
(equivOfIsometry <| QuadraticMap.IsometryEquiv.refl Q₁) = AlgEquiv.refl := by
405405
ext x
406406
exact AlgHom.congr_fun (map_id Q₁) x
407407
#align clifford_algebra.equiv_of_isometry_refl CliffordAlgebra.equivOfIsometry_refl

Mathlib/LinearAlgebra/CliffordAlgebra/Equivs.lean

+1-2
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ variable {R : Type*} [CommRing R] (c₁ c₂ : R)
259259
/-- `Q c₁ c₂` is a quadratic form over `R × R` such that `CliffordAlgebra (Q c₁ c₂)` is isomorphic
260260
as an `R`-algebra to `ℍ[R,c₁,c₂]`. -/
261261
def Q : QuadraticForm R (R × R) :=
262-
-- Porting note: Added `(R := R)`
263-
QuadraticForm.prod (c₁ • QuadraticMap.sq (R := R)) (c₂ • QuadraticMap.sq)
262+
(c₁ • QuadraticMap.sq).prod (c₂ • QuadraticMap.sq)
264263
set_option linter.uppercaseLean3 false in
265264
#align clifford_algebra_quaternion.Q CliffordAlgebraQuaternion.Q
266265

Mathlib/LinearAlgebra/CliffordAlgebra/Prod.lean

+4-4
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def ofProd : CliffordAlgebra (Q₁.prod Q₂) →ₐ[R] (evenOdd Q₁ ᵍ⊗[R]
115115
∘ₗ (evenOdd Q₂ 1).subtype ∘ₗ (ι Q₂).codRestrict _ (ι_mem_evenOdd_one Q₂)),
116116
fun m => by
117117
simp_rw [LinearMap.coprod_apply, LinearMap.coe_comp, Function.comp_apply,
118-
AlgHom.toLinearMap_apply, QuadraticForm.prod_apply, Submodule.coeSubtype,
118+
AlgHom.toLinearMap_apply, QuadraticMap.prod_apply, Submodule.coeSubtype,
119119
GradedTensorProduct.includeLeft_apply, GradedTensorProduct.includeRight_apply, map_add,
120120
add_mul, mul_add, GradedTensorProduct.algebraMap_def,
121121
GradedTensorProduct.tmul_one_mul_one_tmul, GradedTensorProduct.tmul_one_mul_coe_tmul,
@@ -135,18 +135,18 @@ def toProd : evenOdd Q₁ ᵍ⊗[R] evenOdd Q₂ →ₐ[R] CliffordAlgebra (Q₁
135135
GradedTensorProduct.lift _ _
136136
(CliffordAlgebra.map <| .inl _ _)
137137
(CliffordAlgebra.map <| .inr _ _)
138-
fun _i₁ _i₂ x₁ x₂ => map_mul_map_of_isOrtho_of_mem_evenOdd _ _ (QuadraticForm.IsOrtho.inl_inr) _
138+
fun _i₁ _i₂ x₁ x₂ => map_mul_map_of_isOrtho_of_mem_evenOdd _ _ (QuadraticMap.IsOrtho.inl_inr) _
139139
_ x₁.prop x₂.prop
140140

141141
@[simp]
142142
lemma toProd_ι_tmul_one (m₁ : M₁) : toProd Q₁ Q₂ (ι _ m₁ ᵍ⊗ₜ 1) = ι _ (m₁, 0) := by
143143
rw [toProd, GradedTensorProduct.lift_tmul, map_one, mul_one, map_apply_ι,
144-
QuadraticForm.Isometry.inl_apply]
144+
QuadraticMap.Isometry.inl_apply]
145145

146146
@[simp]
147147
lemma toProd_one_tmul_ι (m₂ : M₂) : toProd Q₁ Q₂ (1 ᵍ⊗ₜ ι _ m₂) = ι _ (0, m₂) := by
148148
rw [toProd, GradedTensorProduct.lift_tmul, map_one, one_mul, map_apply_ι,
149-
QuadraticForm.Isometry.inr_apply]
149+
QuadraticMap.Isometry.inr_apply]
150150

151151
lemma toProd_comp_ofProd : (toProd Q₁ Q₂).comp (ofProd Q₁ Q₂) = AlgHom.id _ _ := by
152152
ext m <;> dsimp

Mathlib/LinearAlgebra/QuadraticForm/Complex.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ noncomputable def isometryEquivSumSquares (w' : ι → ℂ) :
3434
have hw' : ∀ i : ι, (w i : ℂ) ^ (-(1 / 2 : ℂ)) ≠ 0 := by
3535
intro i hi
3636
exact (w i).ne_zero ((Complex.cpow_eq_zero_iff _ _).1 hi).1
37-
convert QuadraticForm.isometryEquivBasisRepr (weightedSumSquares ℂ w')
37+
convert QuadraticMap.isometryEquivBasisRepr (weightedSumSquares ℂ w')
3838
((Pi.basisFun ℂ ι).unitsSMul fun i => (isUnit_iff_ne_zero.2 <| hw' i).unit)
3939
ext1 v
4040
erw [basisRepr_apply, weightedSumSquares_apply, weightedSumSquares_apply]

Mathlib/LinearAlgebra/QuadraticForm/Dual.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def toDualProd (Q : QuadraticForm R M) [Invertible (2 : R)] :
154154
sub_eq_add_neg (Q x.1) (Q x.2)]
155155
#align quadratic_form.to_dual_prod QuadraticForm.toDualProdₓ
156156

157-
#align quadratic_form.to_dual_prod_isometry QuadraticForm.Isometry.map_appₓ
157+
#align quadratic_form.to_dual_prod_isometry QuadraticMap.Isometry.map_appₓ
158158

159159
/-!
160160
TODO: show that `QuadraticForm.toDualProd` is an `QuadraticForm.IsometryEquiv`

Mathlib/LinearAlgebra/QuadraticForm/Isometry.lean

+13-12
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,26 @@ import Mathlib.LinearAlgebra.QuadraticForm.Basic
1010
1111
## Main definitions
1212
13-
* `QuadraticForm.Isometry`: `LinearMap`s which map between two different quadratic forms
13+
* `QuadraticMap.Isometry`: `LinearMap`s which map between two different quadratic forms
1414
1515
## Notation
1616
1717
`Q₁ →qᵢ Q₂` is notation for `Q₁.Isometry Q₂`.
1818
-/
1919

20-
variable {ι R M M₁ M₂ M₃ M₄ : Type*}
20+
variable {ι R M M₁ M₂ M₃ M₄ N : Type*}
2121

22-
namespace QuadraticForm
22+
namespace QuadraticMap
2323

2424
variable [CommSemiring R]
2525
variable [AddCommMonoid M]
2626
variable [AddCommMonoid M₁] [AddCommMonoid M₂] [AddCommMonoid M₃] [AddCommMonoid M₄]
27-
variable [Module R M] [Module R M₁] [Module R M₂] [Module R M₃] [Module R M₄]
27+
variable [AddCommMonoid N]
28+
variable [Module R M] [Module R M₁] [Module R M₂] [Module R M₃] [Module R M₄] [Module R N]
2829

2930
/-- An isometry between two quadratic spaces `M₁, Q₁` and `M₂, Q₂` over a ring `R`,
3031
is a linear map between `M₁` and `M₂` that commutes with the quadratic forms. -/
31-
structure Isometry (Q₁ : QuadraticForm R M₁) (Q₂ : QuadraticForm R M₂) extends M₁ →ₗ[R] M₂ where
32+
structure Isometry (Q₁ : QuadraticMap R M₁ N) (Q₂ : QuadraticMap R M₂ N) extends M₁ →ₗ[R] M₂ where
3233
/-- The quadratic form agrees across the map. -/
3334
map_app' : ∀ m, Q₂ (toFun m) = Q₁ m
3435

@@ -37,8 +38,8 @@ namespace Isometry
3738
@[inherit_doc]
3839
notation:25 Q₁ " →qᵢ " Q₂:0 => Isometry Q₁ Q₂
3940

40-
variable {Q₁ : QuadraticForm R M₁} {Q₂ : QuadraticForm R M₂}
41-
variable {Q₃ : QuadraticForm R M₃} {Q₄ : QuadraticForm R M₄}
41+
variable {Q₁ : QuadraticMap R M₁ N} {Q₂ : QuadraticMap R M₂ N}
42+
variable {Q₃ : QuadraticMap R M₃ N} {Q₄ : QuadraticMap R M₄ N}
4243

4344
instance instFunLike : FunLike (Q₁ →qᵢ Q₂) M₁ M₂ where
4445
coe f := f.toLinearMap
@@ -71,18 +72,18 @@ theorem coe_toLinearMap (f : Q₁ →qᵢ Q₂) : ⇑f.toLinearMap = f :=
7172

7273
/-- The identity isometry from a quadratic form to itself. -/
7374
@[simps!]
74-
def id (Q : QuadraticForm R M) : Q →qᵢ Q where
75+
def id (Q : QuadraticMap R M N) : Q →qᵢ Q where
7576
__ := LinearMap.id
7677
map_app' _ := rfl
7778

7879
/-- The identity isometry between equal quadratic forms. -/
7980
@[simps!]
80-
def ofEq {Q₁ Q₂ : QuadraticForm R M₁} (h : Q₁ = Q₂) : Q₁ →qᵢ Q₂ where
81+
def ofEq {Q₁ Q₂ : QuadraticMap R M₁ N} (h : Q₁ = Q₂) : Q₁ →qᵢ Q₂ where
8182
__ := LinearMap.id
8283
map_app' _ := h ▸ rfl
8384

8485
@[simp]
85-
theorem ofEq_rfl {Q : QuadraticForm R M₁} : ofEq (rfl : Q = Q) = .id Q := rfl
86+
theorem ofEq_rfl {Q : QuadraticMap R M₁ N} : ofEq (rfl : Q = Q) = .id Q := rfl
8687

8788
/-- The composition of two isometries between quadratic forms. -/
8889
@[simps]
@@ -109,7 +110,7 @@ theorem comp_assoc (h : Q₃ →qᵢ Q₄) (g : Q₂ →qᵢ Q₃) (f : Q₁ →
109110
ext fun _ => rfl
110111

111112
/-- There is a zero map from any module with the zero form. -/
112-
instance : Zero ((0 : QuadraticForm R M₁) →qᵢ Q₂) where
113+
instance : Zero ((0 : QuadraticMap R M₁ N) →qᵢ Q₂) where
113114
zero := { (0 : M₁ →ₗ[R] M₂) with map_app' := fun _ => map_zero _ }
114115

115116
/-- There is a zero map from the trivial module. -/
@@ -124,4 +125,4 @@ instance [Subsingleton M₂] : Subsingleton (Q₁ →qᵢ Q₂) :=
124125

125126
end Isometry
126127

127-
end QuadraticForm
128+
end QuadraticMap

Mathlib/LinearAlgebra/QuadraticForm/IsometryEquiv.lean

+27-24
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,34 @@ import Mathlib.LinearAlgebra.QuadraticForm.Isometry
2323
-/
2424

2525

26-
variable {ι R K M M₁ M₂ M₃ V : Type*}
26+
variable {ι R K M M₁ M₂ M₃ V N : Type*}
2727

2828
open QuadraticMap
2929

30-
namespace QuadraticForm
30+
namespace QuadraticMap
3131

3232
variable [CommSemiring R]
33-
variable [AddCommMonoid M] [AddCommMonoid M₁] [AddCommMonoid M₂] [AddCommMonoid M₃]
34-
variable [Module R M] [Module R M₁] [Module R M₂] [Module R M₃]
33+
variable [AddCommMonoid M] [AddCommMonoid M₁] [AddCommMonoid M₂] [AddCommMonoid M₃] [AddCommMonoid N]
34+
variable [Module R M] [Module R M₁] [Module R M₂] [Module R M₃] [Module R N]
3535

3636
/-- An isometric equivalence between two quadratic spaces `M₁, Q₁` and `M₂, Q₂` over a ring `R`,
3737
is a linear equivalence between `M₁` and `M₂` that commutes with the quadratic forms. -/
3838
-- Porting note(#5171): linter not ported yet @[nolint has_nonempty_instance]
39-
structure IsometryEquiv (Q₁ : QuadraticForm R M₁) (Q₂ : QuadraticForm R M₂)
39+
structure IsometryEquiv (Q₁ : QuadraticMap R M₁ N) (Q₂ : QuadraticMap R M₂ N)
4040
extends M₁ ≃ₗ[R] M₂ where
4141
map_app' : ∀ m, Q₂ (toFun m) = Q₁ m
42-
#align quadratic_form.isometry QuadraticForm.IsometryEquiv
42+
#align quadratic_form.isometry QuadraticMap.IsometryEquiv
4343

4444
/-- Two quadratic forms over a ring `R` are equivalent
4545
if there exists an isometric equivalence between them:
4646
a linear equivalence that transforms one quadratic form into the other. -/
47-
def Equivalent (Q₁ : QuadraticForm R M₁) (Q₂ : QuadraticForm R M₂) : Prop :=
47+
def Equivalent (Q₁ : QuadraticMap R M₁ N) (Q₂ : QuadraticMap R M₂ N) : Prop :=
4848
Nonempty (Q₁.IsometryEquiv Q₂)
49-
#align quadratic_form.equivalent QuadraticForm.Equivalent
49+
#align quadratic_form.equivalent QuadraticMap.Equivalent
5050

5151
namespace IsometryEquiv
5252

53-
variable {Q₁ : QuadraticForm R M₁} {Q₂ : QuadraticForm R M₂} {Q₃ : QuadraticForm R M₃}
53+
variable {Q₁ : QuadraticMap R M₁ N} {Q₂ : QuadraticMap R M₂ N} {Q₃ : QuadraticMap R M₃ N}
5454

5555
instance : EquivLike (Q₁.IsometryEquiv Q₂) M₁ M₂ where
5656
coe f := f.toLinearEquiv
@@ -73,32 +73,32 @@ instance : CoeOut (Q₁.IsometryEquiv Q₂) (M₁ ≃ₗ[R] M₂) :=
7373
@[simp]
7474
theorem coe_toLinearEquiv (f : Q₁.IsometryEquiv Q₂) : ⇑(f : M₁ ≃ₗ[R] M₂) = f :=
7575
rfl
76-
#align quadratic_form.isometry.coe_to_linear_equiv QuadraticForm.IsometryEquiv.coe_toLinearEquiv
76+
#align quadratic_form.isometry.coe_to_linear_equiv QuadraticMap.IsometryEquiv.coe_toLinearEquiv
7777

7878
@[simp]
7979
theorem map_app (f : Q₁.IsometryEquiv Q₂) (m : M₁) : Q₂ (f m) = Q₁ m :=
8080
f.map_app' m
81-
#align quadratic_form.isometry.map_app QuadraticForm.IsometryEquiv.map_app
81+
#align quadratic_form.isometry.map_app QuadraticMap.IsometryEquiv.map_app
8282

8383
/-- The identity isometric equivalence between a quadratic form and itself. -/
8484
@[refl]
85-
def refl (Q : QuadraticForm R M) : Q.IsometryEquiv Q :=
85+
def refl (Q : QuadraticMap R M N) : Q.IsometryEquiv Q :=
8686
{ LinearEquiv.refl R M with map_app' := fun _ => rfl }
87-
#align quadratic_form.isometry.refl QuadraticForm.IsometryEquiv.refl
87+
#align quadratic_form.isometry.refl QuadraticMap.IsometryEquiv.refl
8888

8989
/-- The inverse isometric equivalence of an isometric equivalence between two quadratic forms. -/
9090
@[symm]
9191
def symm (f : Q₁.IsometryEquiv Q₂) : Q₂.IsometryEquiv Q₁ :=
9292
{ (f : M₁ ≃ₗ[R] M₂).symm with
9393
map_app' := by intro m; rw [← f.map_app]; congr; exact f.toLinearEquiv.apply_symm_apply m }
94-
#align quadratic_form.isometry.symm QuadraticForm.IsometryEquiv.symm
94+
#align quadratic_form.isometry.symm QuadraticMap.IsometryEquiv.symm
9595

9696
/-- The composition of two isometric equivalences between quadratic forms. -/
9797
@[trans]
9898
def trans (f : Q₁.IsometryEquiv Q₂) (g : Q₂.IsometryEquiv Q₃) : Q₁.IsometryEquiv Q₃ :=
9999
{ (f : M₁ ≃ₗ[R] M₂).trans (g : M₂ ≃ₗ[R] M₃) with
100100
map_app' := by intro m; rw [← f.map_app, ← g.map_app]; rfl }
101-
#align quadratic_form.isometry.trans QuadraticForm.IsometryEquiv.trans
101+
#align quadratic_form.isometry.trans QuadraticMap.IsometryEquiv.trans
102102

103103
/-- Isometric equivalences are isometric maps -/
104104
@[simps]
@@ -110,43 +110,46 @@ end IsometryEquiv
110110

111111
namespace Equivalent
112112

113-
variable {Q₁ : QuadraticForm R M₁} {Q₂ : QuadraticForm R M₂} {Q₃ : QuadraticForm R M₃}
113+
variable {Q₁ : QuadraticMap R M₁ N} {Q₂ : QuadraticMap R M₂ N} {Q₃ : QuadraticMap R M₃ N}
114114

115115
@[refl]
116-
theorem refl (Q : QuadraticForm R M) : Q.Equivalent Q :=
116+
theorem refl (Q : QuadraticMap R M N) : Q.Equivalent Q :=
117117
⟨IsometryEquiv.refl Q⟩
118-
#align quadratic_form.equivalent.refl QuadraticForm.Equivalent.refl
118+
#align quadratic_form.equivalent.refl QuadraticMap.Equivalent.refl
119119

120120
@[symm]
121121
theorem symm (h : Q₁.Equivalent Q₂) : Q₂.Equivalent Q₁ :=
122122
h.elim fun f => ⟨f.symm⟩
123-
#align quadratic_form.equivalent.symm QuadraticForm.Equivalent.symm
123+
#align quadratic_form.equivalent.symm QuadraticMap.Equivalent.symm
124124

125125
@[trans]
126126
theorem trans (h : Q₁.Equivalent Q₂) (h' : Q₂.Equivalent Q₃) : Q₁.Equivalent Q₃ :=
127127
h'.elim <| h.elim fun f g => ⟨f.trans g⟩
128-
#align quadratic_form.equivalent.trans QuadraticForm.Equivalent.trans
128+
#align quadratic_form.equivalent.trans QuadraticMap.Equivalent.trans
129129

130130
end Equivalent
131131

132132
/-- A quadratic form composed with a `LinearEquiv` is isometric to itself. -/
133-
def isometryEquivOfCompLinearEquiv (Q : QuadraticForm R M) (f : M₁ ≃ₗ[R] M) :
133+
def isometryEquivOfCompLinearEquiv (Q : QuadraticMap R M N) (f : M₁ ≃ₗ[R] M) :
134134
Q.IsometryEquiv (Q.comp (f : M₁ →ₗ[R] M)) :=
135135
{ f.symm with
136136
map_app' := by
137137
intro
138138
simp only [comp_apply, LinearEquiv.coe_coe, LinearEquiv.toFun_eq_coe,
139139
LinearEquiv.apply_symm_apply, f.apply_symm_apply] }
140-
#align quadratic_form.isometry_of_comp_linear_equiv QuadraticForm.isometryEquivOfCompLinearEquiv
140+
#align quadratic_form.isometry_of_comp_linear_equiv QuadraticMap.isometryEquivOfCompLinearEquiv
141141

142142
variable [Finite ι]
143143

144144
/-- A quadratic form is isometrically equivalent to its bases representations. -/
145-
noncomputable def isometryEquivBasisRepr (Q : QuadraticForm R M) (v : Basis ι R M) :
145+
noncomputable def isometryEquivBasisRepr (Q : QuadraticMap R M N) (v : Basis ι R M) :
146146
IsometryEquiv Q (Q.basisRepr v) :=
147147
isometryEquivOfCompLinearEquiv Q v.equivFun.symm
148-
#align quadratic_form.isometry_basis_repr QuadraticForm.isometryEquivBasisRepr
148+
#align quadratic_form.isometry_basis_repr QuadraticMap.isometryEquivBasisRepr
149+
150+
end QuadraticMap
149151

152+
namespace QuadraticForm
150153
variable [Field K] [Invertible (2 : K)] [AddCommGroup V] [Module K V]
151154

152155
/-- Given an orthogonal basis, a quadratic form is isometrically equivalent with a weighted sum of

0 commit comments

Comments
 (0)