Pointwise operations of finsets #
This file defines pointwise algebraic operations on finsets.
Main declarations #
For finsets s and t:
0(Finset.zero): The singleton{0}.1(Finset.one): The singleton{1}.-s(Finset.neg): Negation, finset of all-xwherex ∈ s.s⁻¹(Finset.inv): Inversion, finset of allx⁻¹wherex ∈ s.s + t(Finset.add): Addition, finset of allx + ywherex ∈ sandy ∈ t.s * t(Finset.mul): Multiplication, finset of allx * ywherex ∈ sandy ∈ t.s - t(Finset.sub): Subtraction, finset of allx - ywherex ∈ sandy ∈ t.s / t(Finset.div): Division, finset of allx / ywherex ∈ sandy ∈ t.s +ᵥ t(Finset.vadd): Scalar addition, finset of allx +ᵥ ywherex ∈ sandy ∈ t.s • t(Finset.smul): Scalar multiplication, finset of allx • ywherex ∈ sandy ∈ t.s -ᵥ t(Finset.vsub): Scalar subtraction, finset of allx -ᵥ ywherex ∈ sandy ∈ t.a • s(Finset.smulFinset): Scaling, finset of alla • xwherex ∈ s.a +ᵥ s(Finset.vaddFinset): Translation, finset of alla +ᵥ xwherex ∈ s.
For α a semigroup/monoid, Finset α is a semigroup/monoid.
As an unfortunate side effect, this means that n • s, where n : ℕ, is ambiguous between
pointwise scaling and repeated pointwise addition; the former has (2 : ℕ) • {1, 2} = {2, 4}, while
the latter has (2 : ℕ) • {1, 2} = {2, 3, 4}. See note [pointwise nat action].
Implementation notes #
We put all instances in the locale Pointwise, so that these instances are not available by
default. Note that we do not mark them as reducible (as argued by note [reducible non-instances])
since we expect the locale to be open whenever the instances are actually used (and making the
instances reducible changes the behavior of simp.
Tags #
finset multiplication, finset addition, pointwise addition, pointwise multiplication, pointwise subtraction
0/1 as finsets #
Lift a ZeroHom to Finset via image
Equations
- Finset.imageZeroHom f = { toFun := Finset.image ↑f, map_zero' := (_ : Finset.image (↑f) 0 = 0) }
Instances For
Lift a OneHom to Finset via image.
Equations
- Finset.imageOneHom f = { toFun := Finset.image ↑f, map_one' := (_ : Finset.image (↑f) 1 = 1) }
Instances For
Finset negation/inversion #
The pointwise negation of finset -s is defined as {-x | x ∈ s} in locale Pointwise.
Equations
- Finset.neg = { neg := Finset.image Neg.neg }
Instances For
The pointwise inversion of finset s⁻¹ is defined as {x⁻¹ | x ∈ s} in locale Pointwise.
Equations
- Finset.inv = { inv := Finset.image Inv.inv }
Instances For
Alias of the reverse direction of Finset.inv_nonempty_iff.
Alias of the forward direction of Finset.inv_nonempty_iff.
Finset addition/multiplication #
The pointwise addition of finsets s + t is defined as {x + y | x ∈ s, y ∈ t} in
locale Pointwise.
Equations
- Finset.add = { add := Finset.image₂ fun x x_1 => x + x_1 }
Instances For
The pointwise multiplication of finsets s * t and t is defined as {x * y | x ∈ s, y ∈ t}
in locale Pointwise.
Equations
- Finset.mul = { mul := Finset.image₂ fun x x_1 => x * x_1 }
Instances For
Lift an AddHom to Finset via image
Equations
- Finset.imageAddHom f = { toFun := Finset.image ↑f, map_add' := (_ : ∀ (x x_1 : Finset α), Finset.image (↑f) (x + x_1) = Finset.image (↑f) x + Finset.image (↑f) x_1) }
Instances For
Lift a MulHom to Finset via image.
Equations
- Finset.imageMulHom f = { toFun := Finset.image ↑f, map_mul' := (_ : ∀ (x x_1 : Finset α), Finset.image (↑f) (x * x_1) = Finset.image (↑f) x * Finset.image (↑f) x_1) }
Instances For
Finset subtraction/division #
The pointwise subtraction of finsets s - t is defined as {x - y | x ∈ s, y ∈ t}
in locale Pointwise.
Equations
- Finset.sub = { sub := Finset.image₂ fun x x_1 => x - x_1 }
Instances For
The pointwise division of finsets s / t is defined as {x / y | x ∈ s, y ∈ t} in locale
Pointwise.
Equations
- Finset.div = { div := Finset.image₂ fun x x_1 => x / x_1 }
Instances For
Instances #
Repeated pointwise multiplication/division (not the same as pointwise repeated
multiplication/division!) of a Finset. See note [pointwise nat action].
Instances For
Finset α is an AddSemigroup under pointwise operations if α is.
Equations
- Finset.addSemigroup = Function.Injective.addSemigroup Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (s t : Finset α), ↑(s + t) = ↑s + ↑t)
Instances For
Finset α is a Semigroup under pointwise operations if α is.
Equations
- Finset.semigroup = Function.Injective.semigroup Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (s t : Finset α), ↑(s * t) = ↑s * ↑t)
Instances For
Finset α is an AddCommSemigroup under pointwise operations if α is.
Equations
- Finset.addCommSemigroup = Function.Injective.addCommSemigroup Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (s t : Finset α), ↑(s + t) = ↑s + ↑t)
Instances For
Finset α is a CommSemigroup under pointwise operations if α is.
Equations
- Finset.commSemigroup = Function.Injective.commSemigroup Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (s t : Finset α), ↑(s * t) = ↑s * ↑t)
Instances For
Finset α is an AddZeroClass under pointwise operations if α is.
Equations
- Finset.addZeroClass = Function.Injective.addZeroClass Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ↑{0} = {0}) (_ : ∀ (s t : Finset α), ↑(s + t) = ↑s + ↑t)
Instances For
Finset α is a MulOneClass under pointwise operations if α is.
Equations
- Finset.mulOneClass = Function.Injective.mulOneClass Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ↑{1} = {1}) (_ : ∀ (s t : Finset α), ↑(s * t) = ↑s * ↑t)
Instances For
The singleton operation as an AddMonoidHom.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The singleton operation as a MonoidHom.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The coercion from Finset to set as an AddMonoidHom.
Equations
Instances For
The coercion from Finset to Set as a MonoidHom.
Equations
Instances For
Lift an add_monoid_hom to Finset via image
Equations
- One or more equations did not get rendered due to their size.
Instances For
Lift a MonoidHom to Finset via image.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Finset.nsmul_mem_nsmul.match_1 motive x h_1 h_2 = Nat.casesOn x (h_1 ()) fun n => h_2 n
Instances For
Finset α is an AddCommMonoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Finset α is a CommMonoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Finset.coe_zsmul.match_1 motive x h_1 h_2 = Int.casesOn x (fun a => h_1 a) fun a => h_2 a
Instances For
Finset α is a subtraction monoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Finset α is a division monoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Finset α is a commutative subtraction monoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Finset α is a commutative division monoid under pointwise operations if α is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Finset α has distributive negation if α has.
Equations
Instances For
Note that Finset α is not a Distrib because s * t + s * u has cross terms that s * (t + u)
lacks.
-- {10, 16, 18, 20, 8, 9}
#eval {1, 2} * ({3, 4} + {5, 6} : Finset ℕ)
-- {10, 11, 12, 13, 14, 15, 16, 18, 20, 8, 9}
#eval ({1, 2} : Finset ℕ) * {3, 4} + {1, 2} * {5, 6}
Note that Finset is not a MulZeroClass because 0 * ∅ ≠ 0.
Equations
- Finset.Nonempty.zero_mem_sub.match_1 motive h h_1 = Exists.casesOn h fun w h => h_1 w h
Instances For
Scalar addition/multiplication of finsets #
The pointwise sum of two finsets s and t: s +ᵥ t = {x +ᵥ y | x ∈ s, y ∈ t}.
Equations
- Finset.vadd = { vadd := Finset.image₂ fun x x_1 => x +ᵥ x_1 }
Instances For
The pointwise product of two finsets s and t: s • t = {x • y | x ∈ s, y ∈ t}.
Equations
- Finset.smul = { smul := Finset.image₂ fun x x_1 => x • x_1 }
Instances For
If a finset u is contained in the scalar sum of two sets s +ᵥ t, we can find two
finsets s', t' such that s' ⊆ s, t' ⊆ t and u ⊆ s' +ᵥ t'.
If a finset u is contained in the scalar product of two sets s • t, we can find two finsets
s', t' such that s' ⊆ s, t' ⊆ t and u ⊆ s' • t'.
Scalar subtraction of finsets #
The pointwise product of two finsets s and t: s -ᵥ t = {x -ᵥ y | x ∈ s, y ∈ t}.
Equations
- Finset.vsub = { vsub := Finset.image₂ fun x x_1 => x -ᵥ x_1 }
Instances For
If a finset u is contained in the pointwise subtraction of two sets s -ᵥ t, we can find two
finsets s', t' such that s' ⊆ s, t' ⊆ t and u ⊆ s' -ᵥ t'.
Translation/scaling of finsets #
The translation of a finset s by a vector a: a +ᵥ s = {a +ᵥ x | x ∈ s}.
Equations
- Finset.vaddFinset = { vadd := fun a => Finset.image ((fun x x_1 => x +ᵥ x_1) a) }
Instances For
The scaling of a finset s by a scalar a: a • s = {a • x | x ∈ s}.
Equations
- Finset.smulFinset = { smul := fun a => Finset.image ((fun x x_1 => x • x_1) a) }
Instances For
An additive action of an additive monoid α on a type β gives an additive action
of Finset α on Finset β
Equations
- One or more equations did not get rendered due to their size.
Instances For
A multiplicative action of a monoid α on a type β gives a multiplicative action of
Finset α on Finset β.
Equations
- One or more equations did not get rendered due to their size.
Instances For
An additive action of an additive monoid on a type β gives an additive action
on Finset β.
Equations
- Finset.addActionFinset = Function.Injective.addAction Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (a : α) (s : Finset β), ↑(a +ᵥ s) = a +ᵥ ↑s)
Instances For
A multiplicative action of a monoid on a type β gives a multiplicative action on Finset β.
Equations
- Finset.mulActionFinset = Function.Injective.mulAction Finset.toSet (_ : Function.Injective Finset.toSet) (_ : ∀ (a : α) (s : Finset β), ↑(a • s) = a • ↑s)
Instances For
A distributive multiplicative action of a monoid on an additive monoid β gives a distributive
multiplicative action on Finset β.
Equations
- Finset.distribMulActionFinset = Function.Injective.distribMulAction Finset.coeAddMonoidHom (_ : Function.Injective Finset.toSet) (_ : ∀ (a : α) (s : Finset β), ↑(a • s) = a • ↑s)
Instances For
A multiplicative action of a monoid on a monoid β gives a multiplicative action on Set β.
Equations
- Finset.mulDistribMulActionFinset = Function.Injective.mulDistribMulAction Finset.coeMonoidHom (_ : Function.Injective Finset.toSet) (_ : ∀ (a : α) (s : Finset β), ↑(a • s) = a • ↑s)
Instances For
If the left cosets of t by elements of s are disjoint (but not necessarily
distinct!), then the size of t divides the size of s +ᵥ t.
If the left cosets of t by elements of s are disjoint (but not necessarily distinct!), then
the size of t divides the size of s • t.
If the right cosets of s by elements of t are disjoint (but not necessarily
distinct!), then the size of s divides the size of s + t.
If the right cosets of s by elements of t are disjoint (but not necessarily distinct!), then
the size of s divides the size of s * t.
If the left cosets of t by elements of s are disjoint (but not necessarily
distinct!), then the size of t divides the size of s + t.
If the left cosets of t by elements of s are disjoint (but not necessarily distinct!), then
the size of t divides the size of s * t.
Note that we have neither SMulWithZero α (Finset β) nor SMulWithZero (Finset α) (Finset β)
because 0 * ∅ ≠ 0.
A nonempty set is scaled by zero to the singleton set containing 0.