插值
标签(空格分隔): 插值 数学 笔记
概述
已知平面上\(n+1\)点,求过这\(n+1\)个点的唯一\(n\)次多项式
有一个朴素算法用待定系数法,高斯消元\(O(n^3)\)
拉格朗日插值
通式
对\(n\)次多项式
构造\(n+1\)个拉格朗日多项式\(\delta_i(x)=\prod_{t\ne i}\frac{x-x_t}{x_i-x_t}\)
则\(\delta_i(x_j)=[i=j]\)有\(\displaystyle{\sum{\varrho_i(x)y_i}}\)
可代入验证
和\(CRT\)构造有异曲同工之妙
实现
构造\(\delta(x)=\prod{(x-x_t)}\)
则\(\delta_i(x)=\frac{\delta(x)}{(x-x_i)}\prod_{t\ne i}\frac{1}{x_i-x_t}\)
\(O(n^2)\)即可
若只要求值不要系数也可以\(O(n^2)\)
线性插值
满足
- 给出的点横坐标差为定值
- 只要求求出特殊点的值并非系数
时拉格朗日插值存在\(O(n)\)的算法
具体实现以\(x_i=i\)
维护数列\(pre_i=\prod\limits_{j=0}^i (x_0-j)\)
与\(suf_i=\prod\limits_{j=i+1}^n (x_i-j)\)
对\(\sigma_i=\frac{A}{B}\)
则分子\(A=pre_{i-1}*suf_{i+1}\)
分母\(B=i(i-1)\cdots(2)(1)(-1)(-2)\cdots(i-n)=(-1)^{n-i}i!(n-i)!\)
维护阶乘逆元即可
int lagrange(re int y[],re int x){ re int i,up,down,res=0;if(x<=m+1)return g[x]; pre[0]=x;for(i=1;i<=m;++i)pre[i]=1ll*pre[i-1]*(x-i)%mod; suf[m]=x-m;for(i=m-1;~i;--i)suf[i]=1ll*suf[i+1]*(x-i)%mod; for(i=0;i<=m;++i){ up=1ll*(i?pre[i-1]:1)*(i^m?suf[i+1]:1)%mod*y[i]%mod,down=((m-i)&1?-1ll:1ll)*inv[i]%mod*inv[m-i]%mod; res=(res+1ll*up*down)%mod; } return (res+mod)%mod; }
例题
\(\mathtt{BSOJ5251}\):裸的模板用两种方法都来一次
\(\mathtt{BSOJ5239}\):求\(f(n)=\sum_{i=1}^n i^k\)
首先通过阿贝尔求和定理可知\(f\)是一个\(k+1\)次多项式
因此需要\(k+2\)个点,取\(x_i=i(i\in[0,k+2))\)即可,注意这一步使用批量求次幂方法
即线性筛过程中,素数直接快速幂\(T(n)=O(|P|)*O(\log n)=O(n)\),其余用最小素因子更新,不然会超时
\(\mathtt{BSOJ1522}\):设\(f(n)=\sum_{i=1}^n i^k,g(n)=\sum_{i=1}^n f(i)\)求\(h(n)=\sum_{i=1}^n g(a+id)\)
k考虑\(f\)是\(k+1\)次多项式,则\(g\)是\(k+2\)次多项式,\(a+id\)是一次的,因此\(h\)也是\(k+2\)次多项式
直接算\(g\)的前\(k+3\)项,然后一项一项插回去即可
\(\mathtt{BSOJ4752}\):求\(f_d(n)=\sum\limits_{i=1}^n[(i,n)=1]i^d\)
可以轻易反演如下
\(f_d(n)=\sum_{p|n}\mu(d)p^d\sum\limits_{i=1}^{\frac{n}{p}}i^d\)
与之前的反演不同的是后面的一坨不是积性函数
设\(S(x)=\sum\limits_{i=1}^x i^k\)插值后\(S(x)=\sum\limits a_ix^i\)
$LHS=\sum_{p+n}\mu(d)p^d\sum\limits_i a_i(\frac{n}{p})^i
\=\sum_{i}a_i\sum_{p|n}\mu(p)p^d (\frac{n}{p})^i$
设\(g_i(n)=\sum_{p|n}\mu(p)p^d (\frac{n}{p})^i\)这是个积性函数
题目给的比较特殊,大概意思是给出\(n\)的素因子及次数
考虑\[\begin{aligned}
g_i(p^q) &=\sum _{j=0}^q \mu(p^j)p^{jd}(\frac{p^q}{p^j})i
= \left\{\begin{aligned} p^{qi},j=0\\-p^{qi+d-i},j=1\\ 0, otherwise\end{aligned} \right.
\end{aligned}\]
\(\therefore \begin{aligned} g_i(p^q) =p^{qi}-p^{qi+d-i} \end{aligned}\)
乘起来即可
这道题套路:多项式不是积性函数就拆成单项式
牛顿插值
牛顿级数公式
实质是离散的麦克劳林公式(泰勒展开)
\(f(x)=\displaystyle{\sum\Delta^if(0)\binom{x}{i}}\)
举个例子
对一个函数差分如下
\(\Delta^0~1~3~7~13~21\)
\(\Delta^1~~~~~2~4~6~8\)
\(\Delta^2~~~~~~2~2~2\)
\(\Delta^3~~~~~~~~0~0\)
\(\Delta^4~~~~~~~~~~0\)
则\(f(x)=1\binom{n}{0}+2\binom{n}{1}+2\binom{n}{2}+0\binom{n}{4}+0\binom{n}{5}\)
运用
动态插值,人力插值
卷积形式
对高阶差分直接展开
\(\Delta ^nf(0)=\sum\binom{n}{i}(-1)^{n-i}f(i)\)
事实上是一个卷积
\(\Delta ^nf'=f'*e^{-x}\)
还可以二项式反演
\(f(i)=\sum\binom{n}{i}\Delta^if(0)\)
也是一个卷积
\(f'=\Delta ^nf'*e^x\)
同样是一个卷积
(这里没有同除一个阶乘)
线性插值
例题
\(\mathtt{BSOJ3905}\):见之前的笔记
\(\mathtt{BSOJ5424}\):求\(\sum\limits_{k=0}^n f(k)\binom{n}{k}x^k(1-x)^{n-k}\)
优雅在用牛顿插值使得式子可以转成二项式反演形式
来源:https://www.cnblogs.com/66t6/p/12275165.html