1. 引言
使用多项式的强大技术之一在于:
- 已知该多项式的一组evaluations
- 可直接计算其在某不同point的evaluation值
如,若 P ( x ) P(x) P(x)为degree-100多项式:
- 可使用evaluations P ( 0 ) , P ( 1 ) , ⋯ , P ( 100 ) P(0),P(1),\cdots,P(100) P(0),P(1),⋯,P(100)
- 在 O ( N ) O(N) O(N)时间内,直接计算 P ( 101 ) P(101) P(101)或 P ( 1247130 ) P(1247130) P(1247130),而不需要重构该多项式。
本文将描述具体的实现方式。详细技术细节可参看:
2. 通用技术
令 P ( x ) P(x) P(x)为多项式, x 1 , ⋯ , x n x_1,\cdots,x_n x1,⋯,xn为一组对 P ( x ) P(x) P(x)的评估点,具有的评估值分别为 y 1 , ⋯ , y N y_1,\cdots,y_N y1,⋯,yN。
可将 P ( x ) P(x) P(x)看成是线性组合 ∑ i y i L i ( x ) \sum_i y_iL_i(x) ∑iyiLi(x),其中:
- L i ( x ) L_i(x) Li(x)多项式,在 x i x_i xi处值为1,而在该集合内的其它x坐标处,值为0。
每个
L
i
(
x
)
L_i(x)
Li(x)可表示为:
(
x
−
x
1
)
(
x
−
x
2
)
⋯
(
x
−
x
i
−
1
)
(
x
−
x
i
+
1
)
⋯
(
x
−
x
N
)
(
x
i
−
x
1
)
(
x
i
−
x
2
)
⋯
(
x
i
−
x
i
−
1
)
(
x
i
−
x
i
+
1
)
⋯
(
x
i
−
x
N
)
\frac{(x-x_1)(x-x_2)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_N)}{(x_i-x_1)(x_i-x_2)\cdots(x_i-x_{i-1})(x_i-x_{i+1})\cdots(x_i-x_N)}
(xi−x1)(xi−x2)⋯(xi−xi−1)(xi−xi+1)⋯(xi−xN)(x−x1)(x−x2)⋯(x−xi−1)(x−xi+1)⋯(x−xN)
将上面的分母表示为
d
i
d_i
di,将所有乘积
(
x
−
x
1
)
(
x
−
x
2
)
⋯
(
x
−
x
N
)
(x-x_1)(x-x_2)\cdots(x-x_N)
(x−x1)(x−x2)⋯(x−xN)(不跳过任何元素)表示为
M
(
x
)
M(x)
M(x),则
L
i
(
x
)
L_i(x)
Li(x)可表示为:
M
(
x
)
d
i
(
x
−
x
i
)
\frac{M(x)}{d_i(x-x_i)}
di(x−xi)M(x)
其中:
- d i d_i di值计算需要 O ( N 2 ) O(N^2) O(N2) time,因每个用时 O ( N ) O(N) O(N),且一共有 N N N项。但这些值仅依赖于evaluation points,而不是特定的多项式。因此可提前预计算并存储,而不需要每次都重新计算。
- M ( x ) M(x) M(x)在任意点的计算用时为 O ( N ) O(N) O(N)。
因此,每个 L i ( x ) L_i(x) Li(x)的计算用时为 O ( N ) O(N) O(N)。
从而:
P
(
x
)
=
M
(
x
)
∗
∑
i
y
i
d
i
(
x
−
x
i
)
P(x)=M(x)*\sum_i\frac{y_i}{d_i(x-x_i)}
P(x)=M(x)∗∑idi(x−xi)yi
计算用时也为
O
(
N
)
O(N)
O(N)。
3. 特例情况:roots of unity
在barycentric evaluation的很多应用中,可选择evaluation points。一种很舒适的选择是:
- 选择集合 { 1 , w , w 2 , ⋯ , w N − 1 } \{1,w,w^2,\cdots,w^{N-1}\} {1,w,w2,⋯,wN−1},其中 w w w满足 w N = 1 w^N=1 wN=1, N N N为a power of 2。
这种选择的主要优势在于:
- 取消了对 d i d_i di值的预计算需要。因为对此有一种简单的closed-form value。
原因在于,可将
d
i
d_i
di简化表示为:
∏
0
≤
j
≠
i
<
N
(
w
i
−
w
j
)
\prod_{0\leq j\neq i<N}(w^i-w^j)
∏0≤j=i<N(wi−wj)
注意有
w
N
2
=
−
1
w^{\frac{N}{2}}=-1
w2N=−1,因此可将上面公式重新表示为:
2
w
i
∗
∏
0
≤
j
≠
i
<
N
2
(
w
i
−
w
j
)
(
w
i
+
w
j
)
2 w^i*\prod_{0\leq j\neq i<\frac{N}{2}}(w^i-w^j)(w^i+w^j)
2wi∗∏0≤j=i<2N(wi−wj)(wi+wj)
其中乘积内各项为 ( w i − w j ) (w^i-w^j) (wi−wj)和 ( w i − w j + N 2 ) (w^i-w^{j+\frac{N}{2}}) (wi−wj+2N),而 w j + N 2 = − w j w^{j+\frac{N}{2}}=-w^j wj+2N=−wj。剩下的项为 ( w i − w i + N 2 ) (w^i-w^{i+\frac{N}{2}}) (wi−wi+2N),可简化表示为 2 w i 2w^i 2wi。
此时,
(
w
i
−
w
j
)
(
w
i
+
w
j
)
(w^i-w^j)(w^i+w^j)
(wi−wj)(wi+wj)可合并表示为
(
w
2
i
−
w
2
j
)
(w^{2i}-w^{2j})
(w2i−w2j),因此有:
2
w
i
∗
∏
0
≤
j
≠
i
<
N
2
(
w
2
i
−
w
2
j
)
2w^i*\prod_{0\leq j\neq i<\frac{N}{2}}(w^{2i}-w^{2j})
2wi∗∏0≤j=i<2N(w2i−w2j)
重复以上过程,有:
2
w
i
∗
2
w
2
i
∗
∏
0
≤
j
≠
i
<
N
4
(
w
4
i
−
w
4
j
)
2w^i*2w^{2i}*\prod_{0\leq j\neq i<\frac{N}{4}}(w^{4i}-w^{4j})
2wi∗2w2i∗∏0≤j=i<4N(w4i−w4j)
继续重复,最终让右侧的乘积项为空。从而有:
2
w
i
∗
2
w
2
i
∗
2
w
4
i
∗
⋯
∗
2
w
N
2
i
=
N
∗
w
(
N
−
1
)
i
2w^i*2w^{2i}*2w^{4i}*\cdots * 2w^{\frac{N}{2}i}=N*w^{(N-1)i}
2wi∗2w2i∗2w4i∗⋯∗2w2Ni=N∗w(N−1)i
由于
w
N
=
1
w^N=1
wN=1,从而有:
d
i
=
N
w
i
d_i=\frac{N}{w^i}
di=wiN
此外,
M
(
x
)
=
∏
i
(
x
−
w
i
)
M(x)=\prod_i(x-w^i)
M(x)=∏i(x−wi)可简化表示为
x
N
−
1
x^N-1
xN−1,因此,整个计算可简化表示为:
P
(
x
)
=
x
N
−
1
N
∗
∑
i
y
i
∗
w
i
x
−
w
i
P(x)=\frac{x^N-1}{N}*\sum_i\frac{y_i*w^i}{x-w^i}
P(x)=NxN−1∗∑ix−wiyi∗wi
参考资料
[1] Vitalik 2022年3月hackmd A quick barycentric evaluation tutorial
[2] 2004年论文 Barycentric Lagrange Interpolation∗