data.dfinsupp

# Dependent functions with finite support #

For a non-dependent version see data/finsupp.lean.

structure dfinsupp.pre (ι : Type u) (β : ι → Type v) [Π (i : ι), has_zero (β i)] :
Type (max u v)
@[protected, instance]
def dfinsupp.inhabited_pre (ι : Type u) (β : ι → Type v) [Π (i : ι), has_zero (β i)] :
Equations
@[protected, instance]
def dfinsupp.pre.setoid (ι : Type u) (β : ι → Type v) [Π (i : ι), has_zero (β i)] :
setoid β)
Equations
def dfinsupp {ι : Type u} (β : ι → Type v) [Π (i : ι), has_zero (β i)] :
Type (max u v)

A dependent function Π i, β i with finite support.

Equations
@[protected, instance]
def dfinsupp.has_coe_to_fun {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] :
has_coe_to_fun (Π₀ (i : ι), β i)
Equations
• dfinsupp.has_coe_to_fun = {F := λ (_x : Π₀ (i : ι), β i), Π (i : ι), β i, coe := λ (f : Π₀ (i : ι), β i), dfinsupp.has_coe_to_fun._proof_1}
@[protected, instance]
def dfinsupp.has_zero {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] :
has_zero (Π₀ (i : ι), β i)
Equations
@[protected, instance]
def dfinsupp.inhabited {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] :
inhabited (Π₀ (i : ι), β i)
Equations
@[simp]
theorem dfinsupp.coe_zero {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] :
0 = 0
theorem dfinsupp.zero_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] (i : ι) :
0 i = 0
theorem dfinsupp.coe_fn_injective {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] :
@[ext]
theorem dfinsupp.ext {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] {f g : Π₀ (i : ι), β i} (H : ∀ (i : ι), f i = g i) :
f = g
def dfinsupp.map_range {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ i) (hf : ∀ (i : ι), f i 0 = 0) (g : Π₀ (i : ι), β₁ i) :
Π₀ (i : ι), β₂ i

The composition of f : β₁ → β₂ and g : Π₀ i, β₁ i is map_range f hf g : Π₀ i, β₂ i, well defined when f 0 = 0.

This preserves the structure on f, and exists in various bundled forms for when f is itself bundled:

• dfinsupp.map_range.add_monoid_hom
• dfinsupp.map_range.add_equiv
• dfinsupp.map_range.linear_map
• dfinsupp.map_range.linear_equiv
Equations
@[simp]
theorem dfinsupp.map_range_apply {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ i) (hf : ∀ (i : ι), f i 0 = 0) (g : Π₀ (i : ι), β₁ i) (i : ι) :
hf g) i = f i (g i)
@[simp]
theorem dfinsupp.map_range_id {ι : Type u} {β₁ : ι → Type v₁} [Π (i : ι), has_zero (β₁ i)] (h : (∀ (i : ι), id 0 = 0) := _) (g : Π₀ (i : ι), β₁ i) :
dfinsupp.map_range (λ (i : ι), id) h g = g
theorem dfinsupp.map_range_comp {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β i)] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ i) (f₂ : Π (i : ι), β iβ₁ i) (hf : ∀ (i : ι), f i 0 = 0) (hf₂ : ∀ (i : ι), f₂ i 0 = 0) (h : ∀ (i : ι), (f i f₂ i) 0 = 0) (g : Π₀ (i : ι), β i) :
dfinsupp.map_range (λ (i : ι), f i f₂ i) h g = hf₂ g)
@[simp]
theorem dfinsupp.map_range_zero {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ i) (hf : ∀ (i : ι), f i 0 = 0) :
0 = 0
def dfinsupp.zip_with {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β i)] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ iβ i) (hf : ∀ (i : ι), f i 0 0 = 0) (g₁ : Π₀ (i : ι), β₁ i) (g₂ : Π₀ (i : ι), β₂ i) :
Π₀ (i : ι), β i

Let f i be a binary operation β₁ i → β₂ i → β i such that f i 0 0 = 0. Then zip_with f hf is a binary operation Π₀ i, β₁ i → Π₀ i, β₂ i → Π₀ i, β i.

Equations
@[simp]
theorem dfinsupp.zip_with_apply {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β i)] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] (f : Π (i : ι), β₁ iβ₂ iβ i) (hf : ∀ (i : ι), f i 0 0 = 0) (g₁ : Π₀ (i : ι), β₁ i) (g₂ : Π₀ (i : ι), β₂ i) (i : ι) :
hf g₁ g₂) i = f i (g₁ i) (g₂ i)
@[protected, instance]
def dfinsupp.has_add {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] :
has_add (Π₀ (i : ι), β i)
Equations
theorem dfinsupp.add_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] (g₁ g₂ : Π₀ (i : ι), β i) (i : ι) :
(g₁ + g₂) i = g₁ i + g₂ i
@[simp]
theorem dfinsupp.coe_add {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] (g₁ g₂ : Π₀ (i : ι), β i) :
(g₁ + g₂) = g₁ + g₂
@[protected, instance]
def dfinsupp.add_zero_class {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] :
add_zero_class (Π₀ (i : ι), β i)
Equations
@[protected, instance]
def dfinsupp.add_monoid {ι : Type u} {β : ι → Type v} [Π (i : ι), add_monoid (β i)] :
add_monoid (Π₀ (i : ι), β i)
Equations
def dfinsupp.coe_fn_add_monoid_hom {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] :
(Π₀ (i : ι), β i) →+ Π (i : ι), β i

Coercion from a dfinsupp to a pi type is an add_monoid_hom.

Equations
def dfinsupp.eval_add_monoid_hom {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] (i : ι) :
(Π₀ (i : ι), β i) →+ β i

Evaluation at a point is an add_monoid_hom. This is the finitely-supported version of add_monoid_hom.apply.

Equations
@[protected, instance]
def dfinsupp.is_add_monoid_hom {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] {i : ι} :
is_add_monoid_hom (λ (g : Π₀ (i : ι), β i), g i)
@[protected, instance]
def dfinsupp.has_neg {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] :
has_neg (Π₀ (i : ι), β i)
Equations
@[protected, instance]
def dfinsupp.add_comm_monoid {ι : Type u} {β : ι → Type v} [Π (i : ι), add_comm_monoid (β i)] :
add_comm_monoid (Π₀ (i : ι), β i)
Equations
@[simp]
theorem dfinsupp.coe_finset_sum {ι : Type u} {β : ι → Type v} {α : Type u_1} [Π (i : ι), add_comm_monoid (β i)] (s : finset α) (g : α → (Π₀ (i : ι), β i)) :
∑ (a : α) in s, g a = ∑ (a : α) in s, (g a)
@[simp]
theorem dfinsupp.finset_sum_apply {ι : Type u} {β : ι → Type v} {α : Type u_1} [Π (i : ι), add_comm_monoid (β i)] (s : finset α) (g : α → (Π₀ (i : ι), β i)) (i : ι) :
(∑ (a : α) in s, g a) i = ∑ (a : α) in s, (g a) i
theorem dfinsupp.neg_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] (g : Π₀ (i : ι), β i) (i : ι) :
(-g) i = -g i
@[simp]
theorem dfinsupp.coe_neg {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] (g : Π₀ (i : ι), β i) :
@[protected, instance]
def dfinsupp.add_group {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] :
add_group (Π₀ (i : ι), β i)
Equations
theorem dfinsupp.sub_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] (g₁ g₂ : Π₀ (i : ι), β i) (i : ι) :
(g₁ - g₂) i = g₁ i - g₂ i
@[simp]
theorem dfinsupp.coe_sub {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] (g₁ g₂ : Π₀ (i : ι), β i) :
(g₁ - g₂) = g₁ - g₂
@[protected, instance]
def dfinsupp.add_comm_group {ι : Type u} {β : ι → Type v} [Π (i : ι), add_comm_group (β i)] :
add_comm_group (Π₀ (i : ι), β i)
Equations
@[protected, instance]
def dfinsupp.has_scalar {ι : Type u} {β : ι → Type v} {γ : Type w} [monoid γ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] :
(Π₀ (i : ι), β i)

Dependent functions with finite support inherit a semiring action from an action on each coordinate.

Equations
theorem dfinsupp.smul_apply {ι : Type u} {β : ι → Type v} {γ : Type w} [monoid γ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] (b : γ) (v : Π₀ (i : ι), β i) (i : ι) :
(b v) i = b v i
@[simp]
theorem dfinsupp.coe_smul {ι : Type u} {β : ι → Type v} {γ : Type w} [monoid γ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] (b : γ) (v : Π₀ (i : ι), β i) :
(b v) = b v
@[protected, instance]
def dfinsupp.smul_comm_class {ι : Type u} {β : ι → Type v} {γ : Type w} {δ : Type u_1} [monoid γ] [monoid δ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] [Π (i : ι), (β i)] [∀ (i : ι), (β i)] :
(Π₀ (i : ι), β i)
@[protected, instance]
def dfinsupp.is_scalar_tower {ι : Type u} {β : ι → Type v} {γ : Type w} {δ : Type u_1} [monoid γ] [monoid δ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] [Π (i : ι), (β i)] [ δ] [∀ (i : ι), (β i)] :
(Π₀ (i : ι), β i)
@[protected, instance]
def dfinsupp.distrib_mul_action {ι : Type u} {β : ι → Type v} {γ : Type w} [monoid γ] [Π (i : ι), add_monoid (β i)] [Π (i : ι), (β i)] :
(Π₀ (i : ι), β i)

Dependent functions with finite support inherit a distrib_mul_action structure from such a structure on each coordinate.

Equations
@[protected, instance]
def dfinsupp.module {ι : Type u} {β : ι → Type v} {γ : Type w} [semiring γ] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι), (β i)] :
(Π₀ (i : ι), β i)

Dependent functions with finite support inherit a module structure from such a structure on each coordinate.

Equations
def dfinsupp.filter {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] (p : ι → Prop) (f : Π₀ (i : ι), β i) :
Π₀ (i : ι), β i

filter p f is the function which is f i if p i is true and 0 otherwise.

Equations
@[simp]
theorem dfinsupp.filter_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] (p : ι → Prop) (i : ι) (f : Π₀ (i : ι), β i) :
f) i = ite (p i) (f i) 0
theorem dfinsupp.filter_apply_pos {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] {p : ι → Prop} (f : Π₀ (i : ι), β i) {i : ι} (h : p i) :
f) i = f i
theorem dfinsupp.filter_apply_neg {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] {p : ι → Prop} (f : Π₀ (i : ι), β i) {i : ι} (h : ¬p i) :
f) i = 0
theorem dfinsupp.filter_pos_add_filter_neg {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] (f : Π₀ (i : ι), β i) (p : ι → Prop)  :
+ dfinsupp.filter (λ (i : ι), ¬p i) f = f
def dfinsupp.subtype_domain {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] (p : ι → Prop) (f : Π₀ (i : ι), β i) :
Π₀ (i : subtype p), β i

subtype_domain p f is the restriction of the finitely supported function f to the subtype p.

Equations
@[simp]
theorem dfinsupp.subtype_domain_zero {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] {p : ι → Prop}  :
@[simp]
theorem dfinsupp.subtype_domain_apply {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] {p : ι → Prop} {i : subtype p} {v : Π₀ (i : ι), β i} :
i = v i
@[simp]
theorem dfinsupp.subtype_domain_add {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] {p : ι → Prop} {v v' : Π₀ (i : ι), β i} :
(v + v') =
@[protected, instance]
def dfinsupp.subtype_domain.is_add_monoid_hom {ι : Type u} {β : ι → Type v} [Π (i : ι), add_zero_class (β i)] {p : ι → Prop}  :
@[simp]
theorem dfinsupp.subtype_domain_neg {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] {p : ι → Prop} {v : Π₀ (i : ι), β i} :
@[simp]
theorem dfinsupp.subtype_domain_sub {ι : Type u} {β : ι → Type v} [Π (i : ι), add_group (β i)] {p : ι → Prop} {v v' : Π₀ (i : ι), β i} :
(v - v') =
theorem dfinsupp.finite_support {ι : Type u} {β : ι → Type v} [Π (i : ι), has_zero (β i)] (f : Π₀ (i : ι), β i) :
{i : ι | f i 0}.finite
def dfinsupp.mk {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] (s : finset ι) (x : Π (i : s), β i) :
Π₀ (i : ι), β i

Create an element of Π₀ i, β i from a finset s and a function x defined on this finset.

Equations
@[simp]
theorem dfinsupp.mk_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {s : finset ι} {x : Π (i : s), β i} {i : ι} :
x) i = dite (i s) (λ (H : i s), x i, H⟩) (λ (H : i s), 0)
theorem dfinsupp.mk_injective {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] (s : finset ι) :
def dfinsupp.single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] (i : ι) (b : β i) :
Π₀ (i : ι), β i

The function single i b : Π₀ i, β i sends i to b and all other points to 0.

Equations
@[simp]
theorem dfinsupp.single_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i i' : ι} {b : β i} :
b) i' = dite (i = i') (λ (h : i = i'), h.rec_on b) (λ (h : ¬i = i'), 0)
@[simp]
theorem dfinsupp.single_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i : ι} :
= 0
@[simp]
theorem dfinsupp.single_eq_same {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i : ι} {b : β i} :
b) i = b
theorem dfinsupp.single_eq_of_ne {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i i' : ι} {b : β i} (h : i i') :
b) i' = 0
theorem dfinsupp.single_injective {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i : ι} :
theorem dfinsupp.single_eq_single_iff {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] (i j : ι) (xi : β i) (xj : β j) :
xi = xj i = j xi == xj xi = 0 xj = 0

Like finsupp.single_eq_single_iff, but with a heq due to dependent types

theorem dfinsupp.single_eq_of_sigma_eq {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i j : ι} {xi : β i} {xj : β j} (h : i, xi⟩ = j, xj⟩) :
xi = xj

Equality of sigma types is sufficient (but not necessary) to show equality of dfinsupps.

def dfinsupp.erase {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] (i : ι) (f : Π₀ (i : ι), β i) :
Π₀ (i : ι), β i

Redefine f i to be 0.

Equations
@[simp]
theorem dfinsupp.erase_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i j : ι} {f : Π₀ (i : ι), β i} :
f) j = ite (j = i) 0 (f j)
@[simp]
theorem dfinsupp.erase_same {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i : ι} {f : Π₀ (i : ι), β i} :
f) i = 0
theorem dfinsupp.erase_ne {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {i i' : ι} {f : Π₀ (i : ι), β i} (h : i' i) :
f) i' = f i'
@[simp]
theorem dfinsupp.single_add {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {i : ι} {b₁ b₂ : β i} :
(b₁ + b₂) = b₁ + b₂
@[simp]
theorem dfinsupp.single_add_hom_apply {ι : Type u} (β : ι → Type v) [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] (i : ι) (b : β i) :
b =
def dfinsupp.single_add_hom {ι : Type u} (β : ι → Type v) [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] (i : ι) :
β i →+ Π₀ (i : ι), β i

dfinsupp.single as an add_monoid_hom.

Equations
theorem dfinsupp.single_add_erase {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {i : ι} {f : Π₀ (i : ι), β i} :
(f i) + = f
theorem dfinsupp.erase_add_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {i : ι} {f : Π₀ (i : ι), β i} :
+ (f i) = f
@[protected]
theorem dfinsupp.induction {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {p : (Π₀ (i : ι), β i) → Prop} (f : Π₀ (i : ι), β i) (h0 : p 0) (ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), f i = 0b 0p fp b + f)) :
p f
theorem dfinsupp.induction₂ {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {p : (Π₀ (i : ι), β i) → Prop} (f : Π₀ (i : ι), β i) (h0 : p 0) (ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), f i = 0b 0p fp (f + b)) :
p f
@[simp]
theorem dfinsupp.add_closure_Union_range_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] :
add_submonoid.closure (⋃ (i : ι), =
theorem dfinsupp.add_hom_ext {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {γ : Type w} ⦃f g : (Π₀ (i : ι), β i) →+ γ⦄ (H : ∀ (i : ι) (y : β i), f y) = g y)) :
f = g

If two additive homomorphisms from Π₀ i, β i are equal on each single a b, then they are equal.

@[ext]
theorem dfinsupp.add_hom_ext' {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {γ : Type w} ⦃f g : (Π₀ (i : ι), β i) →+ γ⦄ (H : ∀ (x : ι), f.comp = g.comp ) :
f = g

If two additive homomorphisms from Π₀ i, β i are equal on each single a b, then they are equal.

@[simp]
theorem dfinsupp.mk_add {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] {s : finset ι} {x y : Π (i : s), β i} :
(x + y) = x + y
@[simp]
theorem dfinsupp.mk_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] {s : finset ι} :
0 = 0
@[simp]
theorem dfinsupp.mk_neg {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_group (β i)] {s : finset ι} {x : Π (i : s), β i.val} :
(-x) = - x
@[simp]
theorem dfinsupp.mk_sub {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_group (β i)] {s : finset ι} {x y : Π (i : s), β i.val} :
(x - y) = x - y
@[protected, instance]
def dfinsupp.mk.is_add_group_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_group (β i)] {s : finset ι} :
@[simp]
theorem dfinsupp.mk_smul {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] (γ : Type w) [semiring γ] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι), (β i)] {s : finset ι} {c : γ} (x : Π (i : s), β i.val) :
(c x) = c x
@[simp]
theorem dfinsupp.single_smul {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] (γ : Type w) [semiring γ] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι), (β i)] {i : ι} {c : γ} {x : β i} :
(c x) = c
def dfinsupp.support {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (f : Π₀ (i : ι), β i) :

Set {i | f x ≠ 0} as a finset.

Equations
@[simp]
theorem dfinsupp.support_mk_subset {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {s : finset ι} {x : Π (i : s), β i.val} :
x).support s
@[simp]
theorem dfinsupp.mem_support_to_fun {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (f : Π₀ (i : ι), β i) (i : ι) :
i f.support f i 0
theorem dfinsupp.eq_mk_support {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (f : Π₀ (i : ι), β i) :
f = (λ (i : (f.support)), f i)
@[simp]
theorem dfinsupp.support_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] :
theorem dfinsupp.mem_support_iff {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (f : Π₀ (i : ι), β i) (i : ι) :
i f.support f i 0
@[simp]
theorem dfinsupp.support_eq_empty {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} :
f = 0
@[protected, instance]
def dfinsupp.decidable_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] :
Equations
theorem dfinsupp.support_subset_iff {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {s : set ι} {f : Π₀ (i : ι), β i} :
(f.support) s ∀ (i : ι), i sf i = 0
theorem dfinsupp.support_single_ne_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {i : ι} {b : β i} (hb : b 0) :
b).support = {i}
theorem dfinsupp.support_single_subset {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {i : ι} {b : β i} :
b).support {i}
theorem dfinsupp.map_range_def {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [dec : decidable_eq ι] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] {f : Π (i : ι), β₁ iβ₂ i} {hf : ∀ (i : ι), f i 0 = 0} {g : Π₀ (i : ι), β₁ i} :
g = (λ (i : (g.support)), f i.val (g i.val))
@[simp]
theorem dfinsupp.map_range_single {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [dec : decidable_eq ι] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] {f : Π (i : ι), β₁ iβ₂ i} {hf : ∀ (i : ι), f i 0 = 0} {i : ι} {b : β₁ i} :
b) = (f i b)
theorem dfinsupp.support_map_range {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [dec : decidable_eq ι] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] [Π (i : ι) (x : β₂ i), decidable (x 0)] {f : Π (i : ι), β₁ iβ₂ i} {hf : ∀ (i : ι), f i 0 = 0} {g : Π₀ (i : ι), β₁ i} :
theorem dfinsupp.zip_with_def {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] [Π (i : ι) (x : β₂ i), decidable (x 0)] {f : Π (i : ι), β₁ iβ₂ iβ i} {hf : ∀ (i : ι), f i 0 0 = 0} {g₁ : Π₀ (i : ι), β₁ i} {g₂ : Π₀ (i : ι), β₂ i} :
g₁ g₂ = dfinsupp.mk (g₁.support g₂.support) (λ (i : (g₁.support g₂.support)), f i.val (g₁ i.val) (g₂ i.val))
theorem dfinsupp.support_zip_with {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] [Π (i : ι) (x : β₂ i), decidable (x 0)] {f : Π (i : ι), β₁ iβ₂ iβ i} {hf : ∀ (i : ι), f i 0 0 = 0} {g₁ : Π₀ (i : ι), β₁ i} {g₂ : Π₀ (i : ι), β₂ i} :
hf g₁ g₂).support g₁.support g₂.support
theorem dfinsupp.erase_def {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (i : ι) (f : Π₀ (i : ι), β i) :
= dfinsupp.mk (f.support.erase i) (λ (j : (f.support.erase i)), f j.val)
@[simp]
theorem dfinsupp.support_erase {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (i : ι) (f : Π₀ (i : ι), β i) :
theorem dfinsupp.filter_def {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {p : ι → Prop} (f : Π₀ (i : ι), β i) :
= (λ (i : f.support)), f i.val)
@[simp]
theorem dfinsupp.support_filter {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {p : ι → Prop} (f : Π₀ (i : ι), β i) :
f).support =
theorem dfinsupp.subtype_domain_def {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {p : ι → Prop} (f : Π₀ (i : ι), β i) :
= (λ (i : f.support)), f i)
@[simp]
theorem dfinsupp.support_subtype_domain {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {p : ι → Prop} {f : Π₀ (i : ι), β i} :
theorem dfinsupp.support_add {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_zero_class (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {g₁ g₂ : Π₀ (i : ι), β i} :
(g₁ + g₂).support g₁.support g₂.support
@[simp]
theorem dfinsupp.support_neg {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_group (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} :
theorem dfinsupp.support_smul {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [semiring γ] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι), (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (b : γ) (v : Π₀ (i : ι), β i) :
@[protected, instance]
def dfinsupp.decidable_eq {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), has_zero (β i)] [Π (i : ι), decidable_eq (β i)] :
decidable_eq (Π₀ (i : ι), β i)
Equations
def dfinsupp.sum {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i → γ) :
γ

sum f g is the sum of g i (f i) over the support of f.

Equations
def dfinsupp.prod {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i → γ) :
γ

prod f g is the product of g i (f i) over the support of f.

Equations
theorem dfinsupp.sum_map_range_index {ι : Type u} [dec : decidable_eq ι] {γ : Type w} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] [Π (i : ι) (x : β₂ i), decidable (x 0)] {f : Π (i : ι), β₁ iβ₂ i} {hf : ∀ (i : ι), f i 0 = 0} {g : Π₀ (i : ι), β₁ i} {h : Π (i : ι), β₂ i → γ} (h0 : ∀ (i : ι), h i 0 = 0) :
hf g).sum h = g.sum (λ (i : ι) (b : β₁ i), h i (f i b))
theorem dfinsupp.prod_map_range_index {ι : Type u} [dec : decidable_eq ι] {γ : Type w} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), has_zero (β₁ i)] [Π (i : ι), has_zero (β₂ i)] [Π (i : ι) (x : β₁ i), decidable (x 0)] [Π (i : ι) (x : β₂ i), decidable (x 0)] [comm_monoid γ] {f : Π (i : ι), β₁ iβ₂ i} {hf : ∀ (i : ι), f i 0 = 0} {g : Π₀ (i : ι), β₁ i} {h : Π (i : ι), β₂ i → γ} (h0 : ∀ (i : ι), h i 0 = 1) :
hf g).prod h = g.prod (λ (i : ι) (b : β₁ i), h i (f i b))
theorem dfinsupp.prod_zero_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {h : Π (i : ι), β i → γ} :
0.prod h = 1
theorem dfinsupp.sum_zero_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {h : Π (i : ι), β i → γ} :
0.sum h = 0
theorem dfinsupp.prod_single_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {i : ι} {b : β i} {h : Π (i : ι), β i → γ} (h_zero : h i 0 = 1) :
b).prod h = h i b
theorem dfinsupp.sum_single_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {i : ι} {b : β i} {h : Π (i : ι), β i → γ} (h_zero : h i 0 = 0) :
b).sum h = h i b
theorem dfinsupp.prod_neg_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_group (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {g : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} (h0 : ∀ (i : ι), h i 0 = 1) :
(-g).prod h = g.prod (λ (i : ι) (b : β i), h i (-b))
theorem dfinsupp.sum_neg_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_group (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {g : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} (h0 : ∀ (i : ι), h i 0 = 0) :
(-g).sum h = g.sum (λ (i : ι) (b : β i), h i (-b))
theorem dfinsupp.sum_comm {γ : Type w} {ι₁ : Type u_1} {ι₂ : Type u_2} {β₁ : ι₁ → Type u_3} {β₂ : ι₂ → Type u_4} [decidable_eq ι₁] [decidable_eq ι₂] [Π (i : ι₁), has_zero (β₁ i)] [Π (i : ι₂), has_zero (β₂ i)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι₂) (x : β₂ i), decidable (x 0)] (f₁ : Π₀ (i : ι₁), β₁ i) (f₂ : Π₀ (i : ι₂), β₂ i) (h : Π (i : ι₁), β₁ iΠ (i : ι₂), β₂ i → γ) :
f₁.sum (λ (i₁ : ι₁) (x₁ : β₁ i₁), f₂.sum (λ (i₂ : ι₂) (x₂ : β₂ i₂), h i₁ x₁ i₂ x₂)) = f₂.sum (λ (i₂ : ι₂) (x₂ : β₂ i₂), f₁.sum (λ (i₁ : ι₁) (x₁ : β₁ i₁), h i₁ x₁ i₂ x₂))
theorem dfinsupp.prod_comm {γ : Type w} {ι₁ : Type u_1} {ι₂ : Type u_2} {β₁ : ι₁ → Type u_3} {β₂ : ι₂ → Type u_4} [decidable_eq ι₁] [decidable_eq ι₂] [Π (i : ι₁), has_zero (β₁ i)] [Π (i : ι₂), has_zero (β₂ i)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι₂) (x : β₂ i), decidable (x 0)] [comm_monoid γ] (f₁ : Π₀ (i : ι₁), β₁ i) (f₂ : Π₀ (i : ι₂), β₂ i) (h : Π (i : ι₁), β₁ iΠ (i : ι₂), β₂ i → γ) :
f₁.prod (λ (i₁ : ι₁) (x₁ : β₁ i₁), f₂.prod (λ (i₂ : ι₂) (x₂ : β₂ i₂), h i₁ x₁ i₂ x₂)) = f₂.prod (λ (i₂ : ι₂) (x₂ : β₂ i₂), f₁.prod (λ (i₁ : ι₁) (x₁ : β₁ i₁), h i₁ x₁ i₂ x₂))
@[simp]
theorem dfinsupp.sum_apply {ι : Type u} {β : ι → Type v} {ι₁ : Type u₁} [decidable_eq ι₁] {β₁ : ι₁ → Type v₁} [Π (i₁ : ι₁), has_zero (β₁ i₁)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι), add_comm_monoid (β i)] {f : Π₀ (i₁ : ι₁), β₁ i₁} {g : Π (i₁ : ι₁), β₁ i₁(Π₀ (i : ι), β i)} {i₂ : ι} :
(f.sum g) i₂ = f.sum (λ (i₁ : ι₁) (b : β₁ i₁), (g i₁ b) i₂)
theorem dfinsupp.support_sum {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {ι₁ : Type u₁} [decidable_eq ι₁] {β₁ : ι₁ → Type v₁} [Π (i₁ : ι₁), has_zero (β₁ i₁)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i₁ : ι₁), β₁ i₁} {g : Π (i₁ : ι₁), β₁ i₁(Π₀ (i : ι), β i)} :
(f.sum g).support f.support.bUnion (λ (i : ι₁), (g i (f i)).support)
@[simp]
theorem dfinsupp.prod_one {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {f : Π₀ (i : ι), β i} :
f.prod (λ (i : ι) (b : β i), 1) = 1
@[simp]
theorem dfinsupp.sum_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} :
f.sum (λ (i : ι) (b : β i), 0) = 0
@[simp]
theorem dfinsupp.sum_add {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} {h₁ h₂ : Π (i : ι), β i → γ} :
f.sum (λ (i : ι) (b : β i), h₁ i b + h₂ i b) = f.sum h₁ + f.sum h₂
@[simp]
theorem dfinsupp.prod_mul {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {f : Π₀ (i : ι), β i} {h₁ h₂ : Π (i : ι), β i → γ} :
f.prod (λ (i : ι) (b : β i), (h₁ i b) * h₂ i b) = (f.prod h₁) * f.prod h₂
@[simp]
theorem dfinsupp.sum_neg {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} :
f.sum (λ (i : ι) (b : β i), -h i b) = -f.sum h
@[simp]
theorem dfinsupp.prod_inv {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_group γ] {f : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} :
f.prod (λ (i : ι) (b : β i), (h i b)⁻¹) = (f.prod h)⁻¹
theorem dfinsupp.sum_add_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f g : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 0) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ + h i b₂) :
(f + g).sum h = f.sum h + g.sum h
theorem dfinsupp.prod_add_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {f g : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 1) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = (h i b₁) * h i b₂) :
(f + g).prod h = (f.prod h) * g.prod h
def dfinsupp.sum_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (φ : Π (i : ι), β i →+ γ) :
(Π₀ (i : ι), β i) →+ γ

When summing over an add_monoid_hom, the decidability assumption is not needed, and the result is also an add_monoid_hom.

Equations
@[simp]
theorem dfinsupp.sum_add_hom_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (φ : Π (i : ι), β i →+ γ) (i : ι) (x : β i) :
x) = (φ i) x
@[simp]
theorem dfinsupp.sum_add_hom_comp_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (f : Π (i : ι), β i →+ γ) (i : ι) :
= f i
theorem dfinsupp.sum_add_hom_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (φ : Π (i : ι), β i →+ γ) (f : Π₀ (i : ι), β i) :
= f.sum (λ (x : ι), (φ x))

While we didn't need decidable instances to define it, we do to reduce it to a sum

theorem dfinsupp.sum_add_hom_comm {ι₁ : Type u_1} {ι₂ : Type u_2} {β₁ : ι₁ → Type u_3} {β₂ : ι₂ → Type u_4} {γ : Type u_5} [decidable_eq ι₁] [decidable_eq ι₂] [Π (i : ι₁), add_zero_class (β₁ i)] [Π (i : ι₂), add_zero_class (β₂ i)] (f₁ : Π₀ (i : ι₁), β₁ i) (f₂ : Π₀ (i : ι₂), β₂ i) (h : Π (i : ι₁) (j : ι₂), β₁ i →+ β₂ j →+ γ) :
(dfinsupp.sum_add_hom (λ (i₂ : ι₂), (dfinsupp.sum_add_hom (λ (i₁ : ι₁), h i₁ i₂)) f₁)) f₂ = (dfinsupp.sum_add_hom (λ (i₁ : ι₁), (dfinsupp.sum_add_hom (λ (i₂ : ι₂), (h i₁ i₂).flip)) f₂)) f₁
@[simp]
theorem dfinsupp.lift_add_hom_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (φ : Π (i : ι), (λ (i : ι), β i) i →+ γ) :
@[simp]
theorem dfinsupp.lift_add_hom_symm_apply {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (F : (Π₀ (i : ι), β i) →+ γ) (i : ι) :
= F.comp
def dfinsupp.lift_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)]  :
(Π (i : ι), β i →+ γ) ≃+ ((Π₀ (i : ι), β i) →+ γ)

The dfinsupp version of finsupp.lift_add_hom,

Equations
@[simp]
theorem dfinsupp.lift_add_hom_single_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_comm_monoid (β i)] :
= add_monoid_hom.id (Π₀ (i : ι), β i)

The dfinsupp version of finsupp.lift_add_hom_single_add_hom,

theorem dfinsupp.lift_add_hom_apply_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (f : Π (i : ι), β i →+ γ) (i : ι) (x : β i) :
x) = (f i) x

The dfinsupp version of finsupp.lift_add_hom_apply_single,

theorem dfinsupp.lift_add_hom_comp_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (f : Π (i : ι), β i →+ γ) (i : ι) :
= f i

The dfinsupp version of finsupp.lift_add_hom_comp_single,

theorem dfinsupp.comp_lift_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {δ : Type u_1} [Π (i : ι), add_zero_class (β i)] (g : γ →+ δ) (f : Π (i : ι), β i →+ γ) :
= dfinsupp.lift_add_hom (λ (a : ι), g.comp (f a))

The dfinsupp version of finsupp.comp_lift_add_hom,

@[simp]
theorem dfinsupp.sum_add_hom_zero {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)]  :
dfinsupp.sum_add_hom (λ (i : ι), 0) = 0
@[simp]
theorem dfinsupp.sum_add_hom_add {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_zero_class (β i)] (g h : Π (i : ι), β i →+ γ) :
dfinsupp.sum_add_hom (λ (i : ι), g i + h i) =
@[simp]
theorem dfinsupp.sum_add_hom_single_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_comm_monoid (β i)] :
= add_monoid_hom.id (Π₀ (i : ι), β i)
theorem dfinsupp.comp_sum_add_hom {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {δ : Type u_1} [Π (i : ι), add_zero_class (β i)] (g : γ →+ δ) (f : Π (i : ι), β i →+ γ) :
g.comp = dfinsupp.sum_add_hom (λ (a : ι), g.comp (f a))
theorem dfinsupp.sum_sub_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), add_group (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f g : Π₀ (i : ι), β i} {h : Π (i : ι), β i → γ} (h_sub : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ - b₂) = h i b₁ - h i b₂) :
(f - g).sum h = f.sum h - g.sum h
theorem dfinsupp.prod_finset_sum_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {α : Type x} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {s : finset α} {g : α → (Π₀ (i : ι), β i)} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 1) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = (h i b₁) * h i b₂) :
∏ (i : α) in s, (g i).prod h = (∑ (i : α) in s, g i).prod h
theorem dfinsupp.sum_finset_sum_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {α : Type x} [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {s : finset α} {g : α → (Π₀ (i : ι), β i)} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 0) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ + h i b₂) :
∑ (i : α) in s, (g i).sum h = (∑ (i : α) in s, g i).sum h
theorem dfinsupp.sum_sum_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {ι₁ : Type u₁} [decidable_eq ι₁] {β₁ : ι₁ → Type v₁} [Π (i₁ : ι₁), has_zero (β₁ i₁)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i₁ : ι₁), β₁ i₁} {g : Π (i₁ : ι₁), β₁ i₁(Π₀ (i : ι), β i)} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 0) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ + h i b₂) :
(f.sum g).sum h = f.sum (λ (i : ι₁) (b : β₁ i), (g i b).sum h)
theorem dfinsupp.prod_sum_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} {ι₁ : Type u₁} [decidable_eq ι₁] {β₁ : ι₁ → Type v₁} [Π (i₁ : ι₁), has_zero (β₁ i₁)] [Π (i : ι₁) (x : β₁ i), decidable (x 0)] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {f : Π₀ (i₁ : ι₁), β₁ i₁} {g : Π (i₁ : ι₁), β₁ i₁(Π₀ (i : ι), β i)} {h : Π (i : ι), β i → γ} (h_zero : ∀ (i : ι), h i 0 = 1) (h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = (h i b₁) * h i b₂) :
(f.sum g).prod h = f.prod (λ (i : ι₁) (b : β₁ i), (g i b).prod h)
@[simp]
theorem dfinsupp.sum_single {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] [Π (i : ι), add_comm_monoid (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {f : Π₀ (i : ι), β i} :
theorem dfinsupp.sum_subtype_domain_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] {v : Π₀ (i : ι), β i} {p : ι → Prop} {h : Π (i : ι), β i → γ} (hp : ∀ (x : ι), x v.supportp x) :
.sum (λ (i : subtype p) (b : β i), h i b) = v.sum h
theorem dfinsupp.prod_subtype_domain_index {ι : Type u} {β : ι → Type v} [dec : decidable_eq ι] {γ : Type w} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid γ] {v : Π₀ (i : ι), β i} {p : ι → Prop} {h : Π (i : ι), β i → γ} (hp : ∀ (x : ι), x v.supportp x) :
.prod (λ (i : subtype p) (b : β i), h i b) = v.prod h
theorem dfinsupp.subtype_domain_sum {ι : Type u} {β : ι → Type v} {γ : Type w} [Π (i : ι), add_comm_monoid (β i)] {s : finset γ} {h : γ → (Π₀ (i : ι), β i)} {p : ι → Prop}  :
(∑ (c : γ) in s, h c) = ∑ (c : γ) in s, (h c)
theorem dfinsupp.subtype_domain_finsupp_sum {ι : Type u} {β : ι → Type v} {γ : Type w} {δ : γ → Type x} [decidable_eq γ] [Π (c : γ), has_zero (δ c)] [Π (c : γ) (x : δ c), decidable (x 0)] [Π (i : ι), add_comm_monoid (β i)] {p : ι → Prop} {s : Π₀ (c : γ), δ c} {h : Π (c : γ), δ c(Π₀ (i : ι), β i)} :
(s.sum h) = s.sum (λ (c : γ) (d : δ c), (h c d))

### Bundled versions of dfinsupp.map_range#

The names should match the equivalent bundled finsupp.map_range definitions.

theorem dfinsupp.map_range_add {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (f : Π (i : ι), β₁ iβ₂ i) (hf : ∀ (i : ι), f i 0 = 0) (hf' : ∀ (i : ι) (x y : β₁ i), f i (x + y) = f i x + f i y) (g₁ g₂ : Π₀ (i : ι), β₁ i) :
(g₁ + g₂) = g₁ + g₂
@[simp]
theorem dfinsupp.map_range.add_monoid_hom_apply {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (f : Π (i : ι), β₁ i →+ β₂ i) (g : Π₀ (i : ι), (λ (i : ι), β₁ i) i) :
= dfinsupp.map_range (λ (i : ι) (x : β₁ i), (f i) x) _ g
def dfinsupp.map_range.add_monoid_hom {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (f : Π (i : ι), β₁ i →+ β₂ i) :
(Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i

dfinsupp.map_range as an add_monoid_hom.

Equations
@[simp]
theorem dfinsupp.map_range.add_monoid_hom_id {ι : Type u} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₂ i)] :
theorem dfinsupp.map_range.add_monoid_hom_comp {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β i)] [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (f : Π (i : ι), β₁ i →+ β₂ i) (f₂ : Π (i : ι), β i →+ β₁ i) :
dfinsupp.map_range.add_monoid_hom (λ (i : ι), (f i).comp (f₂ i)) =
def dfinsupp.map_range.add_equiv {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (e : Π (i : ι), β₁ i ≃+ β₂ i) :
(Π₀ (i : ι), β₁ i) ≃+ Π₀ (i : ι), β₂ i

dfinsupp.map_range.add_monoid_hom as an add_equiv.

Equations
@[simp]
theorem dfinsupp.map_range.add_equiv_apply {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (e : Π (i : ι), β₁ i ≃+ β₂ i) (g : Π₀ (i : ι), (λ (i : ι), β₁ i) i) :
= dfinsupp.map_range (λ (i : ι) (x : β₁ i), (e i) x) _ g
@[simp]
theorem dfinsupp.map_range.add_equiv_refl {ι : Type u} {β₁ : ι → Type v₁} [Π (i : ι), add_zero_class (β₁ i)] :
theorem dfinsupp.map_range.add_equiv_trans {ι : Type u} {β : ι → Type v} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β i)] [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (f : Π (i : ι), β i ≃+ β₁ i) (f₂ : Π (i : ι), β₁ i ≃+ β₂ i) :
dfinsupp.map_range.add_equiv (λ (i : ι), (f i).trans (f₂ i)) =
@[simp]
theorem dfinsupp.map_range.add_equiv_symm {ι : Type u} {β₁ : ι → Type v₁} {β₂ : ι → Type v₂} [Π (i : ι), add_zero_class (β₁ i)] [Π (i : ι), add_zero_class (β₂ i)] (e : Π (i : ι), β₁ i ≃+ β₂ i) :
= dfinsupp.map_range.add_equiv (λ (i : ι), (e i).symm)

### Product and sum lemmas for bundled morphisms #

@[simp]
theorem add_monoid_hom.map_dfinsupp_sum {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] (h : R →+ S) (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i → R) :
h (f.sum g) = f.sum (λ (a : ι) (b : β a), h (g a b))
@[simp]
theorem monoid_hom.map_dfinsupp_prod {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [comm_monoid R] [comm_monoid S] (h : R →* S) (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i → R) :
h (f.prod g) = f.prod (λ (a : ι) (b : β a), h (g a b))
theorem add_monoid_hom.coe_dfinsupp_sum {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [add_monoid R] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β iR →+ S) :
(f.sum g) = f.sum (λ (a : ι) (b : β a), (g a b))
theorem monoid_hom.coe_dfinsupp_prod {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [monoid R] [comm_monoid S] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β iR →* S) :
(f.prod g) = f.prod (λ (a : ι) (b : β a), (g a b))
@[simp]
theorem monoid_hom.dfinsupp_prod_apply {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [monoid R] [comm_monoid S] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β iR →* S) (r : R) :
(f.prod g) r = f.prod (λ (a : ι) (b : β a), (g a b) r)
@[simp]
theorem add_monoid_hom.dfinsupp_sum_apply {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), has_zero (β i)] [Π (i : ι) (x : β i), decidable (x 0)] [add_monoid R] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β iR →+ S) (r : R) :
(f.sum g) r = f.sum (λ (a : ι) (b : β a), (g a b) r)

The above lemmas, repeated for dfinsupp.sum_add_hom.

@[simp]
theorem add_monoid_hom.map_dfinsupp_sum_add_hom {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), add_comm_monoid (β i)] (h : R →+ S) (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i →+ R) :
h f) = (dfinsupp.sum_add_hom (λ (i : ι), h.comp (g i))) f
@[simp]
theorem add_monoid_hom.dfinsupp_sum_add_hom_apply {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), add_comm_monoid (β i)] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i →+ R →+ S) (r : R) :
f) r = (dfinsupp.sum_add_hom (λ (i : ι), (g i))) f
theorem add_monoid_hom.coe_dfinsupp_sum_add_hom {ι : Type u} {β : ι → Type v} [decidable_eq ι] {R : Type u_1} {S : Type u_2} [Π (i : ι), add_comm_monoid (β i)] (f : Π₀ (i : ι), β i) (g : Π (i : ι), β i →+ R →+ S) :
f) = (dfinsupp.sum_add_hom (λ (i : ι), .comp (g i))) f