斯特林的试炼

本文深入探讨了斯特林数在组合数学中的应用,包括第一类和第二类斯特林数的递推式、通项公式及其与阶乘、上升幂和下降幂的关系。文章详细介绍了如何利用斯特林数解决实际问题,如圆排列和集合划分,并通过例题展示了斯特林数在数列计算、图论和斯特林反演中的应用。同时,提供了计算斯特林数的高效算法,如通过递推和生成函数实现。

下面提到的内容均属组合数学范畴。


前言

由于式子较多,为增强直观性,笔者将一改以往的笔风,用 ( n m ) \displaystyle\binom{n}{m} (mn) 表示组合数 C ⁡ n m \operatorname{C}_n^m Cnm。同理,笔者分别会用 [ n k ] \begin{bmatrix}n \\ k\end{bmatrix} [nk] { n k } \begin{Bmatrix}n \\ k\end{Bmatrix} { nk} 表示第一类斯特林数 s ( n , k ) s(n, k) s(n,k) 和第二类斯特林数 S ( n , k ) S(n, k) S(n,k)

阅读这篇文章前,您需要较为熟练地掌握组合数、排列数(特别是圆排列)的定义和公式,以及常见的组合恒等式。


前置知识

上升幂和下降幂

  • 定义 x n ‾ x^{\overline{n}} xn x x x n n n上升阶乘幂,又称上升幂。它的值等于 ∏ i = 0 n ( x + i ) \prod_{i = 0}^n (x + i) i=0n(x+i)
  • 定义 x n ‾ x^{\underline{n}} xn x x x n n n下降阶乘幂,又称下降幂。它的值等于 ∏ i = 0 n ( x − i ) \prod_{i = 0}^n (x - i) i=0n(xi)

上升幂和下降幂的转换公式(请读者自主完成证明):
( − x ) n ‾ = ( − 1 ) n x n ‾ ( − x ) n ‾ = ( − 1 ) n x n ‾ (-x)^{\overline{n}} = (-1)^n x^{\underline{n}} \\ (-x)^{\underline{n}} = (-1)^n x^{\overline{n}} (x)n=(1)nxn(x)n=(1)nxn
实际上,上升幂和下降幂与普通幂之间也有转换公式,不过由于公式中存在斯特林数,因此将在下文提及。

普通生成函数

通俗的讲,对于一个数列 a n a_n an,它的普通生成函数(简称 OGF ⁡ \operatorname{OGF} OGF)为一个多项式:
f ( x ) = ∑ i = 0 ∞ a i x i f(x) = \sum_{i = 0}^{\infin} a_ix^i f(x)=i=0aixi
(严谨地讲, f ( x ) f(x) f(x) 应该叫做形式幂级数,不过笔者并不了解其确切定义,因此这里用更通俗的方式解释。)

也就是说,对于多项式 f ( x ) f(x) f(x),有 a n = [ x n ] f ( x ) a_n = [x^n]f(x) an=[xn]f(x)

如果我们能够得到这个多项式,那么我们也可以从它的系数中获取到这个序列

同时,如果我们要对数列间做一些运算(如卷积),也可以通过对这个多项式做运算得到最终的结果。


第一类斯特林数

n n n 个互不相同的数分为 k k k圆排列,这样的方案数称为第一类斯特林数,也叫斯特林轮换数,记做 s ( n , k ) s(n, k) s(n,k),也记做 [ n k ] \begin{bmatrix}n \\ k\end{bmatrix} [nk]

递推式

我们知道,如果在一个长为 n n n 的圆排列中插入一个数(一共有 n n n 个位置可以插入),形成的 n n n 种长为 n + 1 n + 1 n+1 的圆排列是互不相同的,因为它们互相之间不可以通过轮换得到

所以,第一类斯特林数有递推公式:
[ n k ] = [ n − 1 k − 1 ] + ( n − 1 ) [ n − 1 k ] \begin{bmatrix}n \\ k\end{bmatrix} = \begin{bmatrix}n - 1 \\ k - 1\end{bmatrix} + (n - 1) \begin{bmatrix}n - 1 \\ k\end{bmatrix} [nk]=[n1k1]+(n1)[n1k]
考虑从组合意义去证明:加入一个数,要么自己单独构成一个圆排列,要么插入已有的圆排列。前面说过,后者的方案数为 n − 1 n - 1 n1。所以,根据加法原理,即可得到该递推式。

当然,该递推式也存在边界条件: [ n 0 ] = [ n = 0 ] \begin{bmatrix}n \\ 0\end{bmatrix} = [n = 0] [n0]=[n=0]

由于第一类斯特林数不存在通项公式,这个递推式就显得尤为重要了,它将辅助证明下面的诸多结论。

常用公式

1. 和阶乘的关系:

n ! = ∑ i = 0 n [ n i ] n! = \sum_{i = 0}^n \begin{bmatrix}n \\ i\end{bmatrix} n!=i=0n[ni]

前者实际上是指 1 ∼ n 1\sim n 1n 的全排列。由于每一种排列中,圆排列的个数是一定的,那么我们可以考虑枚举所有的圆排列个数,把对应的第一类斯特林数相加即为答案。

2. 和上升幂的关系(上升幂转普通幂):

x n ‾ = ∑ i = 0 n [ n i ] x i x^{\overline{n}} = \sum_{i = 0}^n \begin{bmatrix}n \\ i\end{bmatrix} x^i xn=i=0n[ni]xi

证明:

  1. 考虑构造生成函数 f n ( x ) = ∑ i = 0 ∞ [ n i ] x i f_n(x) = \sum_{i = 0}^\infin \begin{bmatrix}n \\ i\end{bmatrix} x^i fn(x)=i=0[ni]xi.

    ∵ \because 根据递推式有 f n ( x ) = x f n − 1 ( x ) + ( n − 1 ) f n − 1 ( x ) f_n(x) = xf_{n - 1}(x) + (n - 1)f_{n - 1}(x) fn(x)=xfn1(x)+(n1)fn1(x).

    ∴ \therefore f n ( x ) = ( x + n − 1 ) f n − 1 ( x ) f_n(x) = (x + n - 1)f_{n - 1}(x) fn(x)=(x+n1)fn1(x).

    ∵ \because n = 1 n = 1 n=1 时,有 f 1 ( x ) = x f_1(x) = x f1(x)=x.

    ∴ \therefore f n ( x ) = ∑ i = 0 n [ n i ] x i = x n ‾ f_n(x) = \sum_{i = 0}^n \begin{bmatrix}n \\ i\end{bmatrix} x^i = x^{\overline{n}} fn(x)=i=0n[ni]xi=xn.

    以上证明过程也说明了:所有 n n n 相同的第一类斯特林数(也叫第 n n n 行第一类斯特林数)的生成函数是 x n ‾ x^{\overline{n}} xn

  2. 受上面过程的启发,我们还可以考虑用数学归纳法证明。

    显然当 n = 0 n = 0 n=0 n = 1 n = 1 n=1 时,原式左右两边相等。

    设当前结论满足 n = m n = m n=m 的情况,求证当前结论也满足 n = m + 1 n = m + 1 n=m+1 的情况。

    即证明: ∑ i = 0 n + 1 [ n + 1 i ] x i = ( x + n ) ∑ i = 0 n [ n i ] x i \sum_{i = 0}^{n + 1} \begin{bmatrix}n + 1 \\ i\end{bmatrix} x^i = (x + n) \sum_{i = 0}^n \begin{bmatrix}n \\ i\end{bmatrix} x^i i=0n+1[n+1i]xi=(x+n)i=0n[ni]xi
    ∑ i = 0 n + 1 [ n + 1 i ] x i = ∑ i = 0 n + 1 ( [ n i − 1 ] + n ⋅ [ n i ] ) x i = ∑ i = 0 n + 1 [ n i − 1 ] x i + ∑ i = 0 n + 1 n ⋅ [ n i ] x i = ∑ i = 0 n [ n i ] x i + 1 + n ⋅ ∑ i = 0 n [ n i ] x i = x ⋅ ∑ i = 0 n [ n i ] x i + n ⋅ ∑ i = 0 n [ n i ] x i = ( x + n ) ∑ i = 0 n [ n i ] x i \begin{aligned} &\sum_{i = 0}^{n + 1} \begin{bmatrix}n + 1 \\ i\end{bmatrix} x^i \\ = &\sum_{i = 0}^{n + 1} (\begin{bmatrix}n \\ i - 1\end{bmatrix} + n\cdot\begin{bmatrix}n \\ i\end{bmatrix}) x^i \\ = &\sum_{i = 0}^{n + 1} \begin{bmatrix}n \\ i - 1\end{bmatrix} x^i + \sum_{i = 0}^{n + 1} n\cdot\begin{bmatrix}n \\ i\end{bmatrix} x^i \\ = &\sum_{i = 0}^{n} \begin{bmatrix}n \\ i\end{bmatrix} x^{i + 1} + n \cdot\sum_{i = 0}^{n}\begin{bmatrix}n \\ i\end{bmatrix} x^i \\ = &x\cdot\sum_{i = 0}^{n} \begin{bmatrix}n \\ i\end{bmatrix} x^{i} + n \cdot\sum_{i = 0}^{n}\begin{bmatrix}n \\ i\end{bmatrix} x^i \\ = &(x + n) \sum_{i = 0}^n \begin{bmatrix}n \\ i\end{bmatrix} x^i \end{aligned} =====i=0n+1[n+1i]xii=0n+1([ni1]+n[ni])xii=0n+1[ni1]xi+i=0n+1n[ni]xii=0n[ni]xi+1+ni=0n[ni]xixi=0n[ni]xi+ni=0n[ni]xi(x+n)i=0n[ni]xi

同一行第一类斯特林数的求法

模板题

根据递推公式,我们可以得到一个 O ( n 2 ) \mathcal{O}(n^2) O(n2) 的做法。

根据上面的结论(第 n n n 行第一类斯特林数的生成函数是 x n ‾ x^{\overline{n}} xn),我们有 O ( n log ⁡ 2 2 n ) \mathcal{O}(n \log_2^2 n) O(nlog22n) 的做法:

因为上升幂本质上是若干个二项式相乘,所以我们分治后直接跑 NTT ⁡ \operatorname{NTT} NTT 即可。

有没有更快的做法?当然有!

考虑倍增(它是多项式内容里的常客),当前求出了 x n ‾ x^{\overline{n}} xn,要求 x 2 n ‾ x^{\overline{2n}} x2n

因为 x 2 n ‾ = x n ‾ ( x + n ) n ‾ x^{\overline{2n}} = x^{\overline{n}} (x + n)^{\overline{n}} x2n=xn(x+n)n,所以我们只要能够求出 ( x + n ) n ‾ (x + n)^{\overline{n}} (x+n)n,就能够做到 O ( n log ⁡ 2 n ) \mathcal{O}(n \log_2 n) O(nlog2n) 了。

考虑生成函数的展开形式:已知 f ( x ) = ∑ i = 0 n a i x i f(x) = \sum_{i = 0}^n a_ix^i f(x)=i=0naixi,要求 f ( x + n ) = ∑ i = 0 n a i ( x + n ) i f(x + n) = \sum_{i = 0}^n a_i(x + n)^i f(x+n)=i=0nai(x+n)i

我们对后面的这个式子做二项式展开:
∑ i = 0 n a i ( x + n ) i = ∑ i = 0 n a i ∑ j = 0 i ( i j ) x j n i − j = ∑ i = 0 n a i ∑ j = 0 i i ! j ! ( i − j ) ! x j n i − j = ∑ j = 0 n x j j ! ∑ i = j n a i i ! n i − j ( i − j ) ! = ∑ j = 0 n x j j ! ∑ i = 0 n − j a i + j ( i + j ) ! n i i ! \begin{aligned} &\sum_{i = 0}^n a_i(x + n)^i \\ = &\sum_{i = 0}^n a_i\sum_{j = 0}^i\displaystyle\binom{i}{j}x^jn^{i - j} \\ = &\sum_{i = 0}^n a_i\sum_{j = 0}^i\frac{i!}{j!(i - j)!}x^jn^{i - j} \\ = &\sum_{j = 0}^n\frac{x_j}{j!}\sum_{i = j}^n a_ii!\frac{n^{i - j}}{(i - j)!} \\ = &\sum_{j = 0}^n\frac{x_j}{j!}\sum_{i = 0}^{n - j} a_{i + j}(i + j)!\frac{n^{i}}{i!} \end{aligned} ====i=0nai(x+n)ii=0n

内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道与桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键环节,重点揭示高速行车条件下基础设施的振动传递规律与力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化与运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程与交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课题的研究者。; 使用场景及目标:①用于高校与科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示与科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估与减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围与优化方向。
内容概要:本文系统研究了非线性薛定谔方程的物理信息神经网络(PINN)求解方法,提出一种将物理规律嵌入深度学习模型的科学计算新范式。通过构建全连接神经网络架构,将非线性薛定谔方程及其初始/边界条件作为损失函数的核心组成部分,实现了在无须大量标注数据的前提下对复值偏微分方程的高精度数值求解。该方法充分利用自动微分技术精确计算方程残差,有效融合了数据驱动与模型驱动的优势,在光学孤子传播、量子系统演化等典型场景中展现出优异的逼近能力与泛化性能。文中配套提供了完整的Python实现代码,涵盖网络搭建、损失定义、训练优化与结果可视化全流程。; 适合人群:具备Python编程能力与深度学习基础知识,熟悉偏微分方程理论及科学计算的理工科研究生、科研人员,以及从事光学、量子物理、流体力学等领域建模与仿真的工程技术人员。; 使用场景及目标:① 掌握PINN方法的基本原理与实现技巧;② 学习如何将复杂物理方程转化为可训练的神经网络损失项;③ 应用于非线性光学、玻色-爱因斯坦凝聚、水波动力学等问题的仿真与预测;④ 为相关科研课题提供可复现的算法原型与代码参考。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解神经网络对微分算子的近似机制、损失函数的多任务加权策略以及训练过程中的超参数调优方法,进而可迁移至其他非线性偏微分方程的求解任务,拓展其在交叉学科中的应用边界。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 微软推出的【AZ-900微软认证】是一项针对初学者的基础级云服务资格认证,其目的在于帮助学习者掌握云概念、微软Azure服务的运作机制以及云解决方案的核心知识。获得这一认证后,考生将能够清晰地理解云计算领域的基础术语、服务模式(包括IaaS、PaaS、SaaS等)以及这些服务在Azure平台上的实际应用方式。 在【必过考题】部分,我们可以观察到两个重点议题,它们分别聚焦于PaaS(平台即服务)的概念阐释和云成本的计算方式。 在第一个议题中,考生被要求辨别关于PaaS的正确性描述。PaaS平台提供了一个开发环境,但并不允许用户直接访问操作系统(Box 1: No)。比如,Azure Web Apps服务可以用来部署web应用,但用户无法直接管理虚拟机或IIS系统。另一方面,PaaS确实具备自动扩展的功能(Box 2: Yes),这表示可以根据实际需求自动增加负载均衡的虚拟机以支持web应用的运行。PaaS框架还为开发人员提供了构建和调整云端应用的工具,预置的应用组件能够有效缩短新应用的编程周期(Box 3: Yes)。 第二个议题同样关注云计算理念的理解,尤其强调IT支出从资本性支出(CapEx)向运营性支出(OpEx)的转型思想。传统的IT投资通常被视为CapEx,而云计算的按需付费机制使企业能够将这部分开支转化为OpEx,从而在财务规划上获得更大的自由度。 在为AZ-900考试做准备时,考生需要特别关注以下几个核心知识点: 1. **云服务模式**:深入理解IaaS(基础设施即服务)、PaaS和SaaS(软件即服务)之间的差异及其各自的应用情境。 2. **Azure服务*...
源码下载地址: https://pan.quark.cn/s/239a0d536a1e 依据所提供的文件资料,可以归纳出以下核心内容:由清华大学计算机系邓俊辉教授精心编纂的算法训练营题目合集,对于CSP(中国软件专业人才设计与创业大赛)及PAT(程序设计能力测试)这类编程竞赛具有极高的参考价值,堪称一份极具价值的参考资料。此类竞赛普遍对参赛者的算法功底和编程技巧提出严苛要求。该合集中的题目与算法领域紧密相连,其中包含了“最大红矩形”这一典型题目。所谓最大红矩形题目,其核心任务是针对一个由红色与绿色方格构成的棋盘,寻觅出最大的纯红矩形区域。要攻克这一问题,必须运用数据结构与算法的相关知识,特别是栈这一数据结构的应用。 “最大红矩形”问题能够被抽象转化为“直方图最大面积”问题。具体转化方法是将棋盘的每一列视为一个独立的直方图单元,其中红色方格的贡献体现为当前位置与前一个绿色方格所在行数的差值,从而保证每个直方图的基宽恒定为1。随后,借助扫描直方图的技术手段来探寻最大矩形面积。这一过程需要对每个直方图进行系统性遍历,并利用栈来记录各直方图的下标信息。一旦检测到当前直方图的高度小于栈顶元素所记录的高度,则意味着遭遇了一个“高点”,此时需计算以该“高点”为右边界条件的最大矩形面积。 在编程实践环节,必须高度关注栈的操作细节,以及如何精确地初始化和操纵栈来应对直方图问题。代码实现中,通常配置两个栈,一个用于储存直方图的高度值,另一个用于标记直方图的下标位置。当面对新高度时,需审慎判断当前高度与栈顶高度的相对关系,并据此抉择是执行入栈操作还是计算面积。针对“低点”(即当前高度小于栈顶),应直接将当前高度纳入栈中;而对于“高点”,则需执行弹出栈顶元素的操作,并基于该栈顶元素的高...
源码链接: https://pan.quark.cn/s/3af847fbbec7 在计算机科学与编程领域中,十六进制(Hexadecimal)以及二进制(Binary)是两种关键性的数值表示方法。十六进制属于一种基于16的计数系统,它运用0至9的数字以及字母A至F(分别象征10至15的数值)来呈现数值,与此同时,二进制则是一种基于2的计数系统,仅采用0和1两个符号。掌握这两种进制之间的相互转换对于深入理解计算机内部运作机制具有决定性意义,因为计算机在底层数据的存储与处理环节通常都是以二进制的形式来进行的。将十六进制转换成二进制的过程可以通过以下几个环节得以完成: 1. **单个十六进制符号的转换**:每一个十六进制符号对应着4位二进制序列。具体而言: - 十六进制中的`0`在二进制表达为`0000` - 十六进制中的`1`在二进制表达为`0001` - 十六进制中的`2`在二进制表达为`0010` - 依此类推 - 十六进制中的`9`在二进制表达为`1001` - 十六进制中的`A`或`a`在二进制表达为`1010` - 十六进制中的`B`或`b`在二进制表达为`1011` - 十六进制中的`C`或`c`在二进制表达为`1100` - 十六进制中的`D`或`d`在二进制表达为`1101` - 十六进制中的`E`或`e`在二进制表达为`1110` - 十六进制中的`F`或`f`在二进制表达为`1111` 2. **多位十六进制符号的转换**:针对一个由多个十六进制符号组成的数值,我们可以逐个符号进行转换,并将得到的二进制序列依次拼接。例如,十六进制数`3F`转换成二进制形式为`00111111`。 3. **编程实现方法**:在编程实践过程中,众多编程语言提...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值