mathlib3documentation

ring_theory.derivation.basic

Derivations #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

This file defines derivation. A derivation D from the R-algebra A to the A-module M is an R-linear map that satisfy the Leibniz rule D (a * b) = a * D b + D a * b.

Main results #

• derivation: The type of R-derivations from A to M. This has an A-module structure.
• derivation.llcomp: We may compose linear maps and derivations to obtain a derivation, and the composition is bilinear.

See ring_theory.derivation.lie for

• derivation.lie_algebra: The R-derivations from A to A form an lie algebra over R.

and ring_theory.derivation.to_square_zero for

• derivation_to_square_zero_equiv_lift: The R-derivations from A into a square-zero ideal I of B corresponds to the lifts A →ₐ[R] B of the map A →ₐ[R] B ⧸ I.

Future project #

• Generalize derivations into bimodules.
structure derivation (R : Type u_1) (A : Type u_2) [ A] (M : Type u_3) [ M] [ M] :
Type (max u_2 u_3)

D : derivation R A M is an R-linear map from A to M that satisfies the leibniz equality. We also require that D 1 = 0. See derivation.mk' for a constructor that deduces this assumption from the Leibniz rule when M is cancellative.

TODO: update this when bimodules are defined.

Instances for derivation
@[protected, instance]
def derivation.add_monoid_hom_class {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
Equations
@[protected, instance]
def derivation.has_coe_to_fun {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
has_coe_to_fun A M) (λ (_x : A M), A M)

Helper instance for when there's too many metavariables to apply fun_like.has_coe_to_fun directly.

Equations
theorem derivation.to_fun_eq_coe {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) :
@[protected, instance]
def derivation.has_coe_to_linear_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
has_coe A M) (A →ₗ[R] M)
Equations
@[simp]
theorem derivation.to_linear_map_eq_coe {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) :
@[simp]
theorem derivation.mk_coe {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (f : A →ₗ[R] M) (h₁ : f 1 = 0) (h₂ : (a b : A), f (a * b) = a f b + b f a) :
@[simp, norm_cast]
theorem derivation.coe_fn_coe {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (f : A M) :
theorem derivation.coe_injective {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
@[ext]
theorem derivation.ext {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} (H : (a : A), D1 a = D2 a) :
D1 = D2
theorem derivation.congr_fun {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} (h : D1 = D2) (a : A) :
D1 a = D2 a
@[protected]
theorem derivation.map_add {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (a b : A) :
D (a + b) = D a + D b
@[protected]
theorem derivation.map_zero {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) :
D 0 = 0
@[simp]
theorem derivation.map_smul {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (r : R) (a : A) :
D (r a) = r D a
@[simp]
theorem derivation.leibniz {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (a b : A) :
D (a * b) = a D b + b D a
theorem derivation.map_sum {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) {ι : Type u_4} (s : finset ι) (f : ι A) :
D (s.sum (λ (i : ι), f i)) = s.sum (λ (i : ι), D (f i))
@[simp]
theorem derivation.map_smul_of_tower {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [ A] [ M] [ R] (D : A M) (r : S) (a : A) :
D (r a) = r D a
@[simp]
theorem derivation.map_one_eq_zero {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) :
D 1 = 0
@[simp]
theorem derivation.map_algebra_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (r : R) :
D ( A) r) = 0
@[simp]
theorem derivation.map_coe_nat {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (n : ) :
D n = 0
@[simp]
theorem derivation.leibniz_pow {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) (a : A) (n : ) :
D (a ^ n) = n a ^ (n - 1) D a
theorem derivation.eq_on_adjoin {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} {s : set A} (h : D2 s) :
D2 s)
theorem derivation.ext_of_adjoin_eq_top {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} (s : set A) (hs : = ) (h : D2 s) :
D1 = D2

If adjoin of a set is the whole algebra, then any two derivations equal on this set are equal on the whole algebra.

@[protected, instance]
def derivation.has_zero {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
Equations
@[simp]
theorem derivation.coe_zero {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
0 = 0
@[simp]
theorem derivation.coe_zero_linear_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
0 = 0
theorem derivation.zero_apply {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (a : A) :
0 a = 0
@[protected, instance]
def derivation.has_add {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
Equations
@[simp]
theorem derivation.coe_add {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D1 D2 : A M) :
(D1 + D2) = D1 + D2
@[simp]
theorem derivation.coe_add_linear_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D1 D2 : A M) :
(D1 + D2) = D1 + D2
theorem derivation.add_apply {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} (a : A) :
(D1 + D2) a = D1 a + D2 a
@[protected, instance]
def derivation.inhabited {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
Equations
@[protected, instance]
def derivation.has_smul {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [monoid S] [ M] [ M] [ M] :
A M)
Equations
@[simp]
theorem derivation.coe_smul {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [monoid S] [ M] [ M] [ M] (r : S) (D : A M) :
(r D) = r D
@[simp]
theorem derivation.coe_smul_linear_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [monoid S] [ M] [ M] [ M] (r : S) (D : A M) :
(r D) = r D
theorem derivation.smul_apply {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (a : A) {S : Type u_4} [monoid S] [ M] [ M] [ M] (r : S) (D : A M) :
(r D) a = r D a
@[protected, instance]
def derivation.add_comm_monoid {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
Equations
def derivation.coe_fn_add_monoid_hom {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] :
A M →+ A M

coe_fn as an add_monoid_hom.

Equations
@[protected, instance]
def derivation.distrib_mul_action {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [monoid S] [ M] [ M] [ M] :
A M)
Equations
@[protected, instance]
def derivation.is_central_scalar {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [monoid S] [ M] [ M] [ M] [ M] :
A M)
@[protected, instance]
def derivation.is_scalar_tower {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} {T : Type u_5} [monoid S] [ M] [ M] [ M] [monoid T] [ M] [ M] [ M] [ T] [ M] :
A M)
@[protected, instance]
def derivation.smul_comm_class {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} {T : Type u_5} [monoid S] [ M] [ M] [ M] [monoid T] [ M] [ M] [ M] [ M] :
A M)
@[protected, instance]
def derivation.module {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [semiring S] [ M] [ M] [ M] :
A M)
Equations
def linear_map.comp_der {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {N : Type u_4} [ N] [ N] [ M] [ N] (f : M →ₗ[A] N) :
A M →ₗ[R] A N

We can push forward derivations using linear maps, i.e., the composition of a derivation with a linear map is a derivation. Furthermore, this operation is linear on the spaces of derivations.

Equations
@[simp]
theorem derivation.coe_to_linear_map_comp {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) {N : Type u_4} [ N] [ N] [ M] [ N] (f : M →ₗ[A] N) :
@[simp]
theorem derivation.coe_comp {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A M) {N : Type u_4} [ N] [ N] [ M] [ N] (f : M →ₗ[A] N) :
def derivation.llcomp {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {N : Type u_4} [ N] [ N] [ M] [ N] :
(M →ₗ[A] N) →ₗ[A] A M →ₗ[R] A N

The composition of a derivation with a linear map as a bilinear map

Equations
@[simp]
theorem derivation.llcomp_apply {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {N : Type u_4} [ N] [ N] [ M] [ N] (f : M →ₗ[A] N) :
def linear_equiv.comp_der {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {N : Type u_4} [ N] [ N] [ M] [ N] (e : M ≃ₗ[A] N) :
A M ≃ₗ[R] A N

Pushing a derivation foward through a linear equivalence is an equivalence.

Equations
@[protected]
def derivation.restrict_scalars (R : Type u_1) {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] {S : Type u_4} [ A] [ M] [ S] (d : A M) :
A M

If A is both an R-algebra and an S-algebra; M is both an R-module and an S-module, then an S-derivation A → M is also an R-derivation if it is also R-linear.

Equations
def derivation.mk' {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A →ₗ[R] M) (h : (a b : A), D (a * b) = a D b + b D a) :
A M

Define derivation R A M from a linear map when M is cancellative by verifying the Leibniz rule.

Equations
@[simp]
theorem derivation.coe_mk' {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A →ₗ[R] M) (h : (a b : A), D (a * b) = a D b + b D a) :
h) = D
@[simp]
theorem derivation.coe_mk'_linear_map {R : Type u_1} {A : Type u_2} [ A] {M : Type u_3} [ M] [ M] (D : A →ₗ[R] M) (h : (a b : A), D (a * b) = a D b + b D a) :
h) = D
@[protected]
theorem derivation.map_neg {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) (a : A) :
D (-a) = -D a
@[protected]
theorem derivation.map_sub {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) (a b : A) :
D (a - b) = D a - D b
@[simp]
theorem derivation.map_coe_int {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) (n : ) :
D n = 0
theorem derivation.leibniz_of_mul_eq_one {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) {a b : A} (h : a * b = 1) :
D a = -a ^ 2 D b
theorem derivation.leibniz_inv_of {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) (a : A) [invertible a] :
D ( a) = - a ^ 2 D a
theorem derivation.leibniz_inv {R : Type u_1} [comm_ring R] {M : Type u_3} [ M] {K : Type u_2} [field K] [ M] [ K] (D : K M) (a : K) :
@[protected, instance]
def derivation.has_neg {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] :
has_neg A M)
Equations
@[simp]
theorem derivation.coe_neg {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) :
@[simp]
theorem derivation.coe_neg_linear_map {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) :
theorem derivation.neg_apply {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D : A M) (a : A) :
(-D) a = -D a
@[protected, instance]
def derivation.has_sub {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] :
has_sub A M)
Equations
@[simp]
theorem derivation.coe_sub {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D1 D2 : A M) :
(D1 - D2) = D1 - D2
@[simp]
theorem derivation.coe_sub_linear_map {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] (D1 D2 : A M) :
(D1 - D2) = D1 - D2
theorem derivation.sub_apply {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] {D1 D2 : A M} (a : A) :
(D1 - D2) a = D1 a - D2 a
@[protected, instance]
def derivation.add_comm_group {R : Type u_1} [comm_ring R] {A : Type u_2} [comm_ring A] [ A] {M : Type u_3} [ M] [ M] :
Equations