Perfect pairings of modules #
A perfect pairing of two (left) modules may be defined either as:
- A bilinear map
M × N → R
such that the induced mapsM → Dual R N
andN → Dual R M
are both bijective. (It follows from this that bothM
andN
are both reflexive modules.) - A linear equivalence
N ≃ Dual R M
for whichM
is reflexive. (It then follows thatN
is reflexive.)
In this file we provide a PerfectPairing
definition corresponding to 1 above, together with logic
to connect 1 and 2.
Main definitions #
structure
PerfectPairing
(R : Type u_1)
(M : Type u_2)
(N : Type u_3)
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
:
Type (max (max u_1 u_2) u_3)
A perfect pairing of two (left) modules over a commutative ring.
- bijectiveLeft : Function.Bijective ⇑self.toLin
- bijectiveRight : Function.Bijective ⇑(LinearMap.flip self.toLin)
Instances For
instance
PerfectPairing.instFunLike
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
:
FunLike (PerfectPairing R M N) M (N →ₗ[R] R)
Equations
- One or more equations did not get rendered due to their size.
def
PerfectPairing.flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
(p : PerfectPairing R M N)
:
PerfectPairing R N M
Given a perfect pairing between M
and N
, we may interchange the roles of M
and N
.
Equations
- PerfectPairing.flip p = { toLin := LinearMap.flip p.toLin, bijectiveLeft := (_ : Function.Bijective ⇑(LinearMap.flip p.toLin)), bijectiveRight := (_ : Function.Bijective ⇑p.toLin) }
Instances For
@[simp]
theorem
PerfectPairing.flip_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
(p : PerfectPairing R M N)
:
@[simp]
theorem
IsReflexive.toPerfectPairingDual_toLin
{R : Type u_1}
{M : Type u_2}
[CommRing R]
[AddCommGroup M]
[Module R M]
[Module.IsReflexive R M]
:
IsReflexive.toPerfectPairingDual.toLin = LinearMap.id
def
IsReflexive.toPerfectPairingDual
{R : Type u_1}
{M : Type u_2}
[CommRing R]
[AddCommGroup M]
[Module R M]
[Module.IsReflexive R M]
:
PerfectPairing R (Module.Dual R M) M
A reflexive module has a perfect pairing with its dual.
Equations
- IsReflexive.toPerfectPairingDual = { toLin := LinearMap.id, bijectiveLeft := (_ : Function.Bijective id), bijectiveRight := (_ : Function.Bijective ⇑(Module.Dual.eval R M)) }
Instances For
noncomputable def
LinearEquiv.flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
M ≃ₗ[R] Module.Dual R N
For a reflexive module M
, an equivalence N ≃ₗ[R] Dual R M
naturally yields an equivalence
M ≃ₗ[R] Dual R N
. Such equivalences are known as perfect pairings.
Equations
Instances For
@[simp]
theorem
LinearEquiv.coe_toLinearMap_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
↑(LinearEquiv.flip e) = LinearMap.flip ↑e
@[simp]
theorem
LinearEquiv.flip_apply
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(m : M)
(n : N)
:
((LinearEquiv.flip e) m) n = (e n) m
theorem
LinearEquiv.symm_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
theorem
LinearEquiv.trans_dualMap_symm_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
↑(e ≪≫ₗ LinearEquiv.dualMap (LinearEquiv.symm (LinearEquiv.flip e))) = Module.Dual.eval R N
theorem
LinearEquiv.isReflexive_of_equiv_dual_of_isReflexive
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
If N
is in perfect pairing with M
, then it is reflexive.
@[simp]
theorem
LinearEquiv.flip_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(h : optParam (Module.IsReflexive R N) (_ : Module.IsReflexive R N))
:
@[simp]
theorem
LinearEquiv.toPerfectPairing_toLin
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
(LinearEquiv.toPerfectPairing e).toLin = ↑e
noncomputable def
LinearEquiv.toPerfectPairing
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
:
PerfectPairing R N M
If M
is reflexive then a linear equivalence N ≃ Dual R M
is a perfect pairing.
Equations
- LinearEquiv.toPerfectPairing e = { toLin := ↑e, bijectiveLeft := (_ : Function.Bijective ⇑e), bijectiveRight := (_ : Function.Bijective ⇑(LinearEquiv.flip e)) }
Instances For
@[simp]
theorem
Submodule.dualCoannihilator_map_linearEquiv_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(p : Submodule R M)
:
@[simp]
theorem
Submodule.map_dualAnnihilator_linearEquiv_flip_symm
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(p : Submodule R N)
:
@[simp]
theorem
Submodule.map_dualCoannihilator_linearEquiv_flip
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(p : Submodule R (Module.Dual R M))
:
@[simp]
theorem
Submodule.dualAnnihilator_map_linearEquiv_flip_symm
{R : Type u_1}
{M : Type u_2}
{N : Type u_3}
[CommRing R]
[AddCommGroup M]
[Module R M]
[AddCommGroup N]
[Module R N]
[Module.IsReflexive R M]
(e : N ≃ₗ[R] Module.Dual R M)
(p : Submodule R (Module.Dual R N))
: