Antidiagonal with values in general types #
We define a type class Finset.HasAntidiagonal A
which contains a function
antidiagonal : A → Finset (A × A)
such that antidiagonal n
is the finset of all pairs adding to n
, as witnessed by mem_antidiagonal
.
When A
is a canonically ordered add monoid with locally finite order
this typeclass can be instantiated with Finset.antidiagonalOfLocallyFinite
.
This applies in particular when A
is ℕ
, more generally or σ →₀ ℕ
,
or even ι →₀ A
under the additional assumption OrderedSub A
that make it a canonically ordered add monoid.
(In fact, we would just need an AddMonoid
with a compatible order,
finite Iic
, such that if a + b = n
, then a, b ≤ n
,
and any finiteness condition would be OK.)
For computational reasons it is better to manually provide instances for ℕ
and σ →₀ ℕ
, to avoid quadratic runtime performance.
These instances are provided as Finset.Nat.instHasAntidiagonal
and Finsupp.instHasAntidiagonal
.
This is why Finset.antidiagonalOfLocallyFinite
is an abbrev
and not an instance
.
This definition does not exactly match with that of Multiset.antidiagonal
defined in Mathlib.Data.Multiset.Antidiagonal
, because of the multiplicities.
Indeed, by counting multiplicities, Multiset α
is equivalent to α →₀ ℕ
,
but Finset.antidiagonal
and Multiset.antidiagonal
will return different objects.
For example, for s : Multiset ℕ := {0,0,0}
, Multiset.antidiagonal s
has 8 elements
but Finset.antidiagonal s
has only 4.
def s : Multiset ℕ := {0, 0, 0}
#eval (Finset.antidiagonal s).card -- 4
#eval Multiset.card (Multiset.antidiagonal s) -- 8
TODO #
- Define
HasMulAntidiagonal
(for monoids). ForPNat
, we will recover the set of divisors of a strictly positive integer.
The class of additive monoids with an antidiagonal
The antidiagonal of an element
n
is the finset of pairs(i, j)
such thati + j = n
.A pair belongs to
antidiagonal n
iff the sum of its components is equal ton
.
Instances
All HasAntidiagonal
instances are equal
See also Finset.map_prodComm_antidiagonal
.
A point in the antidiagonal is determined by its first coordinate.
See also Finset.antidiagonal_congr'
.
A point in the antidiagonal is determined by its first co-ordinate (subtype version of
Finset.antidiagonal_congr
). This lemma is used by the ext
tactic.
A point in the antidiagonal is determined by its second coordinate.
See also Finset.antidiagonal_congr
.
The disjoint union of antidiagonals Σ (n : A), antidiagonal n
is equivalent to the product
A × A
. This is such an equivalence, obtained by mapping (n, (k, l))
to (k, l)
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
In a canonically ordered add monoid, the antidiagonal can be construct by filtering.
Note that this is not an instance, as for some times a more efficient algorithm is available.
Equations
- One or more equations did not get rendered due to their size.