Theorem: norm_sq_eq_add_norm_sq_projection
File: Mathlib/Analysis/InnerProductSpace/Projection.lean

tactic: let p1 := orthogonalProjection S
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
⊢ ‖x‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2

tactic: let p2 := orthogonalProjection Sᗮ
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
p1 : E →L[𝕜] { x // x ∈ S } := orthogonalProjection S
⊢ ‖x‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2

tactic: have x_decomp : x = p1 x + p2 x := eq_sum_orthogonalProjection_self_orthogonalComplement S x
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
p1 : E →L[𝕜] { x // x ∈ S } := orthogonalProjection S
p2 : E →L[𝕜] { x // x ∈ Sᗮ } := orthogonalProjection Sᗮ
⊢ ‖x‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2

tactic: have x_orth : ⟪(p1 x : E), p2 x⟫ = 0 :=
  Submodule.inner_right_of_mem_orthogonal (SetLike.coe_mem (p1 x)) (SetLike.coe_mem (p2 x))
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
p1 : E →L[𝕜] { x // x ∈ S } := orthogonalProjection S
p2 : E →L[𝕜] { x // x ∈ Sᗮ } := orthogonalProjection Sᗮ
x_decomp : x = ↑(↑p1 x) + ↑(↑p2 x)
⊢ ‖x‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2

tactic: nth_rw 1 [x_decomp]
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
p1 : E →L[𝕜] { x // x ∈ S } := orthogonalProjection S
p2 : E →L[𝕜] { x // x ∈ Sᗮ } := orthogonalProjection Sᗮ
x_decomp : x = ↑(↑p1 x) + ↑(↑p2 x)
x_orth : inner ↑(↑p1 x) ↑(↑p2 x) = 0
⊢ ‖x‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2

tactic: simp only [sq, norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero (p1 x : E) (p2 x) x_orth,
  add_left_inj, mul_eq_mul_left_iff, norm_eq_zero, true_or_iff, eq_self_iff_true,
  Submodule.coe_norm, Submodule.coe_eq_zero]
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.959328
inst✝⁶ : IsROrC 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace 𝕜 E
inst✝² : InnerProductSpace ℝ F
K : Submodule 𝕜 E
x : E
S : Submodule 𝕜 E
inst✝¹ : CompleteSpace E
inst✝ : CompleteSpace { x // x ∈ S }
p1 : E →L[𝕜] { x // x ∈ S } := orthogonalProjection S
p2 : E →L[𝕜] { x // x ∈ Sᗮ } := orthogonalProjection Sᗮ
x_decomp : x = ↑(↑p1 x) + ↑(↑p2 x)
x_orth : inner ↑(↑p1 x) ↑(↑p2 x) = 0
⊢ ‖↑(↑p1 x) + ↑(↑p2 x)‖ ^ 2 = ‖↑(orthogonalProjection S) x‖ ^ 2 + ‖↑(orthogonalProjection Sᗮ) x‖ ^ 2