Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
lagrange2.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
3
//ラグランジュ補間
4
//n+1個の点(xi,yi)を通るn次多項式の係数を返す/O(n^2)
5
template
<
typename
T>
6
vector
<
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
}
lagrangePolynomial
vector< T > lagrangePolynomial(vector< T >x, vector< T >y)
Definition
lagrange2.hpp:6
math
lagrange2.hpp
構築:
1.13.2