单位根反演
就是下面这个式子:
[
n
∣
k
]
=
1
n
∑
i
=
0
n
−
1
w
n
i
k
[n|k]=\frac{1}{n}\sum_{i=0}^{n-1} w_n^{ik}
[n∣k]=n1i=0∑n−1wnik
证明:
- 当 n ∣ k n|k n∣k 时, w n i k = 1 w_n^{ik}=1 wnik=1,原式成立。
- 当 n ∤ k n\not{|}k n∣k 时,原式等于 1 n ⋅ 1 − w n k 1 − w k = 0 \frac{1}{n}\cdot \frac{1-w^{nk}}{1-w^k}=0 n1⋅1−wk1−wnk=0。
应用
求一个多项式 f ( x ) f(x) f(x) 次数为 d d d 的倍数的系数和,其中需满足存在 d d d 次单位根 w d w_{d} wd。
设
f
(
x
)
=
∑
i
=
0
n
a
i
x
i
f(x)=\sum_{i=0}^n a_ix^i
f(x)=∑i=0naixi,那么:
∑
i
=
0
n
[
d
∣
i
]
a
i
=
∑
i
=
0
n
a
i
1
d
∑
j
=
0
d
−
1
w
d
i
j
=
1
d
∑
j
=
0
d
−
1
∑
i
=
0
n
a
i
w
d
i
j
=
1
d
∑
j
=
0
d
−
1
f
(
w
d
j
)
\begin{aligned} &\sum_{i=0}^n [d|i]a_i\\ =&\sum_{i=0}^na_i\frac{1}{d}\sum_{j=0}^{d-1}w_d^{ij}\\ =&\frac{1}{d}\sum_{j=0}^{d-1}\sum_{i=0}^na_iw_d^{ij}\\ =&\frac{1}{d}\sum_{j=0}^{d-1}f(w_{d}^j) \end{aligned}
===i=0∑n[d∣i]aii=0∑naid1j=0∑d−1wdijd1j=0∑d−1i=0∑naiwdijd1j=0∑d−1f(wdj)
于是如果求
f
(
x
)
f(x)
f(x) 的时间复杂度为
O
(
t
)
O(t)
O(t),那么就能在
O
(
d
t
)
O(dt)
O(dt) 的时间复杂度内解决这个问题。
所以一般应用于 d d d 为较小的定值,以及 f ( x ) f(x) f(x) 有良好的实际意义(能快速求)的情况。
当然把条件变成模 d d d 余 r r r 也是可以的,只需要将多项式平移即可。
把多项式换成数列也是可以的,只需要把数列换成其生成函数。