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

Commit c5181d1

Browse files
feat(*): more prod-related (continuous) linear maps and their derivatives (#2277)
* feat(*): more `prod`-related (continuous) linear maps and their derivatives * Make `R` argument of `continuous_linear_equiv.refl` explicit Co-authored-by: Bryan Gin-ge Chen <bryangingechen@gmail.com>
1 parent 64f835b commit c5181d1

File tree

5 files changed

+342
-78
lines changed

5 files changed

+342
-78
lines changed

src/analysis/calculus/fderiv.lean

Lines changed: 247 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ variables {𝕜 : Type*} [nondiscrete_normed_field 𝕜]
9292
variables {E : Type*} [normed_group E] [normed_space 𝕜 E]
9393
variables {F : Type*} [normed_group F] [normed_space 𝕜 F]
9494
variables {G : Type*} [normed_group G] [normed_space 𝕜 G]
95+
variables {G' : Type*} [normed_group G'] [normed_space 𝕜 G']
9596

9697
/-- A function `f` has the continuous linear map `f'` as derivative along the filter `L` if
9798
`f x' = f x + f' (x' - x) + o (x' - x)` when `x'` converges along the filter `L`. This definition
@@ -642,6 +643,10 @@ end congr
642643
section id
643644
/-! ### Derivative of the identity -/
644645

646+
theorem has_strict_fderiv_at_id (x : E) :
647+
has_strict_fderiv_at id (id : E →L[𝕜] E) x :=
648+
(is_o_zero _ _).congr_left $ by simp
649+
645650
theorem has_fderiv_at_filter_id (x : E) (L : filter E) :
646651
has_fderiv_at_filter id (id : E →L[𝕜] E) x L :=
647652
(is_o_zero _ _).congr_left $ by simp
@@ -807,68 +812,9 @@ h.differentiable.differentiable_on
807812

808813
end continuous_linear_map
809814

810-
section cartesian_product
811-
/-! ### Derivative of the cartesian product of two functions -/
812-
813-
variables {f₂ : E → G} {f₂' : E →L[𝕜] G}
814-
815-
lemma has_strict_fderiv_at.prod
816-
(hf₁ : has_strict_fderiv_at f₁ f₁' x) (hf₂ : has_strict_fderiv_at f₂ f₂' x) :
817-
has_strict_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
818-
hf₁.prod_left hf₂
819-
820-
lemma has_fderiv_at_filter.prod
821-
(hf₁ : has_fderiv_at_filter f₁ f₁' x L) (hf₂ : has_fderiv_at_filter f₂ f₂' x L) :
822-
has_fderiv_at_filter (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x L :=
823-
hf₁.prod_left hf₂
824-
825-
lemma has_fderiv_within_at.prod
826-
(hf₁ : has_fderiv_within_at f₁ f₁' s x) (hf₂ : has_fderiv_within_at f₂ f₂' s x) :
827-
has_fderiv_within_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') s x :=
828-
hf₁.prod hf₂
829-
830-
lemma has_fderiv_at.prod (hf₁ : has_fderiv_at f₁ f₁' x) (hf₂ : has_fderiv_at f₂ f₂' x) :
831-
has_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
832-
hf₁.prod hf₂
833-
834-
lemma differentiable_within_at.prod
835-
(hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x) :
836-
differentiable_within_at 𝕜 (λx:E, (f₁ x, f₂ x)) s x :=
837-
(hf₁.has_fderiv_within_at.prod hf₂.has_fderiv_within_at).differentiable_within_at
838-
839-
lemma differentiable_at.prod (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
840-
differentiable_at 𝕜 (λx:E, (f₁ x, f₂ x)) x :=
841-
(hf₁.has_fderiv_at.prod hf₂.has_fderiv_at).differentiable_at
842-
843-
lemma differentiable_on.prod (hf₁ : differentiable_on 𝕜 f₁ s) (hf₂ : differentiable_on 𝕜 f₂ s) :
844-
differentiable_on 𝕜 (λx:E, (f₁ x, f₂ x)) s :=
845-
λx hx, differentiable_within_at.prod (hf₁ x hx) (hf₂ x hx)
846-
847-
lemma differentiable.prod (hf₁ : differentiable 𝕜 f₁) (hf₂ : differentiable 𝕜 f₂) :
848-
differentiable 𝕜 (λx:E, (f₁ x, f₂ x)) :=
849-
λ x, differentiable_at.prod (hf₁ x) (hf₂ x)
850-
851-
lemma differentiable_at.fderiv_prod
852-
(hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
853-
fderiv 𝕜 (λx:E, (f₁ x, f₂ x)) x =
854-
continuous_linear_map.prod (fderiv 𝕜 f₁ x) (fderiv 𝕜 f₂ x) :=
855-
has_fderiv_at.fderiv (has_fderiv_at.prod hf₁.has_fderiv_at hf₂.has_fderiv_at)
856-
857-
lemma differentiable_at.fderiv_within_prod
858-
(hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x)
859-
(hxs : unique_diff_within_at 𝕜 s x) :
860-
fderiv_within 𝕜 (λx:E, (f₁ x, f₂ x)) s x =
861-
continuous_linear_map.prod (fderiv_within 𝕜 f₁ s x) (fderiv_within 𝕜 f₂ s x) :=
862-
begin
863-
apply has_fderiv_within_at.fderiv_within _ hxs,
864-
exact has_fderiv_within_at.prod hf₁.has_fderiv_within_at hf₂.has_fderiv_within_at
865-
end
866-
867-
end cartesian_product
868-
869815
section composition
870-
/-! ###
871-
Derivative of the composition of two functions
816+
/-!
817+
### Derivative of the composition of two functions
872818
873819
For composition lemmas, we put x explicit to help the elaborator, as otherwise Lean tends to
874820
get confused since there are too many possibilities for composition -/
@@ -953,7 +899,7 @@ lemma differentiable_at.comp_differentiable_within_at {g : F → G}
953899

954900
lemma fderiv_within.comp {g : F → G} {t : set F}
955901
(hg : differentiable_within_at 𝕜 g t (f x)) (hf : differentiable_within_at 𝕜 f s x)
956-
(h : s ⊆ f ⁻¹' t) (hxs : unique_diff_within_at 𝕜 s x) :
902+
(h : maps_to f s t) (hxs : unique_diff_within_at 𝕜 s x) :
957903
fderiv_within 𝕜 (g ∘ f) s x = (fderiv_within 𝕜 g t (f x)).comp (fderiv_within 𝕜 f s x) :=
958904
begin
959905
apply has_fderiv_within_at.fderiv_within _ hxs,
@@ -1000,6 +946,245 @@ lemma has_strict_fderiv_at.comp {g : F → G} {g' : F →L[𝕜] G}
1000946

1001947
end composition
1002948

949+
section cartesian_product
950+
/-! ### Derivative of the cartesian product of two functions -/
951+
952+
section prod
953+
variables {f₂ : E → G} {f₂' : E →L[𝕜] G}
954+
955+
lemma has_strict_fderiv_at.prod
956+
(hf₁ : has_strict_fderiv_at f₁ f₁' x) (hf₂ : has_strict_fderiv_at f₂ f₂' x) :
957+
has_strict_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
958+
hf₁.prod_left hf₂
959+
960+
lemma has_fderiv_at_filter.prod
961+
(hf₁ : has_fderiv_at_filter f₁ f₁' x L) (hf₂ : has_fderiv_at_filter f₂ f₂' x L) :
962+
has_fderiv_at_filter (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x L :=
963+
hf₁.prod_left hf₂
964+
965+
lemma has_fderiv_within_at.prod
966+
(hf₁ : has_fderiv_within_at f₁ f₁' s x) (hf₂ : has_fderiv_within_at f₂ f₂' s x) :
967+
has_fderiv_within_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') s x :=
968+
hf₁.prod hf₂
969+
970+
lemma has_fderiv_at.prod (hf₁ : has_fderiv_at f₁ f₁' x) (hf₂ : has_fderiv_at f₂ f₂' x) :
971+
has_fderiv_at (λx, (f₁ x, f₂ x)) (continuous_linear_map.prod f₁' f₂') x :=
972+
hf₁.prod hf₂
973+
974+
lemma differentiable_within_at.prod
975+
(hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x) :
976+
differentiable_within_at 𝕜 (λx:E, (f₁ x, f₂ x)) s x :=
977+
(hf₁.has_fderiv_within_at.prod hf₂.has_fderiv_within_at).differentiable_within_at
978+
979+
lemma differentiable_at.prod (hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
980+
differentiable_at 𝕜 (λx:E, (f₁ x, f₂ x)) x :=
981+
(hf₁.has_fderiv_at.prod hf₂.has_fderiv_at).differentiable_at
982+
983+
lemma differentiable_on.prod (hf₁ : differentiable_on 𝕜 f₁ s) (hf₂ : differentiable_on 𝕜 f₂ s) :
984+
differentiable_on 𝕜 (λx:E, (f₁ x, f₂ x)) s :=
985+
λx hx, differentiable_within_at.prod (hf₁ x hx) (hf₂ x hx)
986+
987+
lemma differentiable.prod (hf₁ : differentiable 𝕜 f₁) (hf₂ : differentiable 𝕜 f₂) :
988+
differentiable 𝕜 (λx:E, (f₁ x, f₂ x)) :=
989+
λ x, differentiable_at.prod (hf₁ x) (hf₂ x)
990+
991+
lemma differentiable_at.fderiv_prod
992+
(hf₁ : differentiable_at 𝕜 f₁ x) (hf₂ : differentiable_at 𝕜 f₂ x) :
993+
fderiv 𝕜 (λx:E, (f₁ x, f₂ x)) x =
994+
continuous_linear_map.prod (fderiv 𝕜 f₁ x) (fderiv 𝕜 f₂ x) :=
995+
has_fderiv_at.fderiv (has_fderiv_at.prod hf₁.has_fderiv_at hf₂.has_fderiv_at)
996+
997+
lemma differentiable_at.fderiv_within_prod
998+
(hf₁ : differentiable_within_at 𝕜 f₁ s x) (hf₂ : differentiable_within_at 𝕜 f₂ s x)
999+
(hxs : unique_diff_within_at 𝕜 s x) :
1000+
fderiv_within 𝕜 (λx:E, (f₁ x, f₂ x)) s x =
1001+
continuous_linear_map.prod (fderiv_within 𝕜 f₁ s x) (fderiv_within 𝕜 f₂ s x) :=
1002+
begin
1003+
apply has_fderiv_within_at.fderiv_within _ hxs,
1004+
exact has_fderiv_within_at.prod hf₁.has_fderiv_within_at hf₂.has_fderiv_within_at
1005+
end
1006+
1007+
end prod
1008+
1009+
section fst
1010+
1011+
variables {f₂ : E → F × G} {f₂' : E →L[𝕜] F × G} {p : E × F}
1012+
1013+
lemma has_strict_fderiv_at_fst : has_strict_fderiv_at prod.fst (fst 𝕜 E F) p :=
1014+
(fst 𝕜 E F).has_strict_fderiv_at
1015+
1016+
lemma has_strict_fderiv_at.fst (h : has_strict_fderiv_at f₂ f₂' x) :
1017+
has_strict_fderiv_at (λ x, (f₂ x).1) ((fst 𝕜 F G).comp f₂') x :=
1018+
has_strict_fderiv_at_fst.comp x h
1019+
1020+
lemma has_fderiv_at_filter_fst {L : filter (E × F)} :
1021+
has_fderiv_at_filter prod.fst (fst 𝕜 E F) p L :=
1022+
(fst 𝕜 E F).has_fderiv_at_filter
1023+
1024+
lemma has_fderiv_at_filter.fst (h : has_fderiv_at_filter f₂ f₂' x L) :
1025+
has_fderiv_at_filter (λ x, (f₂ x).1) ((fst 𝕜 F G).comp f₂') x L :=
1026+
has_fderiv_at_filter_fst.comp x h
1027+
1028+
lemma has_fderiv_at_fst : has_fderiv_at prod.fst (fst 𝕜 E F) p :=
1029+
has_fderiv_at_filter_fst
1030+
1031+
lemma has_fderiv_at.fst (h : has_fderiv_at f₂ f₂' x) :
1032+
has_fderiv_at (λ x, (f₂ x).1) ((fst 𝕜 F G).comp f₂') x :=
1033+
h.fst
1034+
1035+
lemma has_fderiv_within_at_fst {s : set (E × F)} :
1036+
has_fderiv_within_at prod.fst (fst 𝕜 E F) s p :=
1037+
has_fderiv_at_filter_fst
1038+
1039+
lemma has_fderiv_within_at.fst (h : has_fderiv_within_at f₂ f₂' s x) :
1040+
has_fderiv_within_at (λ x, (f₂ x).1) ((fst 𝕜 F G).comp f₂') s x :=
1041+
h.fst
1042+
1043+
lemma differentiable_at_fst : differentiable_at 𝕜 prod.fst p :=
1044+
has_fderiv_at_fst.differentiable_at
1045+
1046+
lemma differentiable_at.fst (h : differentiable_at 𝕜 f₂ x) :
1047+
differentiable_at 𝕜 (λ x, (f₂ x).1) x :=
1048+
differentiable_at_fst.comp x h
1049+
1050+
lemma differentiable_fst : differentiable 𝕜 (prod.fst : E × F → E) :=
1051+
λ x, differentiable_at_fst
1052+
1053+
lemma differentiable.fst (h : differentiable 𝕜 f₂) : differentiable 𝕜 (λ x, (f₂ x).1) :=
1054+
differentiable_fst.comp h
1055+
1056+
lemma differentiable_within_at_fst {s : set (E × F)} : differentiable_within_at 𝕜 prod.fst s p :=
1057+
differentiable_at_fst.differentiable_within_at
1058+
1059+
lemma differentiable_within_at.fst (h : differentiable_within_at 𝕜 f₂ s x) :
1060+
differentiable_within_at 𝕜 (λ x, (f₂ x).1) s x :=
1061+
differentiable_at_fst.comp_differentiable_within_at x h
1062+
1063+
lemma differentiable_on_fst {s : set (E × F)} : differentiable_on 𝕜 prod.fst s :=
1064+
differentiable_fst.differentiable_on
1065+
1066+
lemma differentiable_on.fst (h : differentiable_on 𝕜 f₂ s) :
1067+
differentiable_on 𝕜 (λ x, (f₂ x).1) s :=
1068+
differentiable_fst.comp_differentiable_on h
1069+
1070+
lemma fderiv_fst : fderiv 𝕜 prod.fst p = fst 𝕜 E F := has_fderiv_at_fst.fderiv
1071+
1072+
lemma fderiv.fst (h : differentiable_at 𝕜 f₂ x) :
1073+
fderiv 𝕜 (λ x, (f₂ x).1) x = (fst 𝕜 F G).comp (fderiv 𝕜 f₂ x) :=
1074+
h.has_fderiv_at.fst.fderiv
1075+
1076+
lemma fderiv_within_fst {s : set (E × F)} (hs : unique_diff_within_at 𝕜 s p) :
1077+
fderiv_within 𝕜 prod.fst s p = fst 𝕜 E F :=
1078+
has_fderiv_within_at_fst.fderiv_within hs
1079+
1080+
lemma fderiv_within.fst (hs : unique_diff_within_at 𝕜 s x) (h : differentiable_within_at 𝕜 f₂ s x) :
1081+
fderiv_within 𝕜 (λ x, (f₂ x).1) s x = (fst 𝕜 F G).comp (fderiv_within 𝕜 f₂ s x) :=
1082+
h.has_fderiv_within_at.fst.fderiv_within hs
1083+
1084+
end fst
1085+
1086+
section snd
1087+
1088+
variables {f₂ : E → F × G} {f₂' : E →L[𝕜] F × G} {p : E × F}
1089+
1090+
lemma has_strict_fderiv_at_snd : has_strict_fderiv_at prod.snd (snd 𝕜 E F) p :=
1091+
(snd 𝕜 E F).has_strict_fderiv_at
1092+
1093+
lemma has_strict_fderiv_at.snd (h : has_strict_fderiv_at f₂ f₂' x) :
1094+
has_strict_fderiv_at (λ x, (f₂ x).2) ((snd 𝕜 F G).comp f₂') x :=
1095+
has_strict_fderiv_at_snd.comp x h
1096+
1097+
lemma has_fderiv_at_filter_snd {L : filter (E × F)} :
1098+
has_fderiv_at_filter prod.snd (snd 𝕜 E F) p L :=
1099+
(snd 𝕜 E F).has_fderiv_at_filter
1100+
1101+
lemma has_fderiv_at_filter.snd (h : has_fderiv_at_filter f₂ f₂' x L) :
1102+
has_fderiv_at_filter (λ x, (f₂ x).2) ((snd 𝕜 F G).comp f₂') x L :=
1103+
has_fderiv_at_filter_snd.comp x h
1104+
1105+
lemma has_fderiv_at_snd : has_fderiv_at prod.snd (snd 𝕜 E F) p :=
1106+
has_fderiv_at_filter_snd
1107+
1108+
lemma has_fderiv_at.snd (h : has_fderiv_at f₂ f₂' x) :
1109+
has_fderiv_at (λ x, (f₂ x).2) ((snd 𝕜 F G).comp f₂') x :=
1110+
h.snd
1111+
1112+
lemma has_fderiv_within_at_snd {s : set (E × F)} :
1113+
has_fderiv_within_at prod.snd (snd 𝕜 E F) s p :=
1114+
has_fderiv_at_filter_snd
1115+
1116+
lemma has_fderiv_within_at.snd (h : has_fderiv_within_at f₂ f₂' s x) :
1117+
has_fderiv_within_at (λ x, (f₂ x).2) ((snd 𝕜 F G).comp f₂') s x :=
1118+
h.snd
1119+
1120+
lemma differentiable_at_snd : differentiable_at 𝕜 prod.snd p :=
1121+
has_fderiv_at_snd.differentiable_at
1122+
1123+
lemma differentiable_at.snd (h : differentiable_at 𝕜 f₂ x) :
1124+
differentiable_at 𝕜 (λ x, (f₂ x).2) x :=
1125+
differentiable_at_snd.comp x h
1126+
1127+
lemma differentiable_snd : differentiable 𝕜 (prod.snd : E × F → F) :=
1128+
λ x, differentiable_at_snd
1129+
1130+
lemma differentiable.snd (h : differentiable 𝕜 f₂) : differentiable 𝕜 (λ x, (f₂ x).2) :=
1131+
differentiable_snd.comp h
1132+
1133+
lemma differentiable_within_at_snd {s : set (E × F)} : differentiable_within_at 𝕜 prod.snd s p :=
1134+
differentiable_at_snd.differentiable_within_at
1135+
1136+
lemma differentiable_within_at.snd (h : differentiable_within_at 𝕜 f₂ s x) :
1137+
differentiable_within_at 𝕜 (λ x, (f₂ x).2) s x :=
1138+
differentiable_at_snd.comp_differentiable_within_at x h
1139+
1140+
lemma differentiable_on_snd {s : set (E × F)} : differentiable_on 𝕜 prod.snd s :=
1141+
differentiable_snd.differentiable_on
1142+
1143+
lemma differentiable_on.snd (h : differentiable_on 𝕜 f₂ s) :
1144+
differentiable_on 𝕜 (λ x, (f₂ x).2) s :=
1145+
differentiable_snd.comp_differentiable_on h
1146+
1147+
lemma fderiv_snd : fderiv 𝕜 prod.snd p = snd 𝕜 E F := has_fderiv_at_snd.fderiv
1148+
1149+
lemma fderiv.snd (h : differentiable_at 𝕜 f₂ x) :
1150+
fderiv 𝕜 (λ x, (f₂ x).2) x = (snd 𝕜 F G).comp (fderiv 𝕜 f₂ x) :=
1151+
h.has_fderiv_at.snd.fderiv
1152+
1153+
lemma fderiv_within_snd {s : set (E × F)} (hs : unique_diff_within_at 𝕜 s p) :
1154+
fderiv_within 𝕜 prod.snd s p = snd 𝕜 E F :=
1155+
has_fderiv_within_at_snd.fderiv_within hs
1156+
1157+
lemma fderiv_within.snd (hs : unique_diff_within_at 𝕜 s x) (h : differentiable_within_at 𝕜 f₂ s x) :
1158+
fderiv_within 𝕜 (λ x, (f₂ x).2) s x = (snd 𝕜 F G).comp (fderiv_within 𝕜 f₂ s x) :=
1159+
h.has_fderiv_within_at.snd.fderiv_within hs
1160+
1161+
end snd
1162+
1163+
section prod_map
1164+
1165+
variables {f₂ : G → G'} {f₂' : G →L[𝕜] G'} {y : G} (p : E × G)
1166+
1167+
-- TODO (Lean 3.8): use `prod.map f f₂``
1168+
1169+
theorem has_strict_fderiv_at.prod_map (hf : has_strict_fderiv_at f f' p.1)
1170+
(hf₂ : has_strict_fderiv_at f₂ f₂' p.2) :
1171+
has_strict_fderiv_at (λ p : E × G, (f p.1, f₂ p.2)) (f'.prod_map f₂') p :=
1172+
(hf.comp p has_strict_fderiv_at_fst).prod (hf₂.comp p has_strict_fderiv_at_snd)
1173+
1174+
theorem has_fderiv_at.prod_map (hf : has_fderiv_at f f' p.1)
1175+
(hf₂ : has_fderiv_at f₂ f₂' p.2) :
1176+
has_fderiv_at (λ p : E × G, (f p.1, f₂ p.2)) (f'.prod_map f₂') p :=
1177+
(hf.comp p has_fderiv_at_fst).prod (hf₂.comp p has_fderiv_at_snd)
1178+
1179+
theorem differentiable_at.prod_map (hf : differentiable_at 𝕜 f p.1)
1180+
(hf₂ : differentiable_at 𝕜 f₂ p.2) :
1181+
differentiable_at 𝕜 (λ p : E × G, (f p.1, f₂ p.2)) p :=
1182+
(hf.comp p differentiable_at_fst).prod (hf₂.comp p differentiable_at_snd)
1183+
1184+
end prod_map
1185+
1186+
end cartesian_product
1187+
10031188
section const_smul
10041189
/-! ### Derivative of a function multiplied by a constant -/
10051190

src/linear_algebra/basic.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,13 @@ theorem inl_eq_prod : inl R M M₂ = prod linear_map.id 0 := rfl
281281

282282
theorem inr_eq_prod : inr R M M₂ = prod 0 linear_map.id := rfl
283283

284+
/-- `prod.map` of two linear maps. -/
285+
def prod_map (f : M →ₗ[R] M₃) (g : M₂ →ₗ[R] M₄) : (M × M₂) →ₗ[R] (M₃ × M₄) :=
286+
(f.comp (fst R M M₂)).prod (g.comp (snd R M M₂))
287+
288+
@[simp] theorem prod_map_apply (f : M →ₗ[R] M₃) (g : M₂ →ₗ[R] M₄) (x) :
289+
f.prod_map g x = (f x.1, g x.2) := rfl
290+
284291
end
285292

286293
section comm_ring
@@ -1352,6 +1359,8 @@ include R
13521359

13531360
instance : has_coe (M ≃ₗ[R] M₂) (M →ₗ[R] M₂) := ⟨to_linear_map⟩
13541361

1362+
instance : has_coe_to_fun (M ≃ₗ[R] M₂) := ⟨_, λ f, f.to_fun⟩
1363+
13551364
@[simp] theorem coe_apply (e : M ≃ₗ[R] M₂) (b : M) : (e : M →ₗ[R] M₂) b = e b := rfl
13561365

13571366
lemma to_equiv_injective : function.injective (to_equiv : (M ≃ₗ[R] M₂) → M ≃ M₂) :=
@@ -1427,6 +1436,27 @@ lemma prod_symm (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) : (e.prod e').
14271436
@[simp] lemma prod_apply (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) (p) :
14281437
e.prod e' p = (e p.1, e' p.2) := rfl
14291438

1439+
@[simp, move_cast] lemma coe_prod (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) :
1440+
(e.prod e' : (M × M₃) →ₗ[R] M₂ × M₄) = (e : M →ₗ[R] M₂).prod_map (e' : M₃ →ₗ[R] M₄) :=
1441+
rfl
1442+
1443+
/-- Equivalence given by a block lower diagonal matrix. `e` and `e'` are diagonal square blocks,
1444+
and `f` is a rectangular block below the diagonal. -/
1445+
protected def skew_prod (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) (f : M →ₗ[R] M₄) :
1446+
(M × M₃) ≃ₗ[R] M₂ × M₄ :=
1447+
{ inv_fun := λ p : M₂ × M₄, (e.symm p.1, e'.symm (p.2 - f (e.symm p.1))),
1448+
left_inv := λ p, by simp,
1449+
right_inv := λ p, by simp,
1450+
.. ((e : M →ₗ[R] M₂).comp (linear_map.fst R M M₃)).prod
1451+
((e' : M₃ →ₗ[R] M₄).comp (linear_map.snd R M M₃) +
1452+
f.comp (linear_map.fst R M M₃)) }
1453+
1454+
@[simp] lemma skew_prod_apply (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) (f : M →ₗ[R] M₄) (x) :
1455+
e.skew_prod e' f x = (e x.1, e' x.2 + f x.1) := rfl
1456+
1457+
@[simp] lemma skew_prod_symm_apply (e : M ≃ₗ[R] M₂) (e' : M₃ ≃ₗ[R] M₄) (f : M →ₗ[R] M₄) (x) :
1458+
(e.skew_prod e' f).symm x = (e.symm x.1, e'.symm (x.2 - f (e.symm x.1))) := rfl
1459+
14301460
end prod
14311461

14321462
/-- A bijective linear map is a linear equivalence. Here, bijectivity is described by saying that

0 commit comments

Comments
 (0)