@@ -4,7 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Johan Commelin, Fabian Glöckle
5
5
-/
6
6
import linear_algebra.finite_dimensional
7
- import tactic.apply_fun
7
+ import linear_algebra.projection
8
+
8
9
noncomputable theory
9
10
10
11
/-!
@@ -18,12 +19,14 @@ The dual space of an R-module M is the R-module of linear maps `M → R`.
18
19
* Given a basis for a K-vector space `V`, `is_basis.to_dual` produces a map from `V` to `dual K V`.
19
20
* Given families of vectors `e` and `ε`, `dual_pair e ε` states that these families have the
20
21
characteristic properties of a basis and a dual.
22
+ * `dual_annihilator W` is the submodule of `dual R M` where every element annihilates `W`.
21
23
22
24
## Main results
23
25
24
26
* `to_dual_equiv` : the dual space is linearly equivalent to the primal space.
25
27
* `dual_pair.is_basis` and `dual_pair.eq_dual`: if `e` and `ε` form a dual pair, `e` is a basis and
26
28
`ε` is its dual basis.
29
+ * `quot_equiv_annihilator`: the quotient by a subspace is isomorphic to its dual annihilator.
27
30
28
31
## Notation
29
32
@@ -32,6 +35,7 @@ We sometimes use `V'` as local notation for `dual K V`.
32
35
-/
33
36
34
37
namespace module
38
+
35
39
variables (R : Type *) (M : Type *)
36
40
variables [comm_ring R] [add_comm_group M] [module R M]
37
41
@@ -69,12 +73,16 @@ lemma transpose_comp (u : M' →ₗ[R] M'') (v : M →ₗ[R] M') :
69
73
transpose (u.comp v) = (transpose v).comp (transpose u) := rfl
70
74
71
75
end dual
76
+
72
77
end module
73
78
74
79
namespace is_basis
80
+
75
81
universes u v w
82
+
76
83
variables {K : Type u} {V : Type v} {ι : Type w}
77
84
variables [field K] [add_comm_group V] [vector_space K V]
85
+
78
86
open vector_space module module.dual submodule linear_map cardinal function
79
87
80
88
variables [de : decidable_eq ι]
@@ -296,6 +304,7 @@ section dual_pair
296
304
open vector_space module module.dual linear_map function
297
305
298
306
universes u v w
307
+
299
308
variables {K : Type u} {V : Type v} {ι : Type w} [decidable_eq ι]
300
309
variables [field K] [add_comm_group V] [vector_space K V]
301
310
@@ -398,3 +407,149 @@ begin
398
407
end
399
408
400
409
end dual_pair
410
+
411
+ namespace submodule
412
+
413
+ universes u v w
414
+
415
+ variables {R : Type u} {M : Type v} [comm_ring R] [add_comm_group M] [module R M]
416
+ variable {W : submodule R M}
417
+
418
+ /-- The `dual_restrict` of a submodule `W` of `M` is the linear map from the
419
+ dual of `M` to the dual of `W` such that the domain of each linear map is
420
+ restricted to `W`. -/
421
+ def dual_restrict (W : submodule R M) :
422
+ module.dual R M →ₗ[R] module.dual R W :=
423
+ linear_map.dom_restrict' W
424
+
425
+ @[simp] lemma dual_restrict_apply
426
+ (W : submodule R M) (φ : module.dual R M) (x : W) :
427
+ W.dual_restrict φ x = φ (x : M) := rfl
428
+
429
+ /-- The `dual_annihilator` of a submodule `W` is the set of linear maps `φ` such
430
+ that `φ w = 0` for all `w ∈ W`. -/
431
+ def dual_annihilator {R : Type u} {M : Type v} [comm_ring R] [add_comm_group M]
432
+ [module R M] (W : submodule R M) : submodule R $ module.dual R M :=
433
+ W.dual_restrict.ker
434
+
435
+ @[simp] lemma mem_dual_annihilator (φ : module.dual R M) :
436
+ φ ∈ W.dual_annihilator ↔ ∀ w ∈ W, φ w = 0 :=
437
+ begin
438
+ refine linear_map.mem_ker.trans _,
439
+ simp_rw [linear_map.ext_iff, dual_restrict_apply],
440
+ exact ⟨λ h w hw, h ⟨w, hw⟩, λ h w, h w.1 w.2 ⟩
441
+ end
442
+
443
+ lemma dual_restrict_ker_eq_dual_annihilator (W : submodule R M) :
444
+ W.dual_restrict.ker = W.dual_annihilator :=
445
+ rfl
446
+
447
+ end submodule
448
+
449
+ namespace subspace
450
+
451
+ open submodule linear_map
452
+
453
+ universes u v w
454
+
455
+ -- We work in vector spaces because `exists_is_compl` only hold for vector spaces
456
+ variables {K : Type u} {V : Type v} [field K] [add_comm_group V] [vector_space K V]
457
+
458
+ /-- Given a subspace `W` of `V` and an element of its dual `φ`, `dual_lift W φ` is
459
+ the natural extension of `φ` to an element of the dual of `V`.
460
+ That is, `dual_lift W φ` sends `w ∈ W` to `φ x` and `x` in the complement of `W` to `0`. -/
461
+ noncomputable def dual_lift (W : subspace K V) :
462
+ module.dual K W →ₗ[K] module.dual K V :=
463
+ let h := classical.indefinite_description _ W.exists_is_compl in
464
+ (linear_map.of_is_compl_prod h.2 ).comp (linear_map.inl _ _ _)
465
+
466
+ variable {W : subspace K V}
467
+
468
+ @[simp] lemma dual_lift_of_subtype {φ : module.dual K W} (w : W) :
469
+ W.dual_lift φ (w : V) = φ w :=
470
+ by { erw of_is_compl_left_apply _ w, refl }
471
+
472
+ lemma dual_lift_of_mem {φ : module.dual K W} {w : V} (hw : w ∈ W) :
473
+ W.dual_lift φ w = φ ⟨w, hw⟩ :=
474
+ dual_lift_of_subtype ⟨w, hw⟩
475
+
476
+ @[simp] lemma dual_restrict_comp_dual_lift (W : subspace K V) :
477
+ W.dual_restrict.comp W.dual_lift = 1 :=
478
+ by { ext φ x, simp }
479
+
480
+ lemma dual_restrict_left_inverse (W : subspace K V) :
481
+ function.left_inverse W.dual_restrict W.dual_lift :=
482
+ λ x, show W.dual_restrict.comp W.dual_lift x = x,
483
+ by { rw [dual_restrict_comp_dual_lift], refl }
484
+
485
+ lemma dual_lift_right_inverse (W : subspace K V) :
486
+ function.right_inverse W.dual_lift W.dual_restrict :=
487
+ W.dual_restrict_left_inverse
488
+
489
+ lemma dual_restrict_surjective :
490
+ function.surjective W.dual_restrict :=
491
+ W.dual_lift_right_inverse.surjective
492
+
493
+ lemma dual_lift_injective : function.injective W.dual_lift :=
494
+ W.dual_restrict_left_inverse.injective
495
+
496
+ /-- The quotient by the `dual_annihilator` of a subspace is isomorphic to the
497
+ dual of that subspace. -/
498
+ noncomputable def quot_annihilator_equiv (W : subspace K V) :
499
+ W.dual_annihilator.quotient ≃ₗ[K] module.dual K W :=
500
+ (quot_equiv_of_eq _ _ W.dual_restrict_ker_eq_dual_annihilator).symm.trans $
501
+ W.dual_restrict.quot_ker_equiv_of_surjective dual_restrict_surjective
502
+
503
+ /-- The natural isomorphism forom the dual of a subspace `W` to `W.dual_lift.range`. -/
504
+ noncomputable def dual_equiv_dual (W : subspace K V) :
505
+ module.dual K W ≃ₗ[K] W.dual_lift.range :=
506
+ linear_equiv.of_injective _ $ ker_eq_bot.2 dual_lift_injective
507
+
508
+ lemma dual_equiv_dual_def (W : subspace K V) :
509
+ W.dual_equiv_dual.to_linear_map = W.dual_lift.range_restrict := rfl
510
+
511
+ @[simp] lemma dual_equiv_dual_apply (φ : module.dual K W) :
512
+ W.dual_equiv_dual φ = ⟨W.dual_lift φ, mem_range.2 ⟨φ, rfl⟩⟩ := rfl
513
+
514
+ section
515
+
516
+ open_locale classical
517
+
518
+ open finite_dimensional
519
+
520
+ variables {V₁ : Type *} [add_comm_group V₁] [vector_space K V₁]
521
+
522
+ instance [H : finite_dimensional K V] : finite_dimensional K (module.dual K V) :=
523
+ begin
524
+ refine @linear_equiv.finite_dimensional _ _ _ _ _ _ _ _ _ H,
525
+ have hB := classical.some_spec (exists_is_basis_finite K V),
526
+ haveI := classical.choice hB.2 ,
527
+ exact is_basis.to_dual_equiv _ hB.1
528
+ end
529
+
530
+ variables [finite_dimensional K V] [finite_dimensional K V₁]
531
+
532
+ /-- The quotient by the dual is isomorphic to its dual annihilator. -/
533
+ noncomputable def quot_dual_equiv_annihilator (W : subspace K V) :
534
+ W.dual_lift.range.quotient ≃ₗ[K] W.dual_annihilator :=
535
+ linear_equiv.quot_equiv_of_quot_equiv $
536
+ linear_equiv.trans W.quot_annihilator_equiv W.dual_equiv_dual
537
+
538
+ /-- The quotient by a subspace is isomorphic to its dual annihilator. -/
539
+ noncomputable def quot_equiv_annihilator (W : subspace K V) :
540
+ W.quotient ≃ₗ[K] W.dual_annihilator :=
541
+ begin
542
+ refine linear_equiv.trans _ W.quot_dual_equiv_annihilator,
543
+ refine linear_equiv.quot_equiv_of_equiv _ _,
544
+ { refine linear_equiv.trans _ W.dual_equiv_dual,
545
+ have hB := classical.some_spec (exists_is_basis_finite K W),
546
+ haveI := classical.choice hB.2 ,
547
+ exact is_basis.to_dual_equiv _ hB.1 },
548
+ { have hB := classical.some_spec (exists_is_basis_finite K V),
549
+ haveI := classical.choice hB.2 ,
550
+ exact is_basis.to_dual_equiv _ hB.1 },
551
+ end
552
+
553
+ end
554
+
555
+ end subspace
0 commit comments