(Semi)linear maps #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we define
-
linear_map σ M M₂,M →ₛₗ[σ] M₂: a semilinear map between twomodules. Here,σis aring_homfromRtoR₂and anf : M →ₛₗ[σ] M₂satisfiesf (c • x) = (σ c) • (f x). We recover plain linear maps by choosingσto bering_hom.id R. This is denoted byM →ₗ[R] M₂. We also add the notationM →ₗ⋆[R] M₂for star-linear maps. -
is_linear_map R f: predicate saying thatf : M → M₂is a linear map. (Note that this was not generalized to semilinear maps.)
We then provide linear_map with the following instances:
linear_map.add_comm_monoidandlinear_map.add_comm_group: the elementwise addition structures corresponding to addition in the codomainlinear_map.distrib_mul_actionandlinear_map.module: the elementwise scalar action structures corresponding to applying the action in the codomain.module.End.semiringandmodule.End.ring: the (semi)ring of endomorphisms formed by taking the additive structure above with composition as multiplication.
Implementation notes #
To ensure that composition works smoothly for semilinear maps, we use the typeclasses
ring_hom_comp_triple, ring_hom_inv_pair and ring_hom_surjective from
algebra/ring/comp_typeclasses.
Notation #
- Throughout the file, we denote regular linear maps by
fₗ,gₗ, etc, and semilinear maps byf,g, etc.
TODO #
- Parts of this file have not yet been generalized to semilinear maps (i.e.
compatible_smul)
Tags #
linear map
A map f between modules over a semiring is linear if it satisfies the two properties
f (x + y) = f x + f y and f (c • x) = c • f x. The predicate is_linear_map R f asserts this
property. A bundled version is available with linear_map, and should be favored over
is_linear_map most of the time.
- to_fun : M → M₂
- map_add' : ∀ (x y : M), self.to_fun (x + y) = self.to_fun x + self.to_fun y
- map_smul' : ∀ (r : R) (x : M), self.to_fun (r • x) = ⇑σ r • self.to_fun x
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. Elements of linear_map σ M M₂ (available under the notation
M →ₛₗ[σ] M₂) are bundled versions of such maps. For plain linear maps (i.e. for which
σ = ring_hom.id R), the notation M →ₗ[R] M₂ is available. An unbundled version of plain linear
maps is available with the predicate is_linear_map, but it should be avoided most of the time.
Instances for linear_map
- linear_map.has_sizeof_inst
- linear_map.semilinear_map_class
- linear_map.has_coe_to_fun
- distrib_mul_action_hom.linear_map.has_coe
- linear_map.has_smul
- linear_map.smul_comm_class
- linear_map.is_scalar_tower
- linear_map.is_central_scalar
- linear_map.has_zero
- linear_map.inhabited
- linear_map.has_add
- linear_map.add_comm_monoid
- linear_map.has_neg
- linear_map.has_sub
- linear_map.add_comm_group
- linear_map.distrib_mul_action
- linear_map.module
- linear_map.no_zero_smul_divisors
- linear_map.module.End.has_one
- linear_map.module.End.has_mul
- module.End.monoid
- module.End.semiring
- module.End.ring
- module.End.is_scalar_tower
- module.End.smul_comm_class
- module.End.smul_comm_class'
- linear_map.apply_module
- linear_map.apply_has_faithful_smul
- linear_map.apply_smul_comm_class
- linear_map.apply_smul_comm_class'
- linear_map.apply_is_scalar_tower
- linear_equiv.linear_map.has_coe
- linear_map.unique_of_left
- linear_map.unique_of_right
- linear_map.module.End.nontrivial
- module.End.algebra
- linear_map.coe_is_scalar_tower
- linear_pmap.has_vadd
- linear_pmap.add_action
- module.dual.inhabited
- module.dual.has_coe_to_fun
- basis.dual_free
- basis.dual_finite
- subspace.module.dual.finite_dimensional
- module.free.linear_map
- module.finite.linear_map
- continuous_linear_map.linear_map.has_coe
- linear_map.finite_dimensional''
The add_hom underlying a linear_map.
- coe : F → Π (a : M), (λ (_x : M), M₂) a
- coe_injective' : function.injective semilinear_map_class.coe
- map_add : ∀ (f : F) (x y : M), ⇑f (x + y) = ⇑f x + ⇑f y
- map_smulₛₗ : ∀ (f : F) (r : R) (x : M), ⇑f (r • x) = ⇑σ r • ⇑f x
semilinear_map_class F σ M M₂ asserts F is a type of bundled σ-semilinear maps M → M₂.
See also linear_map_class 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.
Instances of this typeclass
- semilinear_equiv_class.semilinear_map_class
- alg_hom_class.linear_map_class
- non_unital_alg_hom_class.linear_map_class
- continuous_semilinear_map_class.to_semilinear_map_class
- semilinear_isometry_class.to_semilinear_map_class
- linear_map.semilinear_map_class
- quadratic_form.isometric_map.semilinear_map_class
- Module.linear_map_class
- QuadraticModule.linear_map_class
Instances of other typeclasses for semilinear_map_class
- semilinear_map_class.has_sizeof_inst
linear_map_class F R M M₂ asserts F is a type of bundled R-linear maps M → M₂.
This is an abbreviation for semilinear_map_class F (ring_hom.id R) M M₂.
Equations
- semilinear_map_class.add_monoid_hom_class F = {coe := λ (f : F), ⇑f, coe_injective' := _, map_add := _, map_zero := _}
Equations
- semilinear_map_class.distrib_mul_action_hom_class F = {coe := λ (f : F), ⇑f, coe_injective' := _, map_smul := _, map_add := _, map_zero := _}
Equations
- linear_map.semilinear_map_class = {coe := linear_map.to_fun _inst_12, coe_injective' := _, map_add := _, map_smulₛₗ := _}
Helper instance for when there's too many metavariables to apply fun_like.has_coe_to_fun
directly.
The distrib_mul_action_hom underlying a linear_map.
Copy of a linear_map with a new to_fun equal to the old one. Useful to fix definitional
equalities.
See Note [custom simps projection].
Equations
- linear_map.simps.apply σ M M₃ f = ⇑f
Identity map as a linear_map
If two linear maps are equal, they are equal at each point.
A typeclass for has_smul structures which can be moved through a linear_map.
This typeclass is generated automatically from a is_scalar_tower instance, but exists so that
we can also add an instance for add_comm_group.int_module, allowing z • to be moved even if
R does not support negation.
Instances of this typeclass
Instances of other typeclasses for linear_map.compatible_smul
- linear_map.compatible_smul.has_sizeof_inst
Equations
convert a linear map to an additive map
If M and M₂ are both R-modules and S-modules and R-module structures
are defined by an action of R on S (formally, we have two scalar towers), then any S-linear
map from M to M₂ is R-linear.
See also linear_map.map_smul_of_tower.
Composition of two linear maps is a linear map
If a function g is a left and right inverse of a linear map f, then g is linear itself.
Equations
Equations
A distrib_mul_action_hom between two modules is a linear map.
Equations
Convert an is_linear_map predicate to a linear_map
Linear endomorphisms of a module, with associated ring structure
module.End.semiring and algebra structure module.End.algebra.
Reinterpret an additive homomorphism as a ℕ-linear map.
Reinterpret an additive homomorphism as a ℤ-linear map.
Reinterpret an additive homomorphism as a ℚ-linear map.
Arithmetic on the codomain #
The constant 0 map is linear.
Equations
- linear_map.inhabited = {default := 0}
The sum of two linear maps is linear.
The type of linear maps is an additive monoid.
Equations
- linear_map.add_comm_monoid = function.injective.add_comm_monoid coe_fn linear_map.add_comm_monoid._proof_2 linear_map.add_comm_monoid._proof_3 linear_map.add_comm_monoid._proof_4 linear_map.add_comm_monoid._proof_5
The negation of a linear map is linear.
The subtraction of two linear maps is linear.
The type of linear maps is an additive group.
Equations
- linear_map.add_comm_group = function.injective.add_comm_group coe_fn linear_map.add_comm_group._proof_3 linear_map.add_comm_group._proof_4 linear_map.add_comm_group._proof_5 linear_map.add_comm_group._proof_6 linear_map.add_comm_group._proof_7 linear_map.add_comm_group._proof_8 linear_map.add_comm_group._proof_9
Equations
- linear_map.distrib_mul_action = {to_mul_action := {to_has_smul := linear_map.has_smul _inst_13, one_smul := _, mul_smul := _}, smul_zero := _, smul_add := _}
Equations
- linear_map.module = {to_distrib_mul_action := linear_map.distrib_mul_action _inst_13, add_smul := _, zero_smul := _}
Monoid structure of endomorphisms #
Lemmas about pow such as linear_map.pow_apply appear in later files.
Equations
- linear_map.module.End.has_one = {one := linear_map.id _inst_4}
Equations
- linear_map.module.End.has_mul = {mul := linear_map.comp linear_map.module.End.has_mul._proof_1}
Equations
- module.End.monoid = {mul := has_mul.mul linear_map.module.End.has_mul, mul_assoc := _, one := 1, one_mul := _, mul_one := _, npow := npow_rec (mul_one_class.to_has_mul (module.End R M)), npow_zero' := _, npow_succ' := _}
Equations
- module.End.semiring = {add := has_add.add linear_map.has_add, add_assoc := _, zero := 0, zero_add := _, add_zero := _, nsmul := add_monoid_with_one.nsmul add_monoid_with_one.unary, nsmul_zero' := _, nsmul_succ' := _, add_comm := _, mul := has_mul.mul linear_map.module.End.has_mul, left_distrib := _, right_distrib := _, zero_mul := _, mul_zero := _, mul_assoc := _, one := 1, one_mul := _, mul_one := _, nat_cast := λ (n : ℕ), n • 1, nat_cast_zero := _, nat_cast_succ := _, npow := monoid.npow module.End.monoid, npow_zero' := _, npow_succ' := _}
See also module.End.nat_cast_def.
Equations
- module.End.ring = {add := semiring.add module.End.semiring, add_assoc := _, zero := semiring.zero module.End.semiring, zero_add := _, add_zero := _, nsmul := semiring.nsmul module.End.semiring, nsmul_zero' := _, nsmul_succ' := _, neg := add_comm_group.neg linear_map.add_comm_group, sub := add_comm_group.sub linear_map.add_comm_group, sub_eq_add_neg := _, zsmul := add_comm_group.zsmul linear_map.add_comm_group, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _, int_cast := λ (z : ℤ), z • 1, nat_cast := semiring.nat_cast module.End.semiring, one := semiring.one module.End.semiring, nat_cast_zero := _, nat_cast_succ := _, int_cast_of_nat := _, int_cast_neg_succ_of_nat := _, mul := semiring.mul module.End.semiring, mul_assoc := _, one_mul := _, mul_one := _, npow := semiring.npow module.End.semiring, npow_zero' := _, npow_succ' := _, left_distrib := _, right_distrib := _}
See also module.End.int_cast_def.
Action by a module endomorphism. #
The tautological action by module.End R M (aka M →ₗ[R] M) on M.
This generalizes function.End.apply_mul_action.
Equations
- linear_map.apply_module = {to_distrib_mul_action := {to_mul_action := {to_has_smul := {smul := λ (_x : module.End R M) (_y : M), ⇑_x _y}, one_smul := _, mul_smul := _}, smul_zero := _, smul_add := _}, add_smul := _, zero_smul := _}
linear_map.apply_module is faithful.
Actions as module endomorphisms #
Each element of the monoid defines a linear map.
This is a stronger version of distrib_mul_action.to_add_monoid_hom.
Equations
- distrib_mul_action.to_linear_map R M s = {to_fun := has_smul.smul s, map_add' := _, map_smul' := _}
Each element of the monoid defines a module endomorphism.
This is a stronger version of distrib_mul_action.to_add_monoid_End.
Equations
- distrib_mul_action.to_module_End R M = {to_fun := distrib_mul_action.to_linear_map R M _inst_6, map_one' := _, map_mul' := _}
Each element of the semiring defines a module endomorphism.
This is a stronger version of distrib_mul_action.to_module_End.
Equations
- module.to_module_End R M = {to_fun := distrib_mul_action.to_linear_map R M _inst_6, map_one' := _, map_mul' := _, map_zero' := _, map_add' := _}
The canonical (semi)ring isomorphism from Rᵐᵒᵖ to module.End R R induced by the right
multiplication.
Equations
- module.module_End_self R = {to_fun := distrib_mul_action.to_linear_map R R _, inv_fun := λ (f : module.End R R), mul_opposite.op (⇑f 1), left_inv := _, right_inv := _, map_mul' := _, map_add' := _}
The canonical (semi)ring isomorphism from R to module.End Rᵐᵒᵖ R induced by the left
multiplication.
Equations
- module.module_End_self_op R = {to_fun := distrib_mul_action.to_linear_map Rᵐᵒᵖ R _, inv_fun := λ (f : module.End Rᵐᵒᵖ R), ⇑f 1, left_inv := _, right_inv := _, map_mul' := _, map_add' := _}