《具体数学》阅读笔记

《具体数学》阅读笔记

1. 常见化简技巧

1.1. 基数变换

形如

f(j)=αj,1jd;f(dn+j)=cf(n)+βj,0jd,n1

的函数 f,我们尝试将参数写成进制的形式,即 n=(bmbm1b1b0)d,则我们可以推出

f(n)=f((bmbm1b1b0)d)=cf((bmbm1b1)d)+βb0=c2f((bmbm1)d)+cβb1+βb0=cmαbm+cm1βbm1++cβb1+βb0=(αbmβbm1βb1βb0)c.

于是我们得到了最终的结论:

(1.1)f((bmbm1b1b0)d)=(αbmβbm1βb1βb0)c.

注意这里的答案对应的 c 进制是广义的,本质上采用的是倒数第二行的计算方式,只是可以简单写成进制的形式。

练习:

已知函数 f 的递归式

f(1)=34;f(2)=5;f(3n)=10f(n)+76,n1;f(3n+1)=10f(n)2,n1;f(3n+2)=10f(n)+8,n1.

f(19) 的值.

根据 (1.1)

f(19)=f((201)3)=(5  76  2)10=1258.

1.2. 待定系数法

形如

f(0)=α;f(n)=f(n1)+βn+γ,n>0.

的函数 f(事实上第二个式子中的后半部分的形式可以是多样的),我们可以猜出其应该与 α,β,γ 有一些关系,于是我们考虑将这些参数对答案的贡献设成函数,即我们认为

(1.2)f(n)=A(n)α+B(n)β+C(n)γ.

接着,我们进行一步创造性的尝试:因为 A(n),B(n),C(n) 应当是固定的,所以我们将 f 视作参数,考虑对于不同的 f 求出成立的 α,β,γ,从而得出 A(n),B(n),C(n) 的关系式。具体来讲,对于一个 n 个参数的递归式,我们一般需要代入 n 个不同的 f

例如对于举出的问题,我们代入 f(n)=1,从而得到

{α=1;β=0;γ=0A(n)=1.

代入 f(n)=n,从而得到

{α=0;β=0;γ=1C(n)=n.

最后代入 f(n)=n2,从而得到

{α=0;β=2;γ=12B(n)C(n)=n2.B(n)=n2+n2.

从而我们得到了最终的结论:

f(n)=α+βn2+n2+γn.

当然脑洞大开一些,你也可以利用基数变换,将对应的内容代入从而得到结果。

练习:

已知函数 f 的递归式

f(1)=5;f(2n)=4f(n)7n3,n1;f(2n+1)=4f(n)+11,n1.

f(23) 的值。

我们可以先尝试将式子化成更一般的形式,即

f(1)=α;f(2n)=4f(n)+β0n+γ0,n1;f(2n+1)=4f(n)+β1n+γ1,n1.

于是我们可以开始考虑待定系数,考虑根据 (1.2)

f(n)=A(n)α+B0(n)β0+B1(n)β1+C0(n)γ0+C1(n)γ1.

这看起来是个大工程,我们先代入 f(n)=n,从而得到

{α=γ1=1;β0=β1=2;γ0=0.A(n)2B0(n)2B1(n)+C1(n)=n.

然后是 f(n)=n2,这会让我们得到

{α=γ1=1;β0=γ0=0;β1=4.A(n)+4B1(n)+C1(n)=n2.

以上这些都并不难得到,然而我们貌似很难得到新的信息了,因为没有一些其他的函数能够给我们额外的信息(或者你可以代入 f(n)=1,你会得到 A(n)3C0(n)3C1(n)=1,可惜这对我们解出整个系数方程组没有帮助)。观察到我们得到的递归式的形式与上面提到的基数变换的形式很像,我们可以代入 f((1bm1b1b0)2)=(αγbm1γb1γb0)4,不难得到

β0=β1=0A(n)α+C0(n)γ0+C1(n)γ1=(αγbm1γb1γb0)4.

看似这个式子毫无作用,这是因为我们在一般形式下难以用确切的数学符号将 A(n),C0(n),C1(n) 表示出来,然而通过这个式子,我们确切的知道这三个函数的值,只需要将其带回到上面的式子就可以解出整个方程组。

对于 n=23=(10111)2,我们推断出

A(23)α+C0(23)γ0+C1(23)γ1=(αγ0γ1γ1γ1)4{A(23)=256;C0(23)=64;C1(23)=21.

我们还有

A(23)+4B1(23)+C1(23)=232B1(23)=63.A(23)2B0(23)2B1(23)+C1(23)=23B0(23)=64.

于是我们得到了

f(23)=256α+64β0+63β1+64γ0+21γ1.

回到我们最初的式子,我们有

{α=5;β0=7;β1=0;γ0=3;γ1=11.f(23)=256×564×764×3+21×11=871.

1.3. 和式和递归式

如果细心一点,应该能够发现形如

f(n)=k=0nw(n)

的函数 f,其等价于

f(0)=w(0);f(n)=f(n1)+w(n),n>0.

从而我们可能利用和式的求和法来完成整个递归式的求解。

1.3.1. 求和因子

对于形如

anf(n)=bnf(n1)+cn

的函数 f,我们想找到一个对应的求和因子 sn,使得 snbn=sn1an1,将两边同乘 sn 后,我们得到

snanf(n)=snbnf(n1)+sncn=sn1an1f(n1)+sncn.

此时令 g(n)=snanf(n),那么有

g(n)=g(n1)+sncn.

从而

g(n)=s0a0f(0)+k=1nskck=s1b1f(0)+k=1nskck.

而原来的递归式的解就是

(1.3.1)f(n)=1snan(s1b1T0+k=1nskck).

然而,我们看起来需要有足够的智慧才能求得 sn。然而我们利用 snbn=sn1an1,将其展开,就可以得到

sn=an1an2a1bnbn1b2.

这个分式的适当的任何常数倍也可以做这些事情,这看起来并不需要我们有一些脑子,然而除数不能为 0,所以只要 an,bn 永远不为 0,求和因子就能一直奏效。

练习:

已知函数 f 的递归式

f(0)=f(1)=0;f(n)=n+1+2nk=0n1f(k),n>1.

求解函数 f 的封闭形式。

看起来函数 f 相对比较复杂,我们想让它呈现上述的形式,我们可以作如下操作。现对两边同时乘 n,得到

nf(n)=n2+n+2k=0n1f(k),n>1.

于是我们去掉了除法,接着我们去掉求和,用 n1 代替 n

(n1)f(n1)=(n1)2+(n1)+2k=0n2f(k),n1>1.

现在可以从第一个式子中减去第二个式子,求和号就消失了:

nf(n)(n1)f(n1)=2n+2f(n1),n>2.

这样一来,我们可以将原来的递归式换成一个简单得多的递归式:

f(0)=f(1)=0,f(2)=3;nf(n)=(n+1)f(n1)+2n,n>2.

从而我们有普通的 an=n,bn=n+1,且

cn=2n2[n=1]+2[n=2].

故我们现在可以采用求和因子法,我们要用

sn=an1an2a1bnbn1b2=(n1)×(n2)××1(n+1)×n××3=2(n+1)n

的某个倍数。从而根据 (1.3.1),我们有

f(n)=n+12k=1n2k(k+1)(2k2[k=1]+2[k=2])=2(n+1)k=1n1k+123(n+1),n>1.

最后出现的式子我们有一个特殊的名称和特别的记号:

Hn=11+12++1n=k=1n1k.

Hn 称为一个调和数。我们可以尝试用 Hn 来继续表示 f(n),这是不难的,因为我们有

k=1n1k+1=k=2n+11k=(k=1n1k)11+1n+1=Hnnn+1.

于是我们得到最终的结论:

f(n)=2(n+1)Hn83n23,n>1.

事实上,上面的函数 f 是快速排序对 n 个数排序时作比较的平均次数。我们用这个式子验证一些小情形不难发现其是正确的:f(2)=3,f(3)=6

1.3.2 扰动法

对于形如

Sn=0knak

的和式,通过将它的最后一项和第一项分离出来,用两种方法重新改写 Sn+1:

Sn+an+1=0kn+1ak=a0+1kn+1ak(1.3.2)=a0+0knak+1.

接下来我们可以对最后那个和式加以处理,并尝试用 Sn 将它表示出来,如果取得成功,我们就得到一个方程,它的解就是我们所求的和式。

练习:

已知和式

Sn=0knk2k.

求解 Sn 的封闭形式。

尝试扰动法,根据 (1.3.2)

Sn+(n+1)2n+1=0kn(k+1)2k+1.

所以我们想用 Sn 表示右边的等式,于是我们借助结合律将它分成两个和式

0knk2k+1+0kn2k+1.

这两个和式中的第一个等于 2Sn。第二个和式是几何级数,大家都知道答案为 2n+22。于是我们有

Sn+(n+1)2n+1=2Sn+2n+22.

通过计算我们得到最终的结论:

Sn=(n1)2n1+2

1.3.3 巧用定律与法则

对于和式来说,我们有定律和法则,具体来说,对于一个有限整数集合 K,我们有

(1.3.3.1)kKcak=ckKak;()(1.3.3.2)kK(ak+bk)=kKak+kKbk;()(1.3.3.3)kKak=p(k)Kap(k).()

尽管现在给出的定义与其他地方的定义不甚相同,但我们就暂且这么用下去。这里的 p(k) 是所有整数集合的任意一个排列,然而我们可以将排列限制稍微放松一点:我们只要求当 nK 时,恰有一个 k 满足 p(k)=n;否则,不管 p(k)=n 以怎样的频率出现都无关紧要。

艾弗森括号是一个伟大的思想。这一思想通过把一个命题放在括号中,如果命题为真,其结果是 1,否则为 0。并且我们还有约定,当命题为假时,我们认为 [P(k)] 必然为 0,即使对无意义的 ak 来说,ak[P(k)] 依旧等于 0,这个约定能够帮助我们规避许多困难。并且结合上面的定律,我们貌似还有一些其他的公式:

(1.3.3.4)P(k)ak=kak[P(k)].

毫无疑问的,这个公式可以拓展到二个变量,甚至到 n 个变量。结合上方的交换律,我们可以简单推得,如果对于命题 P1(k),P2(k),P3(k),P4(k),满足 [P1(k)]+[P2(k)]=[P3(k)]+[P4(k)],那么我们显然有

(1.3.3.5)P1(k)ak+P2(k)ak=P3(k)ak+P4(k)ak.

有一些常用的例子,比如通过

[kK]+[kK]=[kKK]+[kKK]

我们能够写成

kKak+kKak=kKKak+kKKak

的形式。仔细回忆扰动法的公式 (1.3.2),不难看出扰动法利用了这一法则。

接着我们说多重和式。对于多重和式来说,即形如

j,kaj,k=jkaj,k

的和式,其就是

j(kaj,k)

的缩写,也就是说,多重和式的运算顺序是从右到左(从内向外)的。在这一方面,我们有一个交换求和次序的基本法则,它推广了我们的结合律 (1.3.3.2)

(1.3.3.6)jkaj,k[P(j,k)]=P(j,k)aj,k=kjaj,k[P(j,k)].

中间的这一项是对两个指标求和的和式。在左边,jk 表示我们先对 k 求和,然后对 j 求和。而在右边,kj 表示我们先对 j 求和,再对 k 求和。事实上,当我们想用封闭形式计算出一个二重和式时,通常先对一个指标求和会比先对另一个指标求和更容易些,所以我们要选择更加方便的求和顺序。

同时利用二重和式,我们可以将分配律 (1.3.3.1) 推广到一般分配律

(1.3.3.7)jJ,kKajbk=(jJaj)(kKbk).

然后我们回过头来,对于交换求和次序的基本法则再次进行一些变形,具体的我们可以将它分为简易型和复杂型。

(1.3.3.8)jJkKaj,k=jJ,kKaj,k=kKjJaj,k;()(1.3.3.9)jJkK(j)aj,k=kKjJ(k)aj,k.()

事实上,简易型恰好是 (1.3.3.5) 的另一种写法,因为艾弗森的 [jJ,kK] 分解成了 [jJ][kK],这适用于 j,k 的范围互相无关时使用。

而复杂型相应的更有技巧一些,它适用于内和的范围与外和的指标变量有关的情形。并且式子中的 J,K(j),K,J(k) 必须以下面的方式相关联:

[jJ][kK(j)]=[kK][jJ(k)].

原则上,这样的因子总是可能的:我们可以令 J=K 是全体整数的集合,而 K(j),J(k) 是用来操控二重和式性质 P(j,k) 的集合。尽管如此,我们依然有一些重要的特殊情形,在其中 J,K(j),K,J(k) 都有简单的形式,它们频繁出现在应用中。例如

[1jn][jkn]=[1jkn]=[1kn][1jk]

就是一个很好的分解,这允许我们写成

j=1nk=jnaj,k=1jknaj,k=k=1nj=1kaj,k

的形式。

posted @   DycIsMyName  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示