数学杂谈 #24
关于欧拉数
以下内容摘抄自《具体数学》。
定义
定义一个 \(n\) 阶排列 \(\pi\) 的上升数 \(r(\pi)=\sum_{k=1}^{n-1}[\pi_k<\pi_{k+1}]\)。
从组合意义的角度来说,对于 \(n>0, 0\le k<n\),我们定义欧拉数为:
欧拉数的递归式
我们考虑常见的构建排列的方法:从小到大插入每个元素。
首先考虑边界值。有组合意义的边界值为 \(\left<\begin{matrix}1\\0\end{matrix}\right>=1,\left<\begin{matrix}1\\1\end{matrix}\right>=0\)。我们先从这里入手。
考虑 \(n\ge 1,0\le k<n\),我们有一个 \(n\) 阶排列 \(\rho\) 满足 \(r(\rho)=k\)。向 \(\rho\) 中插入 \(n+1\) 生成排列 \(\pi\),我们需要讨论插入 \(n+1\) 的位置:
-
插在 \(\rho_1\) 之前,则有 \(r(\pi)=r(\rho)+1\)。
-
插在 \(\rho_n\) 之后,则有 \(r(\pi)=r(\rho)\)。
-
插在上升的元素之间,例如为 \(\rho_j<\rho_{j+1}\)。则原先的“上升”会被打破,\(\rho_j\) 和 \(n+1\) 构成一个新的“上升”,\(n+1\) 和 \(\rho_{j+1}\) 不会产生“上升”,因此 \(r(\pi)=r(\rho)\)。
我们知道一共有 \(k\) 个插入点归为这一类。
-
插在下降的元素之间,类似地讨论可以得到 \(r(\pi)=r(\rho)+1\)。
我们知道一共有 \(n-1-k\) 个插入点归为这一类。
整理一下,我们可以得到递归式:
上述递归式要求 \(n>1,0<k<n\)。为了让形式更简洁,同时也更符合研究组合数、斯特林数的经验,我们可以作出如下约定:
-
\(\newcommand{\eulnum}[2]{\left<\begin{matrix}#1\\#2\end{matrix}\right>}\eulnum{n}{-k}=0,k>0\)。
-
\(\newcommand{\eulnum}[2]{\left<\begin{matrix}#1\\#2\end{matrix}\right>}\eulnum{0}{k}=[k=0]\)。
这样我们可以自然地将递归式拓展到 \(n>0\),并且组合意义和形式都可以得到保持。
欧拉数的部分性质
对称性
排列中,两个数之间的关系不是上升就是下降。有 \(k\) 个上升的排列恰好有 \(n-1-k\) 个下降,经过“反射”之后,新的排列恰好有 \(n-1-k\) 个上升。由于“反射”是 \(S_n\) 到 \(S_n\) 的双射,我们可以得知:
可以验证,如果 \(k\) 在 \([0,n)\) 范围之外,这个性质仍然成立!
容斥计算欧拉数
直接从递推式解出通项公式当然是可行的,但是......呃......我不会。
所以,我们还是考虑结合组合意义进行构造。
欧拉数运算的一部分是,给定一个由 \(<,>\) 构成的长度为 \(n-1\) 的字符串 \(s\),有多少个 \(n\) 阶排列 \(\pi\) 满足“对于 \(1\le k<n\),\(\pi_k\) 和 \(\pi_{k+1}\) 的关系恰好为 \(s_k\)”?
Note.
如果说得不够清楚,读者可以参考「LibreOJ NOI Round #2」不等关系这道题。
进而,我们可以将 \(\newcommand{\eulnum}[2]{\left<\begin{matrix}#1\\#2\end{matrix}\right>}\eulnum{n}{m}\) 看作是所有恰好有 \(m\) 个 \(<\) 的 \(s\) 的结果求和。
延续一下上面那道题目的解法,我们枚举有多少个 \(<\) 的关系被打破了,这些被打破的 \(<\) 就相当于变成了 \(>\)。那么,现在合法的排列只需要满足所有的 \(>\),而不需要关心 \(<\)。仅满足 \(>\) 很简单,我们可以将 \(s\) 划分为极长的 \(>\) 连续段,为每个连续段分配值;由于一个连续段内的值必然按照确定顺序排放,因此方案数仅仅和“连续段数量”和“各连续段长度”有关,并且和集合划分的问题联系上了。
那么,考虑 \(s\) 不确定的情况。此时连续段的长度就不重要了,真正重要的是“连续段数量”。如果有 \(c\) 个连续段,容易发现此时的方案数为 \(\newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}}c!\stwo{n}{c}\)(注意,各个值集合之间的顺序也会影响结果)。
因此,当 \(k\) 个 \(<\) 被打破时,排列形态数为 \(\newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}}(m+1-k)!\stwo{n}{m+1-k}\)。此时我们还需要选出变成 \(>\) 的那 \(k\) 个 \(<\) 的位置,容易发现为 \(\dbinom{(n-1)-(m-k)}{k}\)。算上容斥系数,我们有:
最后一个式子是《具体数学》上查到的,由于经过较多变形,所以虽然简洁却有点抽象。
这个容斥推导在 \(n>0\) 时是合法的。如果要扩展到 \(n\ge 0\),我们需要将求和下界放到 \(k=0\)(在 \(n=k=0\) 的时候就可以算出来为 \(1\))。当然,更好的写法是,\(k\) 取遍所有有意义值。
欧拉数和第二类斯特林数
容斥方法为我们在欧拉数和第二类斯特林数之间搭了一座桥。现在我们尝试借助它,稍微深入地研究一下两者之间的关系。
首先注意到,RHS 可以看作是:
这是很好的形式。我们可以直接用二项式反演,算出来 \(\newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}} k!\stwo{n}{k}\):
这个 \(\newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}} k!\stwo{n}{k}\) 有没有让你想到什么?
普通幂-欧拉数-组合数
我们知道 \(\newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}} k!\stwo{n}{k}\) 是 \(x^n\) 的牛顿级数的系数。现在将这一堆东西代!进!去!
漂亮!我们去掉了斯特林数。现在得到的其实是通过欧拉数建立的,关于普通幂和连续组合数/连续下降幂的直接关系。
这个东西有什么用?举个例子,我们考察典中典,自然数幂和:
只要我们可以快速算出来一行的欧拉数,我们就可以快速地算出自然数幂和。
自然,直接借助二项式反演的结论,我们可以 \(O(r\log r)\) 地算出来所有需要的数(这里同时包含了斯特林数和欧拉数的计算,都是 \(O(r\log r)\))。
另一个通项和行前缀和
我们知道:
很容易想到把它代入到之前那个通项公式之中,于是有:
最后一个式子也可以从《具体数学》上查到的,非常简洁。
需要注意的是,从书上查到的结果是,\(r\) 的求和范围为 \(0\le r\le m\),而这里算出来实际上为 \(0\le r\le m+1\)。在 \(m=0\) 的时候,前者结果恒为 \(1\),后者结果为 \([n\neq 0]\),也就是算出来的结果确实有那么些问题。
Remark.
我们注意到了左侧是欧拉数,右侧是类似于“二项式反演”+“普通幂”的形式。
那么,我们是不是可以直接从“普通幂”的结果推到这里来?
我猜是可以的,但是还没有做验证。可能需要特殊的赋值才可以完成。
如果用这个等式来计算一行欧拉数,那么我们仍然只能做到 \(O(n\log n)\)。然而,这个做法直接规避了斯特林数,而是用可以线性预处理的自然数幂和取代,因此会少一次卷积,更加简单。
另外,利用这一个等式,我们也可以考察一行欧拉数的前缀和:
很有意思。一般来说,这种特殊数的行前缀和都是很难求的,但是欧拉数偏偏可以线性求出来。
不过换个角度思考,欧拉数可以和普通幂互相转换,而组合数、斯特林数如果要做这种转换,就必须互相挂钩,难度大一点也就可以理解。
欧拉数的生成函数
注意,这里的生成函数没有查阅资料检验过,因此仅作为尝试,不保证正确性。
我们从恒等式:
入手。注意到,我们需要生成 \(\sum_{y\ge 0} y^rr^n\) 这样形式的生成函数。这是经典的,我们有:
为了方便,我们把 \(y\) 和 \(r\) 错开一下,也就是使用 \(\frac{e^x}{1-ye^x}\)。
而我们还有一个 \((-1)^r\dbinom{n+1}{r}\) 要处理。关于 \(r\) 配一个形式变元:
恰好有 \(x^n\),因此我们可以得到:
二阶欧拉数
不懂,走啦。
\( % library \newcommand{\eulnum}[2]{\left<\begin{matrix}#1\\#2\end{matrix}\right>} % Eulerian Numbers \newcommand{\stwo}[2]{\begin{Bmatrix}#1\\#2\end{Bmatrix}} % Stirling Numbers \)