Skip to content

Commit ac8406f

Browse files
author
Release Manager
committed
gh-39248: introduce new apozeta polynomial for posets This is adding a new method for posets, that computes a slight variant of the zeta polynomial. This new polynomial count chains that reach the top-level in a graded poset. ### 📝 Checklist - [x] The title is concise and informative. - [x] The description explains in detail what this PR is about. - [ ] I have linked a relevant issue or discussion. - [x] I have created tests covering the changes. - [x] I have updated the documentation and checked the documentation preview. URL: #39248 Reported by: Frédéric Chapoton Reviewer(s): Kwankyu Lee
2 parents 10edc54 + 6db279f commit ac8406f

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

src/sage/combinat/posets/posets.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@
184184
:meth:`~FinitePoset.flag_h_polynomial` | Return the flag h-polynomial of the poset.
185185
:meth:`~FinitePoset.order_polynomial` | Return the order polynomial of the poset.
186186
:meth:`~FinitePoset.zeta_polynomial` | Return the zeta polynomial of the poset.
187+
:meth:`~FinitePoset.apozeta_polynomial` | Return the apozeta polynomial of the poset.
187188
:meth:`~FinitePoset.M_triangle` | Return the M-triangle of the poset.
188189
:meth:`~FinitePoset.kazhdan_lusztig_polynomial` | Return the Kazhdan-Lusztig polynomial of the poset.
189190
:meth:`~FinitePoset.coxeter_polynomial` | Return the characteristic polynomial of the Coxeter transformation.
@@ -7236,6 +7237,8 @@ def zeta_polynomial(self):
72367237
In particular, `Z(2)` is the number of vertices and `Z(3)` is
72377238
the number of intervals.
72387239
7240+
.. SEEALSO:: :meth:`apozeta_polynomial`
7241+
72397242
EXAMPLES::
72407243
72417244
sage: posets.ChainPoset(2).zeta_polynomial()
@@ -7276,6 +7279,54 @@ def zeta_polynomial(self):
72767279
f = g[n] + f / n
72777280
return f
72787281

7282+
def apozeta_polynomial(self):
7283+
r"""
7284+
Return the apozeta polynomial of the poset ``self``.
7285+
7286+
The poset is assumed to be graded.
7287+
7288+
The apozeta polynomial of a poset is the unique polynomial
7289+
`Z^{a}(q)` such that for every integer `m > 1`, `Z^{a}(m)` is
7290+
the number of weakly increasing sequences `x_1 \leq x_2 \leq
7291+
\dots \leq x_{m-1}` of elements of the poset whose largest
7292+
element belongs to the top level of the poset.
7293+
7294+
When the poset `P` has a unique maximal element, this is
7295+
equal to `Z(q-1)` where `Z` is the zeta polynomial of `P`.
7296+
7297+
The name comes from the greek radical ``apo``.
7298+
7299+
.. SEEALSO:: :meth:`zeta_polynomial`
7300+
7301+
EXAMPLES::
7302+
7303+
sage: P = posets.NoncrossingPartitions(SymmetricGroup(4))
7304+
sage: P.apozeta_polynomial()
7305+
8/3*q^3 - 10*q^2 + 37/3*q - 5
7306+
7307+
sage: P = Poset({"a": "bc", "b": "d", "c": "de"})
7308+
sage: P.apozeta_polynomial()
7309+
3/2*q^2 - 5/2*q + 1
7310+
sage: P.zeta_polynomial()
7311+
3/2*q^2 - 1/2*q
7312+
7313+
TESTS:
7314+
7315+
Checking the simplest case::
7316+
7317+
sage: Poset({1: []}).apozeta_polynomial()
7318+
1
7319+
sage: parent(_)
7320+
Univariate Polynomial Ring in q over Rational Field
7321+
"""
7322+
from sage.functions.other import binomial
7323+
R = PolynomialRing(QQ, 'q')
7324+
q = R.gen()
7325+
7326+
top_level = self.level_sets()[-1]
7327+
return sum(binomial(q - 2, len(c) - 1)
7328+
for c in self.chains() if c and c[-1] in top_level)
7329+
72797330
def M_triangle(self):
72807331
r"""
72817332
Return the M-triangle of the poset.

0 commit comments

Comments
 (0)