• 拉格朗日插值法


    拉格朗日插值法

    问题引入:

    有一个(n+1)项的多项式(f(x)),给出(n+1)个点((x_i,y_i)),求这个多项式。

    解答

    这里我们直接给出问题的答案:

    [f(x)=sum_{i=0}^ny_iprod_{j e i}frac{x-x_j}{x_i-x_j} ]

    考虑我们带入(x_k),可得:

    [f(x_k)=sum_{i=0}^ny_iprod_{j e i}frac{x_k-x_j}{x_i-x_j} ]

    注意到(i e k)的项分子一定有一项为(0),所以:

    [f(x_k)=y_kprod_{j e k}frac{x_k-x_j}{x_k-x_j}=y_k ]

    发现这个多项式是满足条件的,证毕。

    至此,我们可以在(O(n^2))的时间内求出(f(x))

    但是注意到上面如果要这个多项式的每个系数,复杂度为(O(n^3)),这显然是不能接受的,我们考虑如何降低复杂度。

    我们设拉格朗日基本多项式(l(x))

    [l(x)=prod_{i=1}^{n}(x-x_i) ]

    (l(x))显然可以在(O(n^2))的时间算出来。

    那么我们可以把(f(x))改写一下:

    [f(x)=sum_{i=1}^{n}left(yprod_{j e i}frac{1}{x_i-x_j} ight)frac{l(x)}{x-x_i} ]

    注意到后面多项式除法分母只有两项,我们可以模拟长除法做到(O(n)),前面复杂度也是(O(n)),总复杂度(O(n^2))


    (x_ i)连续时的情况

    同样我们把式子抄过来:

    [f(x)=sum_{i=0}^ny_iprod_{j e i}frac{x-x_j}{x_i-x_j} ]

    可以发现分子可以用前缀积来表示,设:

    [pre_i=prod_{j=0}^i(x-x_j),suf_i=prod_{j=i}^n(x-x_j) ]

    由于(x_i)连续,分母可以写成阶乘的形式,式子变成:

    [f(x)=sum_{i=0}^ny_ifrac{pre_{i-1}cdot suf_{i+1}}{(-1)^{n-i}i!(n-i)!} ]

    至此,我们可以在(O(k))的时间内算出任意一项。


    那么我们可以很方便(O(k))的算出(sum_{i=1}^ni^k),可以比较容易的证明,这是一个(k+1)次的多项式,所以直接插值就好了。

    其中(iin [0,k+1])的取值我们可以线筛然后前缀和,对于每个素数我们暴力的快速幂,由于素数密度,这部分的复杂度是(O(dfrac{k}{ln k} cdot log k)=O(k))

    习题

    [underline{widehat{dbinom{odot_veeodot}{{ aise-8pt"}wr{ aise-8pt"}}}} ]

  • 相关阅读:
    Python(1)-第一天
    读书笔记-单元测试艺术(三)-使用桩对象解除依赖
    Sql2008调试问题
    读书笔记-单元测试艺术(二)-单元测试框架
    读书笔记-单元测试艺术(一)-单元测试的基本知识
    最长回文子串
    最大连续子序列之和,最大连续子序列乘积
    计数排序与位图排序
    筛选法求素数
    传说中的华为面试题(8分钟写出代码)
  • 原文地址:https://www.cnblogs.com/hbyer/p/10583970.html
Copyright © 2020-2023  润新知