Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
lagrange2.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3//ラグランジュ補間
4//n+1個の点(xi,yi)を通るn次多項式の係数を返す/O(n^2)
5template<typename T>
6vector<T>lagrangePolynomial(vector<T>x,vector<T>y){
7 int n=x.size()-1;
8 for(int i=0;i<=n;i++){
9 T t=1;
10 for(int j=0;j<=n;j++){
11 if(i!=j)t*=x[i]-x[j];
12 }
13 y[i]/=t;
14 }
15 //前計算 dp[i]:=(x-x0)*...*(x-xn)の x^i の係数
16 vector<T>dp(n+2);
17 dp[0]=1;
18 for(T xi:x){
19 for(int i=n+1;i>=0;i--){
20 dp[i]*=-xi;
21 if(i>0)dp[i]+=dp[i-1];
22 }
23 }
24 //戻すDP
25 vector<T>ret(n+1);
26 for(int i=0;i<=n;i++){
27 if(x[i]==T(0)){
28 for(int j=0;j<=n;j++)ret[j]+=dp[j+1]*y[i];
29 }else{
30 T inv=x[i].inv();
31 ret[0]+=-dp[0]*inv*y[i];
32 T pre=-dp[0]*inv;
33 for(int j=1;j<=n;j++){
34 ret[j]+=-(dp[j]-pre)*inv*y[i];
35 pre=-(dp[j]-pre)*inv;
36 }
37 }
38 }
39 return ret;
40}
vector< T > lagrangePolynomial(vector< T >x, vector< T >y)
Definition lagrange2.hpp:6