• 线性插值


    感觉我正在日益沦为一个搬运工...

    线性插值是指这样一个问题:给定整数(n,m),以及一个(n)次多项式(f)(0,1,2,dots,n-1)处的点值,即(f(0),f(1),f(2),dots,f(n-1)),希望能在关于(n)线性时间内求出(f(m))(nleq 10^6,mleq 10^{18})

    利用多项式多点插值并求一次点值可以做到(O(nlog^2n)),但显然是过不去的。

    我们考虑多项式(f)的牛顿级数,设其为(c),即:

    [sum_{i=0}^{n-1}f_ix^i=sum_{i=0}^{n-1}c_i{xchoose i} ]

    那么对于(m=0,1,2,dots,n-1),显然有:

    [f(m)=sum_{i=0}^{n-1}c_i{mchoose i} ]

    注意到当(igeq m)({mchoose i})(0),于是修改求和上限:

    [f(m)=sum_{i=0}^mc_i{mchoose i} ]

    这就是经典的二项式反演的形式,于是我们就得到:

    [c_i=sum_{j=0}^i(-1)^{i-j}{ichoose j}f(j) ]

    进回带到求和上限为(n-1)的式中,于是有:

    [f(m)=sum_{i=0}^{n-1}Bigg({mchoose i}sum_{j=0}^i(-1)^{i-j}{ichoose j}f(j)Bigg) ]

    套路一波,将对(j)的求和放到外面:

    [f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=j}^{n-1}(-1)^{i-j}{mchoose i}{ichoose j}Bigg) ]

    为了直观,我们用(i)替换(i-j)

    [f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=0}^{n-1-j}(-1)^i{mchoose i+j}{i+jchoose j}Bigg) ]

    利用({mchoose i+j}{i+jchoose j}={mchoose j}{m-jchoose i})进行替换,得到:

    [f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=0}^{n-1-j}(-1)^i{mchoose j}{m-jchoose i}Bigg) ]

    于是({mchoose j})可以放到前面:

    [f(m)=sum_{j=0}^{n-1}Bigg(f(j){mchoose j}sum_{i=0}^{n-1-j}(-1)^i{m-jchoose i}Bigg) ]

    现在考虑求出下面的式子的封闭形式:

    [sum_{i=0}^{n-1}(-1)^i{mchoose i} ]

    首先是应用上指标反转使((-1)^i{mchoose i}={i-m-1choose i})

    [sum_{i=0}^{n-1}{i-m-1choose i} ]

    考虑加入一个数({-m-1choose -1}=0)

    [{-m-1choose -1}+sum_{i=0}^{n-1}{i-m-1choose i} ]

    裂项:

    [{-m-1choose -1}+{-m-1choose 0}+sum_{i=1}^{n-1}{i-m-1choose i} ]

    [{-mchoose 0}+sum_{i=1}^{n-1}{i-m-1choose i} ]

    一直重复,直到只剩下:

    [{n-m-1choose n-1} ]

    再进行上指标反转:

    [(-1)^{n-1}{m-1choose n-1} ]

    于是原式终于可以简化为:

    [f(m)=sum_{j=0}^{n-1}Bigg(f(j){mchoose j}(-1)^{n-1-j}{m-1-jchoose n-1-j}Bigg) ]

    整理,得:

    [f(m)=sum_{i=0}^{n-1}(-1)^{n-1-i}{mchoose i}{m-1-ichoose n-1-i}f(i) ]

    用阶乘展开组合数:

    [f(m)=sum_{i=0}^{n-1}(-1)^{n-1-i}frac{m!}{i!(m-i)!}frac{(m-1-i)!}{(n-1-i)!(m-n)!} f(i) ]

    继续整理:

    [f(m)=m^{underline n}sum_{i=0}^{n-1}frac{(-1)^{n-1-i}}{(m-i)i!(n-1-i)!}f(i) ]

    于是就可以做了,(m-i)的逆元可以用与预处理阶乘逆元的类似方法做到线性。总复杂度是(O(n))

    ( m upd):被打脸了...其实直接用拉格朗日插值公式即可推出和上面一样的东西...所以这篇文章只是想说数学真奇妙。

  • 相关阅读:
    DEVMODE 结构体
    VS2019如何将主菜单从标题栏移到单独一行
    最近学到的东西
    线上问题处理相关思考
    mybatis+spring
    jenkins
    自动化case校验点
    Sqlserver大数据迁移,导出-》导入(BULK INSERT)
    阿里P7大佬带你解密Sentinel
    《高可用系列》-限流神器Sentinel,不了解一下吗?
  • 原文地址:https://www.cnblogs.com/Mr-Spade/p/10043561.html
Copyright © 2020-2023  润新知