Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(analysis/inner_product_space/finite_dimensional): some lemmas on finite dimensional inner product spaces #18041

Open
wants to merge 48 commits into
base: master
Choose a base branch
from
Open
Changes from 2 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
455c5aa
feat(analysis/inner_product_space/finite_dimensional): created new fi…
themathqueen Jan 2, 2023
4cb7241
Fix style
themathqueen Jan 2, 2023
3a4a178
fix
themathqueen Jan 3, 2023
3c1f3c1
fix after review
themathqueen Jan 3, 2023
337a733
3 new results
themathqueen Jan 3, 2023
7288bfa
final result for now
themathqueen Jan 3, 2023
1e23e67
fix
themathqueen Jan 4, 2023
6e955ff
Update fix
themathqueen Jan 4, 2023
c65fa8a
fixes after review
themathqueen Jan 4, 2023
8577cc5
fixes after review
themathqueen Jan 6, 2023
18ba6fd
Add von Neumann file here
themathqueen Jan 6, 2023
1d54562
delete comment
themathqueen Jan 6, 2023
f20143f
fixed names and other stuff and added more lemmas
themathqueen Jan 16, 2023
a130990
fix
themathqueen Jan 17, 2023
357d151
added a bit more
themathqueen Jan 17, 2023
abc7b99
fix
themathqueen Jan 17, 2023
dd129be
linear_map.sqrt
themathqueen Jan 19, 2023
28eee7d
fix and one lemma
themathqueen Jan 19, 2023
bc5c157
fix
themathqueen Jan 19, 2023
b98f2e1
move lemmas on dual to other pr
themathqueen Jan 19, 2023
27054bf
fix
themathqueen Jan 19, 2023
5a236bc
tiny fix
themathqueen Jan 19, 2023
a9892e1
fix
themathqueen Jan 19, 2023
833b4b9
moved stuff
themathqueen Jan 19, 2023
c8413dc
fix after review
themathqueen Jan 20, 2023
b6484a2
fix
themathqueen Jan 20, 2023
a2d7a24
Express `orthogonal_projection` as `linear_proj_of_is_compl`
ADedecker Jan 20, 2023
4c29708
fix after review
themathqueen Jan 22, 2023
239b467
fix
themathqueen Jan 22, 2023
5b6547e
fix after review
themathqueen Jan 23, 2023
465b309
Merge branch 'master' of https://github.com/leanprover-community/math…
themathqueen Jan 23, 2023
9bdaf70
Merge branch 'AD_ortho_proj_is_linear_proj' of https://github.com/lea…
themathqueen Jan 23, 2023
a0dc536
merge branches
themathqueen Jan 23, 2023
b676540
typo
themathqueen Jan 23, 2023
2f5c69d
fix
themathqueen Jan 23, 2023
d984f88
fix after review
themathqueen Jan 24, 2023
a7cd215
feat(linear_algebra/invariant_submodule): invariant submodules
themathqueen Jan 25, 2023
a609fed
moved files to new PR
themathqueen Jan 25, 2023
fbdbd94
Merge branch 'invariant_submodule' of https://github.com/leanprover-c…
themathqueen Jan 25, 2023
537fc76
move file to new pr
themathqueen Jan 25, 2023
c5d3db0
added lemmas for clm
themathqueen Jan 30, 2023
09ad49a
move non-finitedimensional stuff to other file
themathqueen Feb 2, 2023
8e7a82c
moved stuff
themathqueen Feb 2, 2023
05308bc
fix
themathqueen Feb 2, 2023
213ec18
fix
themathqueen Feb 2, 2023
0fb02b4
fix
themathqueen Feb 2, 2023
cf2106c
fix
themathqueen Feb 2, 2023
3a150f9
move stuff
themathqueen Feb 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions src/analysis/inner_product_space/finite_dimensional.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
/-
Copyright (c) 2023 Monica Omar. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Monica Omar
-/
import analysis.inner_product_space.adjoint

/-!
# Finite-dimensional inner product spaces

In this file, we prove some results in finite-dimensional inner product spaces.

## Notation

This file uses the local notation `P _` for `orthogonal_projection _`
and `P _ᗮ` for `orthogonal_projection _ᗮ`.

We let `V` be a finite-dimensional inner product space over `ℂ`.
-/

variables {V : Type*} [inner_product_space ℂ V]
themathqueen marked this conversation as resolved.
Show resolved Hide resolved
local notation `P`U := (orthogonal_projection U)
local notation `P`U`ᗮ` := (orthogonal_projection Uᗮ)
themathqueen marked this conversation as resolved.
Show resolved Hide resolved

/-- `U` is `T` invariant is equivalent to `T(U) ⊆ U` -/
lemma U_is_T_invariant_def (U : submodule ℂ V) (T : V →L[ℂ] V) :
(∀ u : V, u ∈ U → T u ∈ U) ↔ (T '' U ⊆ U)
:= by { simp only [set.image_subset_iff],
exact ⟨ λ h, λ x hx, by simp only [set.mem_preimage]; exact h x hx,
λ h u h_1, by apply h h_1 ⟩, }
themathqueen marked this conversation as resolved.
Show resolved Hide resolved

/-- `U` is `T` invariant if and only if `(P U) * T * (P U) = T * (P U)` -/
lemma U_is_T_invariant_iff_P_U_T_P_U_eq_T_P_U
[finite_dimensional ℂ V] (U : submodule ℂ V) (T : V →L[ℂ] V) :
(T '' U ⊆ U) ↔ ∀ x : V, ↑((P U) (T ↑((P U) x))) = (T ↑((P U) x))
:= by rw ← U_is_T_invariant_def U T;
exact ⟨ λ h x, by obtain ⟨w,hw,v,hv,hvw⟩ := submodule.exists_sum_mem_mem_orthogonal U x;
rw [ hvw,
map_add,
orthogonal_projection_mem_subspace_orthogonal_complement_eq_zero hv,
add_zero,
orthogonal_projection_eq_self_iff.mpr hw,
orthogonal_projection_eq_self_iff.mpr (h w hw) ],
λ h u h_1, by rw [ ← orthogonal_projection_eq_self_iff,
← orthogonal_projection_eq_self_iff.mpr h_1,
h] ⟩

/-- `U,Uᗮ` are `T` invariant if and only if `(P U) * T = T * (P U)` -/
lemma U_and_U_bot_are_T_inv_iff_P_UT_eq_TP_U
[finite_dimensional ℂ V] (U : submodule ℂ V) (T : V →L[ℂ] V) :
(T '' U ⊆ U ∧ T '' Uᗮ ⊆ Uᗮ) ↔ ∀ x : V, ↑((P U) (T x)) = (T ↑((P U) x)) :=
begin
simp only [U_is_T_invariant_iff_P_U_T_P_U_eq_T_P_U],
have : ∀ x : V,
↑((P Uᗮ) x) = ((continuous_linear_map.id ℂ V) x) - ↑((P U) x)
:= λ x, by rw [ eq_sub_iff_add_eq,
add_comm,
← eq_sum_orthogonal_projection_self_orthogonal_complement U x,
continuous_linear_map.id_apply ],
simp only [this],
clear this,
simp only [ continuous_linear_map.id_apply,
map_sub,
sub_eq_self,
add_subgroup_class.coe_sub,
sub_eq_zero,
← U_is_T_invariant_iff_P_U_T_P_U_eq_T_P_U],
simp only [← U_is_T_invariant_def],
exact ⟨λ ⟨h1,h2⟩ x, by
simp only [h2 x,
orthogonal_projection_eq_self_iff.mpr
(h1 ((P U) x) (orthogonal_projection_fn_mem x))],
λ h, ⟨λ u h', by specialize h u;
simp only [orthogonal_projection_eq_self_iff.mpr h'] at h;
exact orthogonal_projection_eq_self_iff.mp h,
λ x, by simp only [← h, orthogonal_projection_mem_subspace_eq_self]⟩⟩,
end

-- Given an invertible operator, multiplying it by its inverse gives the identity.
lemma Tinv_mul_T_eq_1 (T : V →L[ℂ] V) [invertible T] : T.inverse * T = 1 :=
by simp only [ ← continuous_linear_map.ring_inverse_eq_map_inverse,
ring.inverse_mul_cancel,
is_unit_of_invertible T ]
lemma T_mul_Tinv_eq_1 (T : V →L[ℂ] V) [invertible T] : T * T.inverse = 1 :=
by simp only [ ← continuous_linear_map.ring_inverse_eq_map_inverse,
ring.mul_inverse_cancel,
is_unit_of_invertible ]

-- `(P U) * T = T * (P U)` if and only if `T⁻¹ * (P U) * T = P U`
lemma P_U_T_eq_T_P_U_iff_Tinv_P_U_T_eq_P_U
[finite_dimensional ℂ V] (U : submodule ℂ V) (T : V →L[ℂ] V) [invertible T] :
∀ x : V, ↑((P U) (T x)) = T ↑((P U) x) ↔ T.inverse ↑((P U) (T x)) = ↑((P U) x)
:= λ x, ⟨ λ h, by rw h;
themathqueen marked this conversation as resolved.
Show resolved Hide resolved
simp only [ ← continuous_linear_map.comp_apply,
← continuous_linear_map.mul_def ];
rw Tinv_mul_T_eq_1;
refl,
λ h, by rw ← h;
simp only [ ← continuous_linear_map.comp_apply,
← continuous_linear_map.mul_def,
T_mul_Tinv_eq_1 ];
refl ⟩

-- `T⁻¹(U) ⊆ U` is equivalent to `U ⊆ T(U)`
lemma Tinv_image_subseteq_iff_subseteq_T_image
(U : submodule ℂ V) (T : V →L[ℂ] V) [invertible T] :
((T.inverse) '' U ⊆ U) ↔ (↑U ⊆ T '' U)
:= ⟨ λ h x hx, by simp only [set.mem_image, set_like.mem_coe];
use T.inverse x;
rw [ ← continuous_linear_map.comp_apply,
← continuous_linear_map.mul_def,
T_mul_Tinv_eq_1 T,
continuous_linear_map.one_apply ];
simp only [eq_self_iff_true, and_true];
apply h;
rw set.mem_image;
use x;
simp only [eq_self_iff_true, and_true];
exact hx,
λ h x hx, by simp only [set.mem_image, set_like.mem_coe] at hx;
cases hx with y hy;
rw ← hy.2;
cases set.mem_of_subset_of_mem h hy.1 with z hz;
rw [ ← hz.2,
← continuous_linear_map.comp_apply,
← continuous_linear_map.mul_def,
Tinv_mul_T_eq_1 ];
exact hz.1 ⟩

/-- `T⁻¹ * (P U) * T = P U` if and only if `T(U) = U` and `T(Uᗮ) = Uᗮ` -/
theorem T_inv_P_U_T_eq_P_U_iff_T''U_eq_U_and_T''U_bot_eq_U_bot
[finite_dimensional ℂ V] (U : submodule ℂ V) (T : V →L[ℂ] V) [invertible T] :
(∀ x : V, T.inverse ↑((P U) (T x)) = ↑((P U) x)) ↔ T '' U = U ∧ T '' Uᗮ = Uᗮ :=
begin
simp only [ ← P_U_T_eq_T_P_U_iff_Tinv_P_U_T_eq_P_U,
← U_and_U_bot_are_T_inv_iff_P_UT_eq_TP_U U T ],
simp only [set.subset.antisymm_iff],
have Hu : ∀ p q r s, ((p ∧ q) ∧ r ∧ s) = ((p ∧ r) ∧ (q ∧ s)) := λ _ _ _ _, by
{ simp only [ and.assoc,
eq_iff_iff,
and.congr_right_iff],
simp only [← and.assoc, and.congr_left_iff],
simp only [and.comm],
simp only [iff_self, implies_true_iff], },
rw [ Hu,
← U_is_T_invariant_def U T,
← U_is_T_invariant_def Uᗮ T,
iff_self_and ],
clear Hu,
simp only [← Tinv_image_subseteq_iff_subseteq_T_image],
simp only [U_is_T_invariant_def],
simp only [ U_and_U_bot_are_T_inv_iff_P_UT_eq_TP_U,
P_U_T_eq_T_P_U_iff_Tinv_P_U_T_eq_P_U ],
intros h x,
rw [← h],
simp only [← continuous_linear_map.comp_apply],
rw [ ← continuous_linear_map.mul_def,
T_mul_Tinv_eq_1 ],
refl,
end