(n) 次多项式定义为 :(f(x) = a_nx^n + a_{n-1}x^{n-1} + a_{n-2}x^{n-2} + cdots + a_0)。
给出 (n + 1) 个点 ((x_i, y_i)),表示 (f(x_i)=y_i),要求求出 (f(t))。
做法 1:
高斯消元。
我们把这 (n + 1) 个点都写出来:
我们把 (a_n, a_{n-1}, cdots, a_0) 看作未知量,把 (x,y) 看作已知量,这样就可以高斯消元进行求解,解出 (a_n,a_{n-1},cdots,a_0)。
时间复杂度:(O(n^3))。
做法 2:
拉格朗日插值。
我们从二次多次项入手,我们给出 (3) 个点,((x_1, y_1), (x_2, y_2), (x_3,y_3))。
可以列出方程组:
可以使用高斯消元来做,这里我们换一种思路,我们构造三个二次函数,然后相加得到我们要的函数。
构造函数
那么当 (f(x)=y_1f_1(x)+y_2f_2(x)+y_3f_3(x)),此时就满足 (x) 的取值为 (x_1,x_2,x_3) 时,(f(x)) 的取值就为 (y_1,y_2,y_3)。
现在考虑 (n) 次多项式,给出 (n + 1) 个点:((x_1, y_1), (x_2, y_2),cdots,(x_{n + 1}, y_{n + 1}))。
我们考虑构造 (f_1 sim f_{n+1})。
设 (f_i(k)=prodlimits_{j=1,j ot=i}^{n+1}dfrac{k-x_j}{x_i-x_j}),(f_i(k)) 满足在 (k=x_i) 时函数值为 (1),在 (k=x_j(j ot= i)) 时函数值为 (0)。
那么多项式 (f(k)=sumlimits_{i=1}^{n+1}y_if_i(k)=sumlimits_{i=1}^{n+1}y_iprodlimits_{j=0,j ot=i}^ndfrac{k-x_j}{x_i-x_j}) 就满足当 (k) 为 (x_1, x_2, cdots, x_{n+1}) 时 (f(k)) 的取值就为 (y_1, y_2, cdots, y_{n + 1})。
如果我们只要求解特定函数值,我们可以使用逆元来代替除法。
时间复杂度:(O(n^2))。
当 (x_a) 与 (a) 有关系时,例如 (x_a=a) 时,可以使用前缀乘来优化,时间复杂度:(O(n))。