• 数学知识:和式的处理及二项式系数的运用


    数学知识:和式的处理及二项式系数的运用

    这段时间看了一部分《具体数学》上的内容,正如第一章中所说,这本书的主要目的是:

    说明不具备超人洞察力的人如何求解问题

    也就是说,这本书主要讲述的是“那些本应该被讲授的硬数学技巧”。或者说是一种数学领域的通用技术,这也是“具体数学”名称的来源。

    一、 和式

    记号


    与平时所用的nk=1记号不同,这本书建议使用更加方便的形如1kn的记号,这可以使你在变量替换时不容易出错。

    一个特殊的地方是逻辑判断深入和式:用方括号包含的逻辑命题,如果为真则为1,如果为假则为0。这对于(cpp)程序编写是非常友好的。

    运算律


    和式满足下面三种基本运算律:

    1. 分配律(提公因式):
      kKcak=ckKak
    2. 结合律(和式的合并):
      kK(ak+bk)=kKak+kKbk
    3. 交换律(变量替换):

      kKak=p(k)Kap(k)

      p(k)为一个置换


    多重和式具有一些特殊的性质,例如:

    1. 合并和分离:
      1inijnai,j=1ijnai,j
    2. 交换求和顺序:
      1inijnai,j=1jn1ijai,j
    3. 一般分配律:
      jJ,kKajbk=jJaj(kKbk)

    这些性质虽然是显然的,但将在处理时带来巨大的方便。第二条有助于化简和式,第三条则可以在一些“求乘积的和”的计算时减小计算量。

    一般技术


    1. 猜测+归纳法

    虽然名字不是很好听,但这在OI中是一种实用的策略。因为计算机暴力处理的速度是很快的,如果规律明显,往往可以一眼看出。而归纳证明就非常简单了。

    2. 扰动法

    扰动法的动机是在和式中加入一项,并用一个新和式表达之,从而解方程得出通解。用两个例子来解释这种方法:

    (一): 几何级数

    Sn=0knak

    的封闭形式。

    用扰动法加入一项:

    Sn+an+1=1+0knak+1=1+aSn

    解方程可以得出 Sn=an+11a1。对这个公式两边微分可以得到一个有用的公式:

    1knkak1=1(n+1)xn+nxn+1(1x)2

    |a|<1时可以收敛成:

    1knkak1=1(1a)2

    (二): 平方和公式

    考虑求

    Sn=1knk2

    的封闭形式。

    如果仍然用刚才的思路,我们会发现Sn在两边抵消了。但如果我们用三次方和Vn进行扰动:

    Vn+(n+1)3=0kn(k+1)3=0knk3+30knk2+30knk+0kn1=Vn+3Sn+3n(n+1)2+n+1

    两边的Vn可以抵消,我们解出了Sn。即:

    Sn=n(n+1)(2n+1)6

    3. 待定系数法

    如果已知解的形式,我们可以用待定系数法得到原和式的封闭形式。例如:

    1knk3

    先验知识告诉我们答案是一个4次多项式。我们只要代入n=0,1,2,3建立关于一般四次多项式的4个方程即可求解。事实上,如果用拉格朗日插值法或高阶差分法,可以在O(n2)的时间内完成,是非常高效的。

    4. 有限微积分

    下一部分详细介绍。

    有限微积分

    基本定义


    有限微积分是离散数学对于微积分的回应,这种技术给出了求解和式的“不需要思考”的系统方法。考虑熟悉的微分算子的定义:

    Df(n)=limh0f(n+h)f(n)h

    而离散中的“极限”就是1,自然地定义差分算子:

    Δf(n)=f(n+1)f(n)

    “算子(operator)”这个新概念是作用在函数上的运算,他给出了一个新函数。

    简单的公式


    微积分之所以方便是因为它有形如:

    D(xm)=mxm1

    这样的优美公式,同样,有限微积分也有对应的优美的公式:

    Δ(xm)=mxm1

    其中:xm=x(x1)(x2)(xm+1)(m个),被称为下降阶乘幂。由于可以证明任何的xk都在O(k2)内可以写成阶乘幂的和(具体方法为从高到低贪心的取),因此他的能力十分强大。

    求和——离散的“积分”


    微积分中可以用微分算子定义不定积分,也就是:

    g(x)dx=f(x)+Cg(x)=Df(x)

    我们用同样的方式定义不定和式:

    g(x)δx=f(x)+Cg(x)=Δf(x)

    微积分基本定理指出:

    bag(x)dx=f(b)f(a)

    同样有有限微积分基本定理:

    Σbag(x)δx=f(b)f(a)

    但这些记号的直观意义是什么呢?不难证明:

    Σbag(x)δx=ai<bg(i),ba

    这是最有用的定理之一(如果之前学习过数列差分这几乎是显然的)。我们正要用他解决序列求和的问题。

    负指数下降阶乘幂


    通过类比可以定义负指数下降阶乘幂:

    xm=1(x+1)(x+2)(x+m),m>0

    可以证明仍然满足差分公式。而且这使得下降幂拥有了良好的性质:

    xm+n=xm(xm)n

    重新发现平方和公式


    这次我们用新的武器来重新发现这个公式:

    Sn=Σn+10x2δx

    用下降阶乘幂x2=x2+x1,用线性性质:

    Sn=Σn+10x2δx+Σn+10x1δx

    两边的不定和式分别是:

    x2δx=13x3

    x1δx=12x2

    那么原和式就变成:

    Sn=13(n+1)3+12(n+1)2

    展开和上面的公式完全相同。(但在具体应用中我们不必展开,因为阶乘幂也可以用类似霍纳法则的方法将求值降到O(n)。)

    乘法公式和分部求和公式


    微积分中的链式法则在有限微积分中很难推广,唯一的一个是:

    fm(n)=mfm1(n)

    f(x)是任一函数。但这显然不能满足我们的要求,一个更强大的是乘法公式,即:

    Δ(uv)=uΔv+EvΔu

    其中Ef(x)=f(x+1),被称为移位算子。(有趣的是:Δ=E1)。

    证明十分简单,只要从定义出发就可以。我们看一些应用:

    练习: 利用乘法公式求ΔkHk,其中Hk是前k个调合数的和。

    容易发现:

    ΔkHk=kΔHk+Hk+1Δk=kk+1+Hk+1

    和从定义出发得到了相同的结果。


    这个公式真正有用的地方是推出了广为称道的“分部求和法”,求公式两边求不定和式并整理得到:

    uΔv=uvEvΔu

    这个公式大大拓展了求和的范围。对于两个式子的乘积,先求一个的不定和式,再用公式展开求另一个(特别是负指数阶乘幂时不定和式会降低幂次)。用一个例子来解释:

    例题

    f(n)=0k<nHk(k+1)(k+2)

    的封闭形式。

    利用裂项转化:

    f(n)=0k<nHk(1k+11k+2)

    注意到(Δ2表示二阶差分,正如D2表示二阶导数):

    Δ2(Hk)=1k+11k+2

    则只要求不定和式

    HkΔ2(Hk)

    利用分部求和公式:

    (HkΔHkΔ(Hk+1)Δ(Hk))

    化简后得到

    (Hkk+11(k+1)(k+2))

    用阶乘幂表示并化简

    Hk+1k+1

    根据有限微积分基本定理:

    f(n)=g(n)g(0)=kHkk+1

    在后面对二项式恒等式的处理中,也可以看到有限微积分的强大威力。

    二、 二项恒等式

    基本定义


    二项式系数是最常用的组合数,(nk)表示从n个物品中取出k个的方案数。他的代数定义则更加直接:

    (rk)=rkk!

    特别指出,如果k<0,有(rk)=0

    二项恒等式


    下面是十个最重要的二项恒等式。

    1. 展开式:
      (nk)=n!k!(nk)!
    2. 对称恒等式:
      (nk)=(nnk)
    3. 吸收/提取恒等式:
      (rk)=rk(r1k1),k0
    4. 归纳恒等式:
      (rk)=(r1k)+(r1k1)
    5. 上指标反转:
      (rk)=(1)k(kr1k)
    6. 三项式版恒等式:
      (rm)(mk)=(rk)(rkmk)
    7. 二项式定理:
      (x+y)n=0kn(nk)xkynk
    8. 平行求和法:
      kn(r+kk)=(r+n+1n)
    9. 上指标求和:
      kn(km)=(n+1m+1),m,n0
    10. 范德蒙德卷积公式
      k(rk)(snk)=(r+sn)

    有限微积分证明二项恒等式

    如果我们发现了一个不是很好处理的二项式,却又恰巧忘记了对应的恒等式,那么处理就变的棘手了。幸而我们有有限微积分的强大武器。

    例题

    不用归纳法,证明上指标求和法:

    0kn(km)=(n+1m+1)()

    解:设f(x)=(km)δk,有

    ()=f(n+1)f(0)

    而根据有限微积分:

    (km)δk=kmm!δk=1m!1m+1km+1=1(m+1)!km+1=(km+1)

    ()=f(n+1)f(0)=(n+1m+1)

    一个陷阱: 和微积分一样,要注意常量和变量的区别,否则将得出错误的答案。

    利用标准技术求解惊悚的和式


    例题:

    这是一个实际问题:求

    S=0knk(mk1mn1)

    的封闭形式。

    解:考虑两个东西乘积的和,首先考虑用吸收恒等式将其合并,而方法就是凑出上指标。不难发现:

    S=0kn(m(mk))(mk1mn1)

    展开并整理,得到:

    S=0knm(mk1mn1)0kn(mk)(mk1mn1)

    前后分别处理,第一个和式考虑用上指标求和,替换枚举变量kmk1以便在上面得到简单的形式:

    u=m0mk1n(kmn1)

    化简得到:

    u=mmn1km1(kmn1)

    这次可以动用上指标求和法:

    u=m(mmn)

    这时在考虑第二部分,用吸收恒等式化简之,得到:

    v=(mn)0kn(mkmn)

    仍然仿照上面的处理,得到:

    v=(mn)(m+1mn+1)=(mn)(m+1)mn+1(mmn)

    S=uv=m(mn+1)(mn)(m+1)mn+1(mmn)=nmn+1(mn)

    二项式反演


    有时候一个问题是难于求解的,但其容斥的结果是便于求解的,也就是说,待求解的函数g(n)和一个简单的函数f(n)构成:

    f(n)=0kn(1)k(nk)g(k)

    的关系,就可以用解方程的手段在O(n3)求得g(n)。但反演定理允许我们在O(n)的时间内解决这一问题(不包含预处理组合数),即:

    g(n)=0kn(1)k(nk)f(k)

    这个公式前后完全对称,既具有美感又便于记忆。下面我们考虑用已有的知识证明之。

    证明反演定理

    注意:在证明中我们更关心细节和过程,以便在遇到更复杂的问题时尽快找到突破口。

    f(n)=0kn(1)k(nk)g(k)g(n)=0kn(1)k(nk)f(k)

    由于定理左右对称,只需要证明即可。根据定义,右边=

    0in(1)i(ni)0ji(1)j(ij)g(j)

    整理:

    0in0ij(1)i+j(ni)(ij)g(j)

    我们不希望一个未知的g(n)深入在和式中,而希望将他提出内层和式,从而用已有知识处理后面的部分,运用三项式版恒等式,并交换求和次序,提公因式后得到:

    0jn(nj)g(j)jin(1)i+j(njij)()

    这时后面的部分就独立出来了,我们只需要处理后半部分。我们希望二项式下边尽可能简单,以便使用平行求和法。替换循环变量iij,并化简后得到:

    0inj(1)i+2j(nji)

    为了处理讨厌的(1)i+2j,应该提出一个(1)i来消去之,对内部翻转上指标:

    0inj(1)2i+2j(i(nj)1i)

    整理得到:

    0inj(i+(n+j1)i)

    终于发现了熟悉的平行求和法的形式,这一项的结果可以立即书写出,就是:

    (jn)=[j=n]

    即当且仅当j=n时,该式为1,则原式:

    ()=0jn(nj)g(j)[j=n]=g(n)

    因此原命题成立。

    错排公式——二项式反演的应用


    考虑一个问题:n个人将帽子高高扔起,并捡起一个帽子,问每个人都不拿到自己帽子的情况有多少种。

    这个问题等价于问不存在长度为1的循环的置换总数的计数。一种方便的解决方案是:设f(n)n个帽子的情况总数,则有递推式:

    f(n)=(n1)(f(n1)+f(n2))

    这个递推式很容易找到一个组合解释,但这不在本文讨论的范畴。现在我们要用二项式反演的技术来解决这个问题,设f(n)n排列的总数,显然为f(n)=n!;设g(n)n错排公式。记K(i)“至少有i个错排的排列方案数”,则根据定义有

    K(i)=(ni)g(i)×(ni)!

    由于“至少有n个”被“至少有n1个”真包含,因此要用容斥原理。“至少有0个”包含一切,之后符号交替出现,即:

    f(n)=0kn(1)kK(k)

    整理后也就是:

    f(n)=0kn(1)k(nk)g(k)(ni)!

    这可以用反演定理变化为:

    g(n)(nn)!=0kn(1)k(nk)f(k)

    也就是:

    g(n)=0kn(1)k(nk)k!

    经过检验,这个方程和上面的递推式在初始的几项有相同的结果。我们大概可以相信获得了一个正确的答案。

    高阶差分法


    当我们已经知道一个数列符合一个多项式,或者组合数时,如何快速求出数列的通项公式?一个方法是所谓“拉格朗日插值法”,但我们也可以用有限微积分和组合数的武器解决。回忆分析中的泰勒级数:

    g(a+x)=k0Dkg(a)k!xk

    应该可以想到有限微积分也有类似的公式“牛顿级数”,形式和泰勒级数相同:

    g(a+x)=k0Δkg(a)k!xk

    为了便于计算取a=0,根据组合数的定义也就是:

    g(x)=k0Δkg(0)(xk)

    还记得物理必修一中的“逐差法”测加速度吗?其深层次的数学原理就在于此。用一个小情景来验证这个定理:

    y=f(x)=x3+2x2+x+4

    取值如下表所示:

    x 0 1 2 3 4 5 6
    y = f(x) 4 8 22 52 104 184 298

    Δ0f(0)=4Δ1f(0)=4Δ2f(0)=10Δ3f(0)=6Δ4f(0)=0

    根据公式:

    f(x)=4(x0)+4(x1)+10(x2)+6(x3)=x3+2x2+x+4

    这个方法的一个好处是:一旦通过O(n2)的时间知道了组合数前的系数,由于同一行的组合数可以根据下式线性递推求得,可以在O(n)时间内求出f(x)的值。

    (nm)=(n1m)+(n1m1)=m+1n(nm+1)+mn(nm)

    即:

    (nm)=m+1nm(nm+1)

    生成函数


    在多项式系数中蕴含组合性质是有理由的,因为“多项式乘法”由于二项式定理被赋予了组合性质。更重要的是,两个n次多项式相乘只需要O(nlgn)的时间复杂度。正式的,一个数列a0,a1,a2,的生成函数A(x)为:

    A(x)=k0akxk

    生成函数的简单运用可以分为:

    1. 利用运算证明恒等式
    2. 利用封闭形式求解组合问题
    3. 利用多项式乘法(卷积)处理组合问题

    证明恒等式

    考虑之前的范德蒙德卷积公式:

    k(rk)(snk)=(r+sn)

    每当出现k,nkk,kn出现时要考虑卷积。

    考虑(1+x)r(1+x)s所表达的生成函数:

    0kr(rk)xk0ks(sk)xk

    两式分别相乘,取次数为n的系数,得到:

    k(rk)(snk)=(r+sn)

    就是原来的公式。

    利用封闭形式解决问题


    如果一个生成函数可以被表示成封闭形式,那当然可以为我们解决许多问题。考虑数列1,1,1,1,的生成函数,设其为T,满足:

    T=1+xT

    解得:T=11x

    而数列1,2,3,4,5,,可以通过这个公式两边求导并得到,就是:

    k0kxk1=1(1x)2

    另一个常用的数列1,1,1,1,1,1,,他的生成函数是:

    T=1xT

    解得T=11+x

    考虑只包含n的倍数的数列的生成函数,即

    k0[k=np,pn]xk

    容易发现

    T=1+xnT

    解得:T=11xn

    如果一个数列为二项式系数的一行,即(n0),(n1),(n2),根据二项式定理,其生成函数为:(1+x)n

    封闭形式的乘积恰好表示了所代表序列的卷积,这是个很好的性质,有时候将帮助我们寻找问题的答案。仍然用那个经典的例题做解释:

    例题: 我们要从苹果、香蕉、橘子和梨中拿一些水果出来,要求苹果只能拿偶数个,香蕉的个数要是5的倍数,橘子最多拿4个,梨要么不拿,要么只能拿一个。问按这样的要求拿n个水果的方案数。

    解:分别用生成函数表示所有情景:

    1+x2+x4+=11x21+x5+x10+=11x51+x+x2+x3+x4=1x51x1+x

    将他们全部乘起来,得到:

    1+x1xx2+x3

    由于我们坚信出题人是仁慈的,这个分式一定可以化简。用长除法可以得出:

    1(1x)2=1+2x+3x3+

    这样答案就有了,取n个的方案是n+1

    完了

    参(zhao)考(ban)资(lai)料(yuan)

    • 《具体数学》
    • 《组合数学》
  • 相关阅读:
    Andrew Ng
    Matlab 常用语法速记 1
    jQuery 中的常用函数
    JS 删除数组中指定的某个元素的方法
    layer 插件 在子页面关闭自身的方法
    U方法
    读取配置和动态配置(C方法)
    TP框架控制器和对应方法创建
    ThinkPHP基础(1)
    利用ThinkPHP做项目步骤
  • 原文地址:https://www.cnblogs.com/ljt12138/p/6684326.html
Copyright © 2020-2023  润新知