@@ -19,14 +19,19 @@ In this file, the `orthogonal` complement of a submodule `K` is defined, and bas
19
19
Some of the more subtle results about the orthogonal complement are delayed to
20
20
`analysis.inner_product_space.projection`.
21
21
22
+ See also `bilin_form.orthogonal` for orthogonality with respect to a general bilinear form.
23
+
22
24
## Notation
23
25
24
26
The orthogonal complement of a submodule `K` is denoted by `Kᗮ`.
27
+
28
+ The proposition that two submodules are orthogonal, `submodule.is_ortho`, is denoted by `U ⟂ V`.
29
+ Note this is not the same unicode symbol as `⊥` (`has_bot`).
25
30
-/
26
31
27
32
variables {𝕜 E F : Type *} [is_R_or_C 𝕜]
28
33
variables [normed_add_comm_group E] [inner_product_space 𝕜 E]
29
- variables [normed_add_comm_group F] [inner_product_space ℝ F]
34
+ variables [normed_add_comm_group F] [inner_product_space 𝕜 F]
30
35
local notation `⟪`x `, `y `⟫` := @inner 𝕜 _ _ x y
31
36
32
37
namespace submodule
@@ -200,3 +205,157 @@ lemma orthogonal_family_self :
200
205
| ff ff := absurd rfl
201
206
202
207
end submodule
208
+
209
+ @[simp]
210
+ lemma bilin_form_of_real_inner_orthogonal {E} [normed_add_comm_group E] [inner_product_space ℝ E]
211
+ (K : submodule ℝ E) :
212
+ bilin_form_of_real_inner.orthogonal K = Kᗮ := rfl
213
+
214
+ /-!
215
+ ### Orthogonality of submodules
216
+
217
+ In this section we define `submodule.is_ortho U V`, with notation `U ⟂ V`.
218
+
219
+ The API roughly matches that of `disjoint`.
220
+ -/
221
+ namespace submodule
222
+
223
+ /-- The proposition that two submodules are orthogonal. Has notation `U ⟂ V`. -/
224
+ def is_ortho (U V : submodule 𝕜 E) : Prop :=
225
+ U ≤ Vᗮ
226
+
227
+ infix ` ⟂ `:50 := submodule.is_ortho
228
+
229
+ lemma is_ortho_iff_le {U V : submodule 𝕜 E} : U ⟂ V ↔ U ≤ Vᗮ := iff.rfl
230
+
231
+ @[symm]
232
+ lemma is_ortho.symm {U V : submodule 𝕜 E} (h : U ⟂ V) : V ⟂ U :=
233
+ (le_orthogonal_orthogonal _).trans (orthogonal_le h)
234
+ lemma is_ortho_comm {U V : submodule 𝕜 E} : U ⟂ V ↔ V ⟂ U := ⟨is_ortho.symm, is_ortho.symm⟩
235
+ lemma symmetric_is_ortho : symmetric (is_ortho : submodule 𝕜 E → submodule 𝕜 E → Prop ) :=
236
+ λ _ _, is_ortho.symm
237
+
238
+ lemma is_ortho.inner_eq {U V : submodule 𝕜 E} (h : U ⟂ V) {u v : E} (hu : u ∈ U) (hv : v ∈ V) :
239
+ ⟪u, v⟫ = 0 :=
240
+ h.symm hv _ hu
241
+
242
+ lemma is_ortho_iff_inner_eq {U V : submodule 𝕜 E} : U ⟂ V ↔ ∀ (u ∈ U) (v ∈ V), ⟪u, v⟫ = 0 :=
243
+ forall₄_congr $ λ u hu v hv, inner_eq_zero_symm
244
+
245
+ /- TODO: generalize `submodule.map₂` to semilinear maps, so that we can state
246
+ `U ⟂ V ↔ submodule.map₂ (innerₛₗ 𝕜) U V ≤ ⊥`. -/
247
+
248
+ @[simp] lemma is_ortho_bot_left {V : submodule 𝕜 E} : ⊥ ⟂ V := bot_le
249
+ @[simp] lemma is_ortho_bot_right {U : submodule 𝕜 E} : U ⟂ ⊥ := is_ortho_bot_left.symm
250
+
251
+ lemma is_ortho.mono_left {U₁ U₂ V : submodule 𝕜 E} (hU : U₂ ≤ U₁) (h : U₁ ⟂ V) : U₂ ⟂ V :=
252
+ hU.trans h
253
+
254
+ lemma is_ortho.mono_right {U V₁ V₂ : submodule 𝕜 E} (hV : V₂ ≤ V₁) (h : U ⟂ V₁) : U ⟂ V₂ :=
255
+ (h.symm.mono_left hV).symm
256
+
257
+ lemma is_ortho.mono {U₁ V₁ U₂ V₂ : submodule 𝕜 E} (hU : U₂ ≤ U₁) (hV : V₂ ≤ V₁) (h : U₁ ⟂ V₁) :
258
+ U₂ ⟂ V₂ :=
259
+ (h.mono_right hV).mono_left hU
260
+
261
+ @[simp]
262
+ lemma is_ortho_self {U : submodule 𝕜 E} : U ⟂ U ↔ U = ⊥ :=
263
+ ⟨λ h, eq_bot_iff.mpr $ λ x hx, inner_self_eq_zero.mp (h hx x hx), λ h, h.symm ▸ is_ortho_bot_left⟩
264
+
265
+ @[simp] lemma is_ortho_orthogonal_right (U : submodule 𝕜 E) : U ⟂ Uᗮ :=
266
+ le_orthogonal_orthogonal _
267
+
268
+ @[simp] lemma is_ortho_orthogonal_left (U : submodule 𝕜 E) : Uᗮ ⟂ U :=
269
+ (is_ortho_orthogonal_right U).symm
270
+
271
+ lemma is_ortho.le {U V : submodule 𝕜 E} (h : U ⟂ V) : U ≤ Vᗮ := h
272
+ lemma is_ortho.ge {U V : submodule 𝕜 E} (h : U ⟂ V) : V ≤ Uᗮ := h.symm
273
+ @[simp]
274
+ lemma is_ortho_top_right {U : submodule 𝕜 E} : U ⟂ ⊤ ↔ U = ⊥ :=
275
+ ⟨λ h, eq_bot_iff.mpr $ λ x hx, inner_self_eq_zero.mp (h hx _ mem_top),
276
+ λ h, h.symm ▸ is_ortho_bot_left⟩
277
+
278
+ @[simp]
279
+ lemma is_ortho_top_left {V : submodule 𝕜 E} : ⊤ ⟂ V ↔ V = ⊥ :=
280
+ is_ortho_comm.trans is_ortho_top_right
281
+
282
+ /-- Orthogonal submodules are disjoint. -/
283
+ lemma is_ortho.disjoint {U V : submodule 𝕜 E} (h : U ⟂ V) : disjoint U V :=
284
+ (submodule.orthogonal_disjoint _).mono_right h.symm
285
+
286
+ @[simp] lemma is_ortho_sup_left {U₁ U₂ V : submodule 𝕜 E} : U₁ ⊔ U₂ ⟂ V ↔ U₁ ⟂ V ∧ U₂ ⟂ V :=
287
+ sup_le_iff
288
+
289
+ @[simp] lemma is_ortho_sup_right {U V₁ V₂ : submodule 𝕜 E} : U ⟂ V₁ ⊔ V₂ ↔ U ⟂ V₁ ∧ U ⟂ V₂ :=
290
+ is_ortho_comm.trans $ is_ortho_sup_left.trans $ is_ortho_comm.and is_ortho_comm
291
+
292
+ @[simp] lemma is_ortho_Sup_left {U : set (submodule 𝕜 E)} {V : submodule 𝕜 E} :
293
+ Sup U ⟂ V ↔ ∀ Uᵢ ∈ U, Uᵢ ⟂ V :=
294
+ Sup_le_iff
295
+
296
+ @[simp] lemma is_ortho_Sup_right {U : submodule 𝕜 E} {V : set (submodule 𝕜 E)} :
297
+ U ⟂ Sup V ↔ ∀ Vᵢ ∈ V, U ⟂ Vᵢ :=
298
+ is_ortho_comm.trans $ is_ortho_Sup_left.trans $ by simp_rw is_ortho_comm
299
+
300
+ @[simp] lemma is_ortho_supr_left {ι : Sort *} {U : ι → submodule 𝕜 E} {V : submodule 𝕜 E} :
301
+ supr U ⟂ V ↔ ∀ i, U i ⟂ V :=
302
+ supr_le_iff
303
+
304
+ @[simp] lemma is_ortho_supr_right {ι : Sort *} {U : submodule 𝕜 E} {V : ι → submodule 𝕜 E} :
305
+ U ⟂ supr V ↔ ∀ i, U ⟂ V i :=
306
+ is_ortho_comm.trans $ is_ortho_supr_left.trans $ by simp_rw is_ortho_comm
307
+
308
+ @[simp] lemma is_ortho_span {s t : set E} :
309
+ span 𝕜 s ⟂ span 𝕜 t ↔ ∀ ⦃u⦄, u ∈ s → ∀ ⦃v⦄, v ∈ t → ⟪u, v⟫ = 0 :=
310
+ begin
311
+ simp_rw [span_eq_supr_of_singleton_spans s, span_eq_supr_of_singleton_spans t,
312
+ is_ortho_supr_left, is_ortho_supr_right, is_ortho_iff_le, span_le, set.subset_def,
313
+ set_like.mem_coe, mem_orthogonal_singleton_iff_inner_left, set.mem_singleton_iff, forall_eq],
314
+ end
315
+
316
+ lemma is_ortho.map (f : E →ₗᵢ[𝕜] F) {U V : submodule 𝕜 E} (h : U ⟂ V) : U.map f ⟂ V.map f :=
317
+ begin
318
+ rw is_ortho_iff_inner_eq at *,
319
+ simp_rw [mem_map, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂,
320
+ linear_isometry.inner_map_map],
321
+ exact h,
322
+ end
323
+
324
+ lemma is_ortho.comap (f : E →ₗᵢ[𝕜] F) {U V : submodule 𝕜 F} (h : U ⟂ V) : U.comap f ⟂ V.comap f :=
325
+ begin
326
+ rw is_ortho_iff_inner_eq at *,
327
+ simp_rw [mem_comap, ←f.inner_map_map],
328
+ intros u hu v hv,
329
+ exact h _ hu _ hv,
330
+ end
331
+
332
+ @[simp] lemma is_ortho.map_iff (f : E ≃ₗᵢ[𝕜] F) {U V : submodule 𝕜 E} : U.map f ⟂ V.map f ↔ U ⟂ V :=
333
+ ⟨λ h, begin
334
+ have hf : ∀ p : submodule 𝕜 E, (p.map f).comap f.to_linear_isometry = p :=
335
+ comap_map_eq_of_injective f.injective,
336
+ simpa only [hf] using h.comap f.to_linear_isometry,
337
+ end , is_ortho.map f.to_linear_isometry⟩
338
+
339
+ @[simp] lemma is_ortho.comap_iff (f : E ≃ₗᵢ[𝕜] F) {U V : submodule 𝕜 F} :
340
+ U.comap f ⟂ V.comap f ↔ U ⟂ V :=
341
+ ⟨λ h, begin
342
+ have hf : ∀ p : submodule 𝕜 F, (p.comap f).map f.to_linear_isometry = p :=
343
+ map_comap_eq_of_surjective f.surjective,
344
+ simpa only [hf] using h.map f.to_linear_isometry,
345
+ end , is_ortho.comap f.to_linear_isometry⟩
346
+
347
+ end submodule
348
+
349
+ lemma orthogonal_family_iff_pairwise {ι} {V : ι → submodule 𝕜 E} :
350
+ orthogonal_family 𝕜 (λ i, V i) (λ i, (V i).subtypeₗᵢ) ↔ pairwise ((⟂) on V) :=
351
+ forall₃_congr $ λ i j hij,
352
+ subtype.forall.trans $ forall₂_congr $ λ x hx, subtype.forall.trans $ forall₂_congr $ λ y hy,
353
+ inner_eq_zero_symm
354
+
355
+ alias orthogonal_family_iff_pairwise ↔ orthogonal_family.pairwise orthogonal_family.of_pairwise
356
+
357
+ /-- Two submodules in an orthogonal family with different indices are orthogonal. -/
358
+ lemma orthogonal_family.is_ortho {ι} {V : ι → submodule 𝕜 E}
359
+ (hV : orthogonal_family 𝕜 (λ i, V i) (λ i, (V i).subtypeₗᵢ)) {i j : ι} (hij : i ≠ j) :
360
+ V i ⟂ V j :=
361
+ hV.pairwise hij
0 commit comments