CMU 15-751 课程第三课笔记。

接上回 CMU 15-751 CS Theory Toolkit Lecture 2 - Basic Asymptotics。

同样照抄参考了 Lecture Note。

今天学习的是阶乘和二项式系数的渐进分析,这两种的出现频率非常高,因此我们很有必要熟悉他们的渐进方法。这也是我们做更多渐进分析的练习的机会。

阶乘(Factorials)

n!=2Θ(nlog⁡n)n! = 2^{\Theta(n\log n)}

阶乘我们非常熟悉,n!=n(n−1)(n−2)…2⋅1=∏i=1nin! = n(n-1)(n-2)\dots 2\cdot 1 = \prod_{i=1}^n i。

那我们如何分析 n!n! 的渐进性呢?

首先,我们显然有

n!=n(n−1)(n−2)…2⋅1≤n⋅n⋯n⋅n=nn\begin{aligned} n! &= n(n-1)(n-2)\dots 2\cdot 1\\ &\leq n\cdot n\cdots n \cdot n = n^n \end{aligned}

这是 n!n! 我们可以确定的一个上界,尽管这个上界可以说宽松得过分。

想要计算 n!n! 的下界,我们可以只取前 ⌈n2⌉\lceil\frac n2\rceil 项,对这些项应该都大于 n2\frac n2,对它们都取 ⌈n2⌉\lceil\frac n2\rceil 的下界,得到

n!=n(n−1)(n−2)…2⋅1≥⌈n2⌉⋅⌈n2⌉⋯⌈n2⌉(⌈n2⌉times)=(⌈n2⌉)⌈n2⌉≥(n2)n/2\begin{aligned} n! &= n(n-1)(n-2)\dots 2\cdot 1\\ &\geq \lceil\frac n2\rceil\cdot\lceil\frac n2\rceil\cdots\lceil\frac n2\rceil\quad (\lceil\frac n2\rceil\text{times})\\ &= \left(\lceil\frac n2\rceil\right)^{\lceil\frac n2\rceil} \geq \left(\frac n2\right)^{n / 2} \end{aligned}

上面的讨论是建立在 nn 是偶数的基础上的,但是在 nn 是奇数的时候这也是成立的,这很容易看出来。

这样,我们就得到了一个仍然不宽松的下界,且把上下界都统一为 nnn^n 的形式。

但是我们如何比较 n!n! 的上下界呢?即使形式类似,(n2)n/2\left(\frac n2\right)^{n / 2} 和 nnn^n 的大小实际上也相差甚远。

对于这样的很大很长的连乘式,对它们不断取对数是一个很常用的做法,因为这样我们就可以把底数大小、连乘次数这些难以解决的东西变成对数下的常数。

因此,我们得到

n2ln⁡(n2)≤ln⁡(n!)≤nln⁡n\frac n2\ln\left(\frac n2\right) \leq \ln(n!) \leq n\ln n

因此,这里的 ln⁡(n!)\ln(n!) 的上下界都可以统一为 Θ(nlog⁡n)\Theta(n\log n)。

于是我们就得到了 n!=2Θ(nlog⁡n)n! = 2^{\Theta(n\log n)}。

当然,这个结果过于宽松,我们不会满意于这个结果。让我尝试获得更精确的结果。

ln⁡(n!)∼nln⁡n\ln(n!) \sim n\ln n

通过泰勒公式,我们可以得到:

ex=1+x+x22!+x33!+…≥xnn!,∀x≥0\begin{aligned} e^x &= 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \dots\\ &\geq \frac{x^n}{n!},\quad \forall x \geq 0 \end{aligned}

我们令 x=nx = n,则可以得到 n!≥xnen=(ne)nn! \geq \frac{x^n}{e^n} = \left(\frac ne\right)^n。

这是一个非常优秀的下界,我们将之与之前得到的上界连在一起便可以得到 (ne)n≤n!≤nn\left(\frac ne\right)^n \leq n! \leq n^n。于是

nln⁡(ne)=nln⁡n−n≤ln⁡(n!)≤nln⁡nn\ln\left(\frac ne\right) = n\ln n - n \leq \ln(n!) \leq n\ln n

于是我们就得到了 ln⁡(n!)∼nln⁡n\ln(n!) \sim n\ln n。

这是一个非常优美的形式,但是实际上这个界限还是非常宽松——这仅仅是一个对于 ln⁡(n!)\ln(n!) 的优秀渐进,对于 n!n! 本身仍然是一个很大的范围,我们希望知道 n!n! 是离 (ne)n\left(\frac ne\right)^n 更接近还是距离 (n1)n\left(\frac n1\right)^n 更接近。

n!≈nnenn! \approx \frac{n^n}{e^n}

为了解决这个问题,我们可以设出分式的分母。令 n!=nnf(n)n! = \frac{n^n}{f(n)},即 f(n)=nnn!f(n) = \frac{n^n}{n!}。我们只需要关心 f(n)→1f(n) \to 1 还是 f(n)→enf(n)\to e^n,也就是 f(n+1)f(n)→1\frac{f(n+1)}{f(n)}\to 1 还是 f(n+1)f(n)→e\frac{f(n+1)}{f(n)}\to e。

f(n+1)f(n)=(n+1)n+1/nn(n+1)!/n!=(n+1)nnn=(1+1n)n\begin{aligned} \frac{f(n+1)}{f(n)} &= \frac{(n+1)^{n+1} / n^n}{(n+1)! / n!}\\ &= \frac{(n+1)^{n}}{n^n}\\ &= (1 + \frac 1n)^n \end{aligned}

根据微积分的基本知识,我们知道这个式子的极限是 ee。(实际上,这也是 ee 的定义之一,或者也可以通过 1+1n≈e1/n1 + \frac 1n \approx e^{1/n} 来理解)

于是我们就得到了 f(n)≈enf(n) \approx e^n,那么对于很大的 nn,我们就可以有 n!≈nnen。n! \approx \frac{n^n}{e^n}。

n!=Θ(nnenn)n! = \Theta(\frac{n^n}{e^n}\sqrt n)

模仿上一个 Lecture 中我们求调和数的渐进性的方法,我们可以用积分发来更精确地计算 n!n! 的渐进。

使用积分来接近

我们知道 ln⁡(n!)=ln⁡1+ln⁡2+ln⁡3+⋯+ln⁡n\ln(n!) = \ln 1 + \ln 2 + \ln 3 + \dots + \ln n,其中 ln⁡1=0\ln 1 = 0,因此我们可以用 ∫1nln⁡t dt\int_1^n \ln t\ \mathrm dt 来接近 ln⁡(n!)\ln(n!)。

如上面的图 (a) 所示,我们可以得到

ln⁡(n!)≥∫1nln⁡t dt=tln⁡t−t∣1n=nln⁡n−n+1\begin{aligned} \ln(n!) &\geq \int_1^n \ln t\ \mathrm dt\\ &= t\ln t - t \big|_1^n\\ &= n\ln n - n + 1 \end{aligned}

这样我们就算出了 ln⁡(n!)\ln(n!) 的上限。

我们很清楚地知道我们这里的积分多算了哪一块。我们可以通过把每一个矩形左上角的三角形加回来,如图 © 所示,来弥补这个多算的部分——但是这样会导致有若干的小薄条没有被计算,因此我们得到的是 ln⁡(n!)\ln(n!) 的下限。

图 © 中的每一个小薄条,都是底为 11,高为 ln⁡n−ln⁡(n−1)\ln n - \ln(n-1) 的直角三角形。这些直角三角形的面积和很容易计算,它们的高之和显然就是 ln⁡2−ln⁡1+ln⁡3−ln⁡2+⋯+ln⁡n−ln⁡(n−1)=ln⁡n\ln 2 - \ln 1 + \ln 3 - \ln 2 + \dots + \ln n - \ln(n-1) = \ln n,因此它们的面积和就是 12⋅1⋅ln⁡n=12ln⁡n\frac 12 \cdot 1 \cdot \ln n = \frac 12 \ln n。

于是我们得到

nln⁡n−n+1≤ln⁡(n!)≤nln⁡n−n+12ln⁡n+1n\ln n - n + 1 \leq \ln(n!) \leq n\ln n - n + \frac 12\ln n + 1

对两边做 exp⁡\exp 运算,得到

nnen⋅e≤n!≤nnen⋅n⋅e\frac{n^n}{e^n}\cdot e \leq n! \leq \frac{n^n}{e^n} \cdot \sqrt n \cdot e

这样我们就把 n!≈nnenn! \approx \frac{n^n}{e^n} 推进到了一个更紧的范围。这个形式也可以写成 n!=Θ~(nnen)n! = \tilde\Theta\left(\frac{n^n}{e^n}\right)。

但是这个结果我们仍然不满意。我们想要知道除了 nnen\frac{n^n}{e^n} 这个因式之外,剩下的那个因式到底是 Θ(1)\Theta(1) 还是 Θ(n)\Theta(\sqrt n)。

我们知道,我们刚刚在计算 ln⁡(n!)\ln(n!) 的上界时,求得的结果只比真正的值多了若干个小薄片。那么我们要想办法把这个小薄片的面积减去。

直接计算当然不好算,但是我们可以想办法去接近。我们可以再 y=ln⁡xy = \ln x 的曲线上,每一次都从第 ii(ii 从 22 开始编号)个小薄条的右上角 (n,ln⁡n)(n, \ln n) 做一个切线,与 x=n−1x = n-1 这条直线的交点,以及 (n−1,ln⁡(n−1))(n-1, \ln(n-1)) 这三个点构成一个三角形。这个三角形的面积显然会比小薄条的面积大,因此减去后就可以得到一个更紧密的下界。

切线三角形的面积

我们知道 (n,ln⁡n)(n, \ln n) 点的切线斜率是 1n\frac 1n,因此交点的 yy 坐标是 ln⁡n−1n\ln n - \frac 1n,三角形的底就是 ln⁡n−ln⁡(n−1)−1n\ln n - \ln(n-1) - \frac 1n。于是小三角形的总面积就是

12∑i=2n(ln⁡n−ln⁡(n−1)−1n)=12∑i=2nln⁡n−12∑i=1n−1ln⁡n−12∑i=2n1n=12(ln⁡n−H(n)+1)\begin{aligned} &\frac 12\sum_{i=2}^n \left(\ln n - \ln(n-1) - \frac 1n\right)\\ =& \frac 12\sum_{i=2}^n \ln n - \frac 12\sum_{i=1}^{n-1}\ln n - \frac 12\sum_{i=2}^n \frac 1n\\ =& \frac 12(\ln n - H(n) + 1) \end{aligned}

其中,H(n)H(n) 是我们上一个 Lecture 的调和数。我们知道 H(n)=ln⁡n+γ−O(1n)H(n) = \ln n + \gamma - O(\frac 1n)。因此上式可以写为 12(1−γ+O(1n))=Θ(1)\frac 12\left( 1 - \gamma + O\left(\frac 1n\right)\right) = \Theta(1)。

也就是说

nln⁡n−n+12ln⁡n+1−Θ(1)≤ln⁡(n!)≤nln⁡n−n+12ln⁡n+1n\ln n - n + \frac 12\ln n + 1 - \Theta(1)\leq \ln(n!) \leq n\ln n - n + \frac 12\ln n + 1

即

n!=Θ(nnenn)n! = \Theta(\frac{n^n}{e^n}\sqrt n)

斯特林公式(Stirling’s Formula)

实际上从上面的结论到这个公式还需要做更多的计算。如果真的想要求出这个常数的话再后面的学习中我们可能会遇到。但是这里我们只需要知道

n!=2πn(ne)n(1±O(1n))n! = \sqrt{2\pi n} \left(\frac ne\right)^n\left(1 \pm O\left(\frac 1n\right)\right)

二项式系数(Binomial Coefficients)

当 kk 非常小的时候,(nk)≈nkk!\binom nk \approx \frac{n^k}{k!}

二项式系数我们都很熟悉,(nk)=n!k!(n−k)!=n(n−1)⋯(n−k+1)k!\binom nk = \frac{n!}{k!(n-k)!} = \frac{n(n-1)\cdots(n-k+1)}{k!}。它可以表示从 nn 个不同物品中选出 kk 个的方案数,也可以表示二项式展开得到的系数。

当 kk 很小,也就是 k<<nk << n 时,我们可以得到

n(n−1)⋯(n−k+1)k!=nkk!(1−1n)(1−2n)⋯(1−k−1n)=nkk!Pk,n=nkk!exp⁡(−k22n)∼nkk!(1−k22n)∼nkk!\begin{aligned} &\frac{n(n-1)\cdots(n-k+1)}{k!}\\ =& \frac{n^k}{k!}\left(1 - \frac 1n\right)\left(1 - \frac 2n\right)\cdots\left(1 - \frac{k-1}n\right)\\ =& \frac{n^k}{k!}P_{k, n}\\ =& \frac{n^k}{k!}\exp\left(-\frac{k^2}{2n}\right) \sim \frac{n^k}{k!}\left(1-\frac{k^2}{2n}\right)\\ \sim& \frac{n^k}{k!} \end{aligned}

其中 Pk,nP_{k, n} 是我们在之前的生日问题中定义的数。

于是我们得到,当 kk 非常小的时候,(nk)≈nkk!\binom nk \approx \frac{n^k}{k!}。

简单的上下界

实际上,因为 n(n−1)⋯(n−k+1)≤nkn(n-1)\cdots(n-k+1) \leq n^k,所以 nkk!\frac{n^k}{k!} 是 (nk)\binom nk 的一个简单的上界,这对任意的 kk 都成立。又因为 k!≥kkekk! \geq \frac{k^k}{e^k},于是我们可以得到一个工整一些的形式:

(nk)≤(enk)k\binom nk \leq \left(\frac{en}k\right)^k

我们也可以求出 (nk)\binom nk 的下界。

我们知道

(nk)=nk⋅n−1k−1⋅n−2k−2⋯n−k+11\binom nk = \frac nk\cdot \frac{n-1}{k-1}\cdot\frac{n-2}{k-2}\cdots\frac{n-k+1}{1}

因为 n−ik−i≥nk\frac{n-i}{k-i} \geq \frac nk(可以通过 ⇔nk−ki≥nk−ni\Leftrightarrow nk - ki \geq nk - ni 来证明),因此我们可以得到

(nk)≥(nk)k\binom nk \geq \left(\frac nk\right)^k

我们惊喜地看到,我们得到的上界和下界仅有一个 eke^k 的因式的差异。这样的渐进对于我们来说往往是足够的,如果我们取一下对数,我们可以得到

kln⁡(nk)≤ln⁡(nk)≤kln⁡(enk)=kln⁡(nk)+kk\ln\left(\frac nk\right) \leq \ln\binom nk \leq k\ln\left(\frac {en}k\right) = k\ln\left(\frac nk\right) + k

也就是 ln⁡(nk)=Θ(kln⁡(nk))\ln \binom nk = \Theta\left(k\ln\left(\frac nk\right)\right)。

(npn)≤2H(p)n\binom n{pn} \leq 2^{H(p)n}

如果我们知道常数 pp 满足 0<p≤n2,k=pn0 < p \leq \frac n2, k = pn,我们希望能够对于这时的 (nk)\binom nk 能够更好地分析渐进性。

一般来说,这里我们应该使用斯特林公式来求解这个问题,但是让我们先来试着用一些基本的方法求出 (npn)\binom n{pn} 的上界。

我们令 V(n,k)=(n0)+(n1)+⋯+(nk)V(n, k) = \binom n0 + \binom n1 + \dots + \binom nk。这个值可以代表 11 的个数不多于 kk 的长度为 nn 的不同二进制字符串的数量,也通常被认为半径为 kk 的以 00⋯000\cdots0(nn 个 00)为中心的「Hamming ball」的数量的容量。这个数在 TCS 中经常出现。

由二项式定理:

(1+x)n=1+(n1)x+(n2)x2+⋯+(nk)xk+⋯+(nn)xn≥(n0)+(n1)x+(n2)x2+⋯+(nk)xk≥xk⋅V(n,k),∀0<x≤1\begin{aligned} (1 + x)^n &= 1 + \binom n1x + \binom n2x^2 + \dots + \binom nkx^k + \dots + \binom nnx^n\\ &\geq \binom n0 + \binom n1x + \binom n2x^2 + \dots + \binom nkx^k\\ &\geq x^k\cdot V(n, k),\quad\forall0 < x \leq 1 \end{aligned}

因此

V(n,k)≤(1+x)nxk=(1+x)n(pn)k=(1+xxp)n=(x−p+x1−p)n=(x−p+xq)n,∀0<x≤1\begin{aligned} V(n, k) &\leq \frac{(1 + x)^n}{x^k} = \frac{(1 + x)^n}{(pn)^k} = \left(\frac{1+x}{x^p}\right)^n\\ &= \left(x^{-p} + x^{1-p}\right)^n = \left(x^{-p} + x^q\right)^n,\quad\forall0 < x \leq 1 \end{aligned}

其中,我们令 q=1−pq = 1 - p。

通过求导我们可以知道,当 x=pqx = \frac pq 时,x−p+xqx^{-p}+x^q 取得最小值。这个 xx 会小于等于 11,因为我们曾假设 p≤12p \leq \frac 12。那么此时

x−p+xq=x−p(1+x)=x−p(1+pq)=x−p⋅1q=(pq)−p⋅1q=(qp)p(1q)p(1q)q=(1p)p(1q)q\begin{aligned} x^{-p}+x^q &= x^{-p} (1+x) = x^{-p}\left(1 + \frac pq\right)\\ &= x^{-p}\cdot\frac 1q = \left(\frac pq\right)^{-p}\cdot \frac 1q\\ &= \left(\frac qp\right)^{p} \left(\frac 1q\right)^{p}\left(\frac 1q\right)^{q}\\ &= \left(\frac 1p\right)^{p}\left(\frac 1q\right)^{q} \end{aligned}

因而

(npn)≤V(n,pn)≤[(1p)p(1q)q]n=p−pnq−qnfor p≤12\binom n{pn} \leq V(n, pn) \leq \left[\left(\frac 1p\right)^{p}\left(\frac 1q\right)^{q}\right]^n = p^{-pn}q^{-qn} \quad \text{for}\ p\leq \frac 12

如果我们令 H(p)=plog⁡21p+qlog⁡21qH(p) = p\log_2\frac 1p + q\log_2\frac 1q,这个函数一般被称为二元交叉熵(Binary entropy function),那么上式可以写成

(npn)≤V(n,pn)=2H(p)n\binom n{pn} \leq V(n, pn) = 2^{H(p)n}

 示意图

(npn)=Θ(1n2H(p)n)\binom n{pn} = \Theta\left(\frac 1{\sqrt n}2^{H(p)n}\right)

现在让我们来使用斯特林公式解决这个问题。

(npn)=n!(pn)!(qn)!∼2πn(n/e)n2πn(pn/e)pn⋅2πn(qn/e)qn=2πn(n/e)n(2πn)(n/e)nppnqqn=12πpq1n[(1p)p(1p)q]n=12πpq1n2H(p)n\begin{aligned} \binom n{pn} &= \frac{n!}{(pn)!(qn)!}\\ & \sim \frac{\sqrt{2\pi n}(n/e)^n}{\sqrt{2\pi n}(pn/e)^{pn}\cdot \sqrt{2\pi n}(qn/e)^{qn}}\\ &= \frac{\sqrt{2\pi n}(n/e)^n}{(2\pi n)(n/e)^n p^{pn}q^{qn}}\\ &= \frac 1{\sqrt{2\pi pq}}\frac 1{\sqrt n}\left[\left(\frac 1p\right)^p\left(\frac 1p\right)^q\right]^n\\ &= \frac 1{\sqrt{2\pi pq}}\frac 1{\sqrt n} 2^{H(p)n} \end{aligned}

因此,(npn)=Θ(1n2H(p)n)\binom n{pn} = \Theta\left(\frac 1{\sqrt n}2^{H(p)n}\right)。

特别的,当 p=12p = \frac 12 时,H(p)=1H(p) = 1,因此

(nn/2)2n∼2πn=Θ(1n)\frac{\binom n{n/2}}{2^n} \sim \sqrt{\frac 2{\pi n}} = \Theta\left(\sqrt{\frac 1n}\right)

也就是说,如果我们抛 nn 枚硬币(nn 是偶数),恰好 n2\frac n2 枚硬币正面朝上的概率,大约会趋近于 2πn=Θ(1n)\sqrt{\frac 2{\pi n}} = \Theta\left(\sqrt{\frac 1n}\right)。