(Semi)linear equivalences #
In this file we define
LinearEquiv σ M M₂
,M ≃ₛₗ[σ] M₂
: an invertible semilinear map. Here,σ
is aRingHom
fromR
toR₂
and ane : M ≃ₛₗ[σ] M₂
satisfiese (c • x) = (σ c) • (e x)
. The plain linear version, withσ
beingRingHom.id R
, is denoted byM ≃ₗ[R] M₂
, and the star-linear version (withσ
beingstarRingEnd
) is denoted byM ≃ₗ⋆[R] M₂
.
Implementation notes #
To ensure that composition works smoothly for semilinear equivalences, we use the typeclasses
RingHomCompTriple
, RingHomInvPair
and RingHomSurjective
from
Algebra/Ring/CompTypeclasses
.
The group structure on automorphisms, LinearEquiv.automorphismGroup
, is provided elsewhere.
TODO #
- Parts of this file have not yet been generalized to semilinear maps
Tags #
linear equiv, linear equivalences, linear isomorphism, linear isomorphic
A linear equivalence is an invertible linear map.
- toFun : M → M₂
- invFun : M₂ → M
The backwards directed function underlying a linear equivalence.
- left_inv : Function.LeftInverse self.invFun (↑self).toFun
LinearEquiv.invFun
is a left inverse to the linear equivalence's underlying function. - right_inv : Function.RightInverse self.invFun (↑self).toFun
LinearEquiv.invFun
is a right inverse to the linear equivalence's underlying function.
Instances For
The additive equivalence of types underlying a linear equivalence.
Equations
- self.toAddEquiv = { toFun := (↑self).toFun, invFun := self.invFun, left_inv := ⋯, right_inv := ⋯, map_add' := ⋯ }
Instances For
LinearEquiv.invFun
is a right inverse to the linear equivalence's underlying function.
LinearEquiv.invFun
is a left inverse to the linear equivalence's underlying function.
The notation M ≃ₛₗ[σ] M₂
denotes the type of linear equivalences between M
and M₂
over a
ring homomorphism σ
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The notation M ≃ₗ [R] M₂
denotes the type of linear equivalences between M
and M₂
over
a plain linear map M →ₗ M₂
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
SemilinearEquivClass F σ M M₂
asserts F
is a type of bundled σ
-semilinear equivs
M → M₂
.
See also LinearEquivClass F R M M₂
for the case where σ
is the identity map on R
.
A map f
between an R
-module and an S
-module over a ring homomorphism σ : R →+* S
is semilinear if it satisfies the two properties f (x + y) = f x + f y
and
f (c • x) = (σ c) • f x
.
Applying a semilinear equivalence
f
overσ
tor • x
equalsσ r • f x
.
Instances
Applying a semilinear equivalence f
over σ
to r • x
equals σ r • f x
.
LinearEquivClass F R M M₂
asserts F
is a type of bundled R
-linear equivs M → M₂
.
This is an abbreviation for SemilinearEquivClass F (RingHom.id R) M M₂
.
Equations
- LinearEquivClass F R M M₂ = SemilinearEquivClass F (RingHom.id R) M M₂
Instances For
Equations
- ⋯ = ⋯
Reinterpret an element of a type of semilinear equivalences as a semilinear equivalence.
Equations
- ↑f = let __src := ↑f; let __src_1 := ↑f; { toFun := __src.toFun, map_add' := ⋯, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
Reinterpret an element of a type of semilinear equivalences as a semilinear equivalence.
Equations
- SemilinearEquivClass.instCoeToSemilinearEquiv = { coe := fun (f : F) => ↑f }
Equations
- LinearEquiv.instCoeLinearMap = { coe := LinearEquiv.toLinearMap }
The equivalence of types underlying a linear equivalence.
Equations
- f.toEquiv = f.toAddEquiv.toEquiv
Instances For
Helper instance for when inference gets stuck on following the normal chain
EquivLike → FunLike
.
TODO: this instance doesn't appear to be necessary: remove it (after benchmarking?)
Equations
- LinearEquiv.instFunLike = { coe := DFunLike.coe, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
The identity map is a linear equivalence.
Equations
- LinearEquiv.refl R M = let __src := LinearMap.id; let __src_1 := Equiv.refl M; { toLinearMap := __src, invFun := __src_1.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
Linear equivalences are symmetric.
Equations
- One or more equations did not get rendered due to their size.
Instances For
See Note [custom simps projection]
Equations
- LinearEquiv.Simps.apply e = ⇑e
Instances For
See Note [custom simps projection]
Equations
- LinearEquiv.Simps.symm_apply e = ⇑e.symm
Instances For
Linear equivalences are transitive.
Equations
- e₁₂.trans e₂₃ = let __src := (↑e₂₃).comp ↑e₁₂; let __src_1 := e₁₂.toEquiv.trans e₂₃.toEquiv; { toLinearMap := __src, invFun := __src_1.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
The notation e₁ ≪≫ₗ e₂
denotes the composition of the linear equivalences e₁
and e₂
.
Equations
- LinearEquiv.transNotation = Lean.ParserDescr.trailingNode `LinearEquiv.transNotation 80 80 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ≪≫ₗ ") (Lean.ParserDescr.cat `term 81))
Instances For
Pretty printer defined by notation3
command.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The two paths coercion can take to an AddMonoidHom
are equivalent
Auxilliary definition to avoid looping in dsimp
with LinearEquiv.symm_mk
.
Equations
- LinearEquiv.symm_mk.aux e f h₁ h₂ h₃ h₄ = { toFun := ⇑e, map_add' := h₁, map_smul' := h₂, invFun := f, left_inv := h₃, right_inv := h₄ }.symm
Instances For
An involutive linear map is a linear equivalence.
Equations
- LinearEquiv.ofInvolutive f hf = let __src := Function.Involutive.toPerm (⇑f) hf; { toLinearMap := f, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
If M
and M₂
are both R
-semimodules and S
-semimodules and R
-semimodule structures
are defined by an action of R
on S
(formally, we have two scalar towers), then any S
-linear
equivalence from M
to M₂
is also an R
-linear equivalence.
See also LinearMap.restrictScalars
.
Equations
- LinearEquiv.restrictScalars R f = let __src := ↑R ↑f; { toFun := ⇑f, map_add' := ⋯, map_smul' := ⋯, invFun := ⇑f.symm, left_inv := ⋯, right_inv := ⋯ }
Instances For
Restriction from R
-linear automorphisms of M
to R
-linear endomorphisms of M
,
promoted to a monoid hom.
Equations
Instances For
The tautological action by M ≃ₗ[R] M
on M
.
This generalizes Function.End.applyMulAction
.
Equations
- LinearEquiv.applyDistribMulAction = DistribMulAction.mk ⋯ ⋯
LinearEquiv.applyDistribMulAction
is faithful.
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Any two modules that are subsingletons are isomorphic.
Equations
- LinearEquiv.ofSubsingleton M M₂ = let __src := 0; { toFun := fun (x : M) => 0, map_add' := ⋯, map_smul' := ⋯, invFun := fun (x : M₂) => 0, left_inv := ⋯, right_inv := ⋯ }
Instances For
g : R ≃+* S
is R
-linear when the module structure on S
is Module.compHom S g
.
Equations
- Module.compHom.toLinearEquiv g = { toFun := ⇑g, map_add' := ⋯, map_smul' := ⋯, invFun := ⇑g.symm, left_inv := ⋯, right_inv := ⋯ }
Instances For
Each element of the group defines a linear equivalence.
This is a stronger version of DistribMulAction.toAddEquiv
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Each element of the group defines a module automorphism.
This is a stronger version of DistribMulAction.toAddAut
.
Equations
- DistribMulAction.toModuleAut R M = { toFun := DistribMulAction.toLinearEquiv R M, map_one' := ⋯, map_mul' := ⋯ }
Instances For
An additive equivalence whose underlying function preserves smul
is a linear equivalence.
Equations
- e.toLinearEquiv h = { toFun := e.toFun, map_add' := ⋯, map_smul' := h, invFun := e.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
An additive equivalence between commutative additive monoids is a linear equivalence between ℕ-modules
Equations
- e.toNatLinearEquiv = e.toLinearEquiv ⋯
Instances For
An additive equivalence between commutative additive groups is a linear equivalence between ℤ-modules
Equations
- e.toIntLinearEquiv = e.toLinearEquiv ⋯
Instances For
The equivalence between R-linear maps from R
to M
, and points of M
itself.
This says that the forgetful functor from R
-modules to types is representable, by R
.
This is an S
-linear equivalence, under the assumption that S
acts on M
commuting with R
.
When R
is commutative, we can take this to be the usual action with S = R
.
Otherwise, S = ℕ
shows that the equivalence is additive.
See note [bundled maps over different rings].
Equations
- One or more equations did not get rendered due to their size.
Instances For
The R
-linear equivalence between additive morphisms A →+ B
and ℕ
-linear morphisms A →ₗ[ℕ] B
.
Equations
- addMonoidHomLequivNat R = { toFun := AddMonoidHom.toNatLinearMap, map_add' := ⋯, map_smul' := ⋯, invFun := LinearMap.toAddMonoidHom, left_inv := ⋯, right_inv := ⋯ }
Instances For
The R
-linear equivalence between additive morphisms A →+ B
and ℤ
-linear morphisms A →ₗ[ℤ] B
.
Equations
- addMonoidHomLequivInt R = { toFun := AddMonoidHom.toIntLinearMap, map_add' := ⋯, map_smul' := ⋯, invFun := LinearMap.toAddMonoidHom, left_inv := ⋯, right_inv := ⋯ }
Instances For
Ring equivalence between additive group endomorphisms of an AddCommGroup
A
and
ℤ
-module endomorphisms of A.
Equations
- addMonoidEndRingEquivInt A = let __src := addMonoidHomLequivInt ℤ; { toFun := (↑__src).toFun, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯, map_add' := ⋯ }
Instances For
Between two zero modules, the zero map is an equivalence.
Equations
- LinearEquiv.instZero = { zero := let __src := 0; { toFun := 0, map_add' := ⋯, map_smul' := ⋯, invFun := 0, left_inv := ⋯, right_inv := ⋯ } }
Between two zero modules, the zero map is the only equivalence.
Equations
- LinearEquiv.instUnique = { default := 0, uniq := ⋯ }
Equations
- LinearEquiv.uniqueOfSubsingleton = inferInstance
Linear equivalence between a curried and uncurried function.
Differs from TensorProduct.curry
.
Equations
- LinearEquiv.curry R V V₂ = let __src := Equiv.curry V V₂ R; { toFun := __src.toFun, map_add' := ⋯, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
If a linear map has an inverse, it is a linear equivalence.
Equations
- LinearEquiv.ofLinear f g h₁ h₂ = { toLinearMap := f, invFun := ⇑g, left_inv := ⋯, right_inv := ⋯ }
Instances For
x ↦ -x
as a LinearEquiv
Equations
- LinearEquiv.neg R = let __src := Equiv.neg M; let __src_1 := -LinearMap.id; { toFun := __src.toFun, map_add' := ⋯, map_smul' := ⋯, invFun := __src.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
Multiplying by a unit a
of the ring R
is a linear equivalence.
Equations
Instances For
A linear isomorphism between the domains and codomains of two spaces of linear maps gives a linear isomorphism between the two function spaces.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If M₂
and M₃
are linearly isomorphic then the two spaces of linear maps from M
into M₂
and M
into M₃
are linearly isomorphic.
Equations
- f.congrRight = (LinearEquiv.refl R M).arrowCongr f
Instances For
If M
and M₂
are linearly isomorphic then the two spaces of linear maps from M
and M₂
to
themselves are linearly isomorphic.
Equations
- e.conj = e.arrowCongr e
Instances For
An R
-linear isomorphism between two R
-modules M₂
and M₃
induces an S
-linear
isomorphism between M₂ →ₗ[R] M
and M₃ →ₗ[R] M
, if M
is both an R
-module and an
S
-module and their actions commute.
Equations
Instances For
Multiplying by a nonzero element a
of the field K
is a linear equivalence.
Equations
- LinearEquiv.smulOfNeZero K M a ha = LinearEquiv.smulOfUnit (Units.mk0 a ha)
Instances For
An equivalence whose underlying function is linear is a linear equivalence.
Equations
- e.toLinearEquiv h = let __src := IsLinearMap.mk' (⇑e) h; { toFun := e.toFun, map_add' := ⋯, map_smul' := ⋯, invFun := e.invFun, left_inv := ⋯, right_inv := ⋯ }
Instances For
Given an R
-module M
and a function m → n
between arbitrary types,
construct a linear map (n → M) →ₗ[R] (m → M)
Equations
- LinearMap.funLeft R M f = { toFun := fun (x : n → M) => x ∘ f, map_add' := ⋯, map_smul' := ⋯ }
Instances For
Given an R
-module M
and an equivalence m ≃ n
between arbitrary types,
construct a linear equivalence (n → M) ≃ₗ[R] (m → M)
Equations
- LinearEquiv.funCongrLeft R M e = LinearEquiv.ofLinear (LinearMap.funLeft R M ⇑e) (LinearMap.funLeft R M ⇑e.symm) ⋯ ⋯