Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
lagrange.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2#include"../../kyopro_library/math/multipoint_evaluate.hpp"
3
4/// @brief ラグランジュ補間
5/// @brief n+1 個の点 (x[i], y[i]) を通る n 次多項式の係数を返す
6/// @note O(n (log(n))^2)
7template<typename T>
8vector<T> LagrangePolynomial(vector<T> x, vector<T> y){
9 int n=x.size();
10 int n2=1;
11 while(n2<n) n2<<=1;
12
13 vector<vector<T>> g(n2*2,{1});
14 for(int i=0; i<n; i++) g[n2+i]={-x[i],1};
15 for(ll i=n2-1; i>0; i--) g[i]=PolyMul(g[i<<1],g[i<<1|1]);
16
17 vector<T> prod=g[1];
18 vector<T> diff=PolyDifferential(prod),eval=MultipointEvaluate(diff,x);
19
20 using P=pair<vector<T>,vector<T>>;//first/second
21 vector<P> g2(n2*2,{{0},{1}});
22 for(int i=0; i<n; i++) g2[n2+i]={{y[i]},{-eval[i]*x[i],eval[i]}};
23 auto merge=[](P l, P r)-> P {
24 vector<T> tmp1=PolyMul(l.first,r.second),tmp2=PolyMul(l.second,r.first);
25 return {PolyAdd(tmp1,tmp2),PolyMul(l.second,r.second)};
26 };
27 for(ll i=n2-1; i>0; i--) g2[i]=merge(g2[i<<1],g2[i<<1|1]);
28
29 vector<T> ret=g2[1].first;
30 T p=1;
31 for(int i=0; i<n; i++) p*=eval[i];
32 p=p.inv();
33 for(int i=0; i<n; i++) ret[i]*=p;
34 return ret;
35}
vector< T > LagrangePolynomial(vector< T > x, vector< T > y)
ラグランジュ補間
Definition lagrange.hpp:8