Type of functions with finite support #
For any type α and any type M with zero, we define the type Finsupp α M (notation: α →₀ M)
of finitely supported functions from α to M, i.e. the functions which are zero everywhere
on α except on a finite set.
Functions with finite support are used (at least) in the following parts of the library:
- MonoidAlgebra R Mand- AddMonoidAlgebra R Mare defined as- M →₀ R;
- polynomials and multivariate polynomials are defined as - AddMonoidAlgebras, hence they use- Finsuppunder the hood;
- the linear combination of a family of vectors - v iwith coefficients- f i(as used, e.g., to define linearly independent family- LinearIndependent) is defined as a map- Finsupp.linearCombination : (ι → M) → (ι →₀ R) →ₗ[R] M.
Some other constructions are naturally equivalent to α →₀ M with some α and M but are defined
in a different way in the library:
- Multiset α ≃+ α →₀ ℕ;
- FreeAbelianGroup α ≃+ α →₀ ℤ.
Most of the theory assumes that the range is a commutative additive monoid. This gives us the big
sum operator as a powerful way to construct Finsupp elements, which is defined in
Mathlib/Algebra/BigOperators/Finsupp/Basic.lean.
Many constructions based on α →₀ M are defs rather than abbrevs to avoid reusing unwanted type
class instances. E.g., MonoidAlgebra, AddMonoidAlgebra, and types based on these two have
non-pointwise multiplication.
Main declarations #
- Finsupp: The type of finitely supported functions from- αto- β.
- Finsupp.onFinset: The restriction of a function to a- Finsetas a- Finsupp.
- Finsupp.mapRange: Composition of a- ZeroHomwith a- Finsupp.
- Finsupp.embDomain: Maps the domain of a- Finsuppby an embedding.
- Finsupp.zipWith: Postcomposition of two- Finsupps with a function- fsuch that- f 0 0 = 0.
Notation #
This file adds α →₀ M as a global notation for Finsupp α M.
We also use the following convention for Type* variables in this file
- α,- β,- γ: types with no additional structure that appear as the first argument to- Finsuppsomewhere in the statement;
- ι: an auxiliary index type;
- M,- M',- N,- P: types with- Zeroor- (Add)(Comm)Monoidstructure;- Mis also used for a (semi)module over a (semi)ring.
- G,- H: groups (commutative or not, multiplicative or additive);
- R,- S: (semi)rings.
Implementation notes #
This file is a noncomputable theory and uses classical logic throughout.
TODO #
- Expand the list of definitions and important lemmas to the module docstring.
Finsupp α M, denoted α →₀ M, is the type of functions f : α → M such that
f x = 0 for all but finitely many x.
- support : Finset αThe support of a finitely supported function (aka Finsupp).
- toFun : α → MThe underlying function of a bundled finitely supported function (aka Finsupp).
- The witness that the support of a - Finsuppis indeed the exact locus where its underlying function is nonzero.
Instances For
Finsupp α M, denoted α →₀ M, is the type of functions f : α → M such that
f x = 0 for all but finitely many x.
Equations
- «term_→₀_» = Lean.ParserDescr.trailingNode `«term_→₀_» 25 26 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " →₀ ") (Lean.ParserDescr.cat `term 25))
Instances For
Equations
- Finsupp.instFunLike = { coe := Finsupp.toFun, coe_injective' := ⋯ }
Alias of Finsupp.notMem_support_iff.
Equations
- f.instDecidableEq g = decidable_of_iff (f.support = g.support ∧ ∀ a ∈ f.support, f a = g a) ⋯
Given Finite α, equivFunOnFinite is the Equiv between α →₀ β and α → β.
(All functions on a finite type are finitely supported.)
Equations
- Finsupp.equivFunOnFinite = { toFun := DFunLike.coe, invFun := fun (f : α → M) => { support := ⋯.toFinset, toFun := f, mem_support_toFun := ⋯ }, left_inv := ⋯, right_inv := ⋯ }
Instances For
If α has a unique term, the type of finitely supported functions α →₀ β is equivalent to β.
Equations
Instances For
Finsupp.onFinset s f hf is the finsupp function representing f restricted to the finset s.
The function must be 0 outside of s. Use this when the set needs to be filtered anyways,
otherwise a better set representation is often available.
Equations
- Finsupp.onFinset s f hf = { support := Finsupp.onFinset_support✝ s f, toFun := f, mem_support_toFun := ⋯ }
Instances For
The natural Finsupp induced by the function f given that it has finite support.
Equations
- Finsupp.ofSupportFinite f hf = { support := hf.toFinset, toFun := f, mem_support_toFun := ⋯ }
Instances For
The composition of f : M → N and g : α →₀ M is mapRange f hf g : α →₀ N,
which is well-defined when f 0 = 0.
This preserves the structure on f, and exists in various bundled forms for when f is itself
bundled (defined in Mathlib/Data/Finsupp/Basic.lean):
- Finsupp.mapRange.equiv
- Finsupp.mapRange.zeroHom
- Finsupp.mapRange.addMonoidHom
- Finsupp.mapRange.addEquiv
- Finsupp.mapRange.linearMap
- Finsupp.mapRange.linearEquiv
Equations
- Finsupp.mapRange f hf g = Finsupp.onFinset g.support (f ∘ ⇑g) ⋯
Instances For
Finsupp.mapRange of a injective function is injective.
Finsupp.mapRange of a surjective function is surjective.
Given f : α ↪ β and v : α →₀ M, Finsupp.embDomain f v : β →₀ M
is the finitely supported function whose value at f a : β is v a.
For a b : β outside the range of f, it is zero.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given finitely supported functions g₁ : α →₀ M and g₂ : α →₀ N and function f : M → N → P,
Finsupp.zipWith f hf g₁ g₂ is the finitely supported function α →₀ P satisfying
zipWith f hf g₁ g₂ a = f (g₁ a) (g₂ a), which is well-defined when f 0 0 = 0.
Equations
- Finsupp.zipWith f hf g₁ g₂ = Finsupp.onFinset (g₁.support ∪ g₂.support) (fun (a : α) => f (g₁ a) (g₂ a)) ⋯