Skip to content

Commit 8ac39d0

Browse files
committed
chore(Analysis/InnerProductAlgebra/Projection): adding norm and other results for Submodule.starProjection (#27317)
Analogue results for `Submodule.starProjection`.
1 parent d6726be commit 8ac39d0

File tree

1 file changed

+75
-2
lines changed

1 file changed

+75
-2
lines changed

Mathlib/Analysis/InnerProductSpace/Projection.lean

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,10 @@ theorem orthogonalProjection_mem_subspace_eq_self (v : K) : K.orthogonalProjecti
588588
ext
589589
apply eq_starProjection_of_mem_of_inner_eq_zero <;> simp
590590

591+
@[simp]
592+
theorem starProjection_mem_subspace_eq_self (v : K) :
593+
K.starProjection v = v := by simp [starProjection_apply]
594+
591595
/-- A point equals its orthogonal projection if and only if it lies in the subspace. -/
592596
theorem starProjection_eq_self_iff {v : E} : K.starProjection v = v ↔ v ∈ K := by
593597
refine ⟨fun h => ?_, fun h => eq_starProjection_of_mem_of_inner_eq_zero h ?_⟩
@@ -684,22 +688,36 @@ variable (K)
684688
theorem orthogonalProjection_norm_le : ‖K.orthogonalProjection‖ ≤ 1 :=
685689
LinearMap.mkContinuous_norm_le _ (by norm_num) _
686690

691+
theorem starProjection_norm_le : ‖K.starProjection‖ ≤ 1 :=
692+
K.orthogonalProjection_norm_le
693+
687694
theorem norm_orthogonalProjection_apply {v : E} (hv : v ∈ K) :
688695
‖orthogonalProjection K v‖ = ‖v‖ :=
689696
congr(‖$(K.starProjection_eq_self_iff.mpr hv)‖)
690697

698+
theorem norm_starProjection_apply {v : E} (hv : v ∈ K) :
699+
‖K.starProjection v‖ = ‖v‖ :=
700+
norm_orthogonalProjection_apply _ hv
701+
691702
/-- The orthogonal projection onto a closed subspace is norm non-increasing. -/
692703
theorem norm_orthogonalProjection_apply_le (v : E) :
693704
‖orthogonalProjection K v‖ ≤ ‖v‖ := by calc
694705
‖orthogonalProjection K v‖ ≤ ‖orthogonalProjection K‖ * ‖v‖ := K.orthogonalProjection.le_opNorm _
695706
_ ≤ 1 * ‖v‖ := by gcongr; exact orthogonalProjection_norm_le K
696707
_ = _ := by simp
697708

709+
theorem norm_starProjection_apply_le (v : E) :
710+
‖K.starProjection v‖ ≤ ‖v‖ := K.norm_orthogonalProjection_apply_le v
711+
698712
/-- The orthogonal projection onto a closed subspace is a `1`-Lipschitz map. -/
699713
theorem lipschitzWith_orthogonalProjection :
700714
LipschitzWith 1 (orthogonalProjection K) :=
701715
ContinuousLinearMap.lipschitzWith_of_opNorm_le (orthogonalProjection_norm_le K)
702716

717+
theorem lipschitzWith_starProjection :
718+
LipschitzWith 1 K.starProjection :=
719+
ContinuousLinearMap.lipschitzWith_of_opNorm_le (starProjection_norm_le K)
720+
703721
/-- The operator norm of the orthogonal projection onto a nontrivial subspace is `1`. -/
704722
theorem norm_orthogonalProjection (hK : K ≠ ⊥) :
705723
‖K.orthogonalProjection‖ = 1 := by
@@ -708,6 +726,10 @@ theorem norm_orthogonalProjection (hK : K ≠ ⊥) :
708726
simpa [K.norm_orthogonalProjection_apply hxK, norm_eq_zero, hx_ne_zero]
709727
using K.orthogonalProjection.ratio_le_opNorm x
710728

729+
theorem norm_starProjection (hK : K ≠ ⊥) :
730+
‖K.starProjection‖ = 1 :=
731+
K.norm_orthogonalProjection hK
732+
711733
variable (𝕜)
712734

713735
theorem smul_starProjection_singleton {v : E} (w : E) :
@@ -959,6 +981,13 @@ theorem IsOrtho.orthogonalProjection_comp_subtypeL {U V : Submodule 𝕜 E}
959981
ContinuousLinearMap.ext fun v =>
960982
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero <| h.symm v.prop
961983

984+
theorem IsOrtho.starProjection_comp_starProjection {U V : Submodule 𝕜 E}
985+
[U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ⟂ V) :
986+
U.starProjection ∘L V.starProjection = 0 :=
987+
calc _ = U.subtypeL ∘L (U.orthogonalProjection ∘L V.subtypeL) ∘L V.orthogonalProjection := by
988+
simp only [starProjection, ContinuousLinearMap.comp_assoc]
989+
_ = 0 := by simp [h.orthogonalProjection_comp_subtypeL]
990+
962991
/-- The projection into `U` from `V` is the zero map if and only if `U` and `V` are orthogonal. -/
963992
theorem orthogonalProjection_comp_subtypeL_eq_zero_iff {U V : Submodule 𝕜 E}
964993
[U.HasOrthogonalProjection] : U.orthogonalProjection ∘L V.subtypeL = 0 ↔ U ⟂ V :=
@@ -968,6 +997,17 @@ theorem orthogonalProjection_comp_subtypeL_eq_zero_iff {U V : Submodule 𝕜 E}
968997
rw [starProjection_apply, this, Submodule.coe_zero, sub_zero],
969998
Submodule.IsOrtho.orthogonalProjection_comp_subtypeL⟩
970999

1000+
/-- `U.starProjection ∘ V.starProjection = 0` iff `U` and `V` are pairwise orthogonal. -/
1001+
theorem starProjection_comp_starProjection_eq_zero_iff {U V : Submodule 𝕜 E}
1002+
[U.HasOrthogonalProjection] [V.HasOrthogonalProjection] :
1003+
U.starProjection ∘L V.starProjection = 0 ↔ U ⟂ V := by
1004+
refine ⟨fun h => ?_, fun h => h.starProjection_comp_starProjection⟩
1005+
rw [← orthogonalProjection_comp_subtypeL_eq_zero_iff]
1006+
simp only [ContinuousLinearMap.ext_iff, ContinuousLinearMap.comp_apply, subtypeL_apply,
1007+
starProjection_apply, ContinuousLinearMap.zero_apply, coe_eq_zero] at h ⊢
1008+
intro x
1009+
simpa using h (x : E)
1010+
9711011
theorem orthogonalProjection_eq_linear_proj [K.HasOrthogonalProjection] (x : E) :
9721012
K.orthogonalProjection x =
9731013
K.linearProjOfIsCompl _ Submodule.isCompl_orthogonal_of_completeSpace x := by
@@ -988,10 +1028,20 @@ theorem reflection_mem_subspace_orthogonalComplement_eq_neg [K.HasOrthogonalProj
9881028
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero hv]
9891029

9901030
/-- The orthogonal projection onto `Kᗮ` of an element of `K` is zero. -/
991-
theorem orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero
1031+
theorem orthogonalProjection_orthogonal_apply_eq_zero
9921032
[Kᗮ.HasOrthogonalProjection] {v : E} (hv : v ∈ K) : Kᗮ.orthogonalProjection v = 0 :=
9931033
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero (K.le_orthogonal_orthogonal hv)
9941034

1035+
@[deprecated (since := "22-07-2025")] alias
1036+
orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero :=
1037+
orthogonalProjection_orthogonal_apply_eq_zero
1038+
1039+
theorem starProjection_orthogonal_apply_eq_zero
1040+
[Kᗮ.HasOrthogonalProjection] {v : E} (hv : v ∈ K) :
1041+
Kᗮ.starProjection v = 0 := by
1042+
rw [starProjection_apply, coe_eq_zero]
1043+
exact orthogonalProjection_orthogonal_apply_eq_zero hv
1044+
9951045
/-- If `U ≤ V`, then projecting on `V` and then on `U` is the same as projecting on `U`. -/
9961046
theorem orthogonalProjection_starProjection_of_le {U V : Submodule 𝕜 E}
9971047
[U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ≤ V) (x : E) :
@@ -1004,6 +1054,12 @@ theorem orthogonalProjection_starProjection_of_le {U V : Submodule 𝕜 E}
10041054
@[deprecated (since := "2025-07-07")] alias orthogonalProjection_orthogonalProjection_of_le :=
10051055
orthogonalProjection_starProjection_of_le
10061056

1057+
theorem starProjection_comp_starProjection_of_le {U V : Submodule 𝕜 E}
1058+
[U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ≤ V) :
1059+
U.starProjection ∘L V.starProjection = U.starProjection := ContinuousLinearMap.ext fun _ => by
1060+
nth_rw 1 [starProjection]
1061+
simp [orthogonalProjection_starProjection_of_le h]
1062+
10071063
/-- Given a monotone family `U` of complete submodules of `E` and a fixed `x : E`,
10081064
the orthogonal projection of `x` on `U i` tends to the orthogonal projection of `x` on
10091065
`(⨆ i, U i).topologicalClosure` along `atTop`. -/
@@ -1116,9 +1172,14 @@ theorem reflection_mem_subspace_orthogonal_precomplement_eq_neg [K.HasOrthogonal
11161172
/-- The orthogonal projection onto `(𝕜 ∙ v)ᗮ` of `v` is zero. -/
11171173
theorem orthogonalProjection_orthogonalComplement_singleton_eq_zero (v : E) :
11181174
(𝕜 ∙ v)ᗮ.orthogonalProjection v = 0 :=
1119-
orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero
1175+
orthogonalProjection_orthogonal_apply_eq_zero
11201176
(Submodule.mem_span_singleton_self v)
11211177

1178+
theorem starProjection_orthogonalComplement_singleton_eq_zero (v : E) :
1179+
(𝕜 ∙ v)ᗮ.starProjection v = 0 := by
1180+
rw [starProjection_apply, coe_eq_zero]
1181+
exact orthogonalProjection_orthogonalComplement_singleton_eq_zero v
1182+
11221183
/-- The reflection in `(𝕜 ∙ v)ᗮ` of `v` is `-v`. -/
11231184
theorem reflection_orthogonalComplement_singleton_eq_neg (v : E) : reflection (𝕜 ∙ v)ᗮ v = -v :=
11241185
reflection_mem_subspace_orthogonal_precomplement_eq_neg (Submodule.mem_span_singleton_self v)
@@ -1195,6 +1256,11 @@ theorem norm_sq_eq_add_norm_sq_projection (x : E) (S : Submodule 𝕜 E) [S.HasO
11951256
exact norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero _ _ <|
11961257
(S.mem_orthogonal _).1 (Sᗮ.orthogonalProjection x).2 _ (S.orthogonalProjection x).2
11971258

1259+
theorem norm_sq_eq_add_norm_sq_starProjection (x : E) (S : Submodule 𝕜 E)
1260+
[S.HasOrthogonalProjection] :
1261+
‖x‖ ^ 2 = ‖S.starProjection x‖ ^ 2 + ‖Sᗮ.starProjection x‖ ^ 2 :=
1262+
norm_sq_eq_add_norm_sq_projection x S
1263+
11981264
/-- In a complete space `E`, the projection maps onto a complete subspace `K` and its orthogonal
11991265
complement sum to the identity. -/
12001266
theorem id_eq_sum_starProjection_self_orthogonalComplement [K.HasOrthogonalProjection] :
@@ -1240,6 +1306,13 @@ theorem starProjection_isSymmetric [K.HasOrthogonalProjection] :
12401306
@[deprecated (since := "2025-07-07")] alias
12411307
orthogonalProjection_isSymmetric := starProjection_isSymmetric
12421308

1309+
theorem starProjection_apply_eq_zero_iff [K.HasOrthogonalProjection] {v : E} :
1310+
K.starProjection v = 0 ↔ v ∈ Kᗮ := by
1311+
refine ⟨fun h w hw => ?_, fun hv => ?_⟩
1312+
· rw [← starProjection_eq_self_iff.mpr hw, inner_starProjection_left_eq_right, h,
1313+
inner_zero_right]
1314+
· simp [starProjection_apply, orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero hv]
1315+
12431316
lemma re_inner_starProjection_eq_normSq [K.HasOrthogonalProjection] (v : E) :
12441317
re ⟪K.starProjection v, v⟫ = ‖K.orthogonalProjection v‖^2 := by
12451318
rw [starProjection_apply,

0 commit comments

Comments
 (0)