读者需要具有一定的多项式基础和数学基础。
给定
n−1 次多项式
F(x) ,求它在每个
i∈[0,n−1],p⋅qi 上的点值,要求
O(nlogn)。
Chirp-Z Transform(CZT)解决的是上面的问题,概括出来就是等比数列多项式多点求值。
我们先尝试构造一个卷积的形式:
yi=∑j=0n−1fj⋅xj=∑j=0n−1fj(p⋅qi)j=∑j=0n−1(fj⋅pj)qi⋅j
解释:根据点值的定义,将
xi=p⋅qi 代入,然后变形将指数
j 给到括号内,提出
q 相关的项。
yi=∑j=0n−1(fj⋅pj)q(2i+j)−(2i)−(2j)
解释:有恒等式
i⋅j=(2i+j)−(2i)−(2j)。
直接按组合数的定义展开即证。
(2i+j)−(2i)−(2j)=21(i+j)(i+j−1)−21i(i−1)−21j(j−1)=21(i2+i⋅j−i+i⋅j+j2−j−i2+i−j2+j)=21(2⋅i⋅j)=i⋅j
yi=q−(2i)∑j=0n−1(fj⋅pj)q(2i+j)−(2j)=q−(2i)∑j=0n−1(fj⋅pj⋅q−(2j))q(2i+j)
解释:将与求和索引
j 无关的项提出到求和符号外,然后展开乘方运算,将仅与
j 有关的量放到一起,构造卷积形式。
yi=q−(2i)∑j=0n−1uj⋅vi+j
解释:换元
ut=ft⋅pt⋅q−(2t),vt=q(2t)。此时后面的求和部分
∑uj⋅vi+j 是一个减法卷积形式,可以构造
U(x)=∑uj⋅xj,V(x)=∑vj⋅xj,计算
U(x) 和
V(x) 的减法卷积即可得到
∑uj⋅vi+j 部分,最后乘上前面的系数
q−(2i) 就完成了。
那如何计算
U(x) 和
V(x) 的减法卷积呢?经典的方法是将其中一个系数翻转,然后计算二者的加法卷积(多项式乘法)。使用快速数论变换实现多项式乘法可以做到
O(nlogn) 的时间复杂度。
给定
n−1 次多项式
F(x) 在每个
i∈[0,n−1],p⋅qi 上的点值,求它,要求
O(nlogn)。
Inverse Chirp-Z Transform(ICZT)解决的是上面的问题,概括出来就是等比数列多项式多点插值。
我们先尝试简化问题。设
G(x)=j=0∑n−1gj⋅xj=F(p⋅x)=j=0∑n−1fj(pj⋅xj)。如果我们能求出
G(x) 的系数
gj,又因为
gj=fj⋅pj,那我们就能直接得到
F(x) 的系数
fj=gj⋅p−j。此时问题简化为“给定
n−1 次多项式
G(x) 在每个
i∈[0,n−1],qi 上的点值,求它,要求
O(nlogn)”。
设
G(x) 在牛顿基下的形式为
G(x)=j=0∑n−1gj′k=0∏j−1(x−qk)。
yi=g(qi)=∑j=0n−1gj′k=0∏j−1(qi−qk)=∑j=0igj′∏k=0j−1(qi−qk)
解释:根据
G(x) 的牛顿基表示形式展开,然后根据点值的定义带入。后面我们把第一个求和式中
j 的上界从
n−1 缩小为
i,是因为若
j>i,则第二个求积式中
k 可以取到
i,导致乘积结果为
0,对
yi 无影响。
yi=∑j=0igj′⋅q(2j)(i−j)q!(i)q!
解释:根据变形
q-阶乘恒等式
k=0∏j−1(qi−qk)=q(2j)(i−j)q!(i)q! 可得。
请不要被
q-阶乘这个名字吓住。这只是个定义:
(n)q!=i=1∏n(qi−1)。熟悉
q-analog 的读者应该会发现,这不是标准的
q-阶乘形式
[n]q!。这里是我们有意为之,定义此变形
q-阶乘,舍去了分母的部分,并且将分子的部分乘上了
−1。
∏k=0j−1(qi−qk)=∏k=0j−1qk(qi−k−1)=qk=0∑j−1k∏k=0j−1(qi−k−1)
解释:提出
qk 一项,然后通过乘方运算规律将其完全扯到求积式外面。
∏k=0j−1(qi−qk)=q(2j)∏k=0j−1(qi−k−1)
解释:求积式外面的系数的指数是等差数列求和,其结果为
2j(j−1),这等同于
(2j)。观察目前这个式子与目标式
q(2j)(i−j)q!(i)q! 的差异,接下来我们只需要证明
k=0∏j−1(qi−k−1)=(i−j)q!(i)q! 即可。
(i−j)q!(i)q!=∏l=i−j+1i(ql−1)
解释:根据定义有
(i)q!=l=1∏i(ql−1) 以及
(i−j)q!=l=1∏i−j(ql−1),直接相除即可。
(i−j)q!(i)q!=∏k=0j−1(qi−k−1)
解释:换元
k=i−l,也就有
l=i−k。原先
l=i−j+1 的下界对应现在
i−k=i−j+1 也就是
k=j−1 的上界;原先
l=i 的上界对应现在
i−k=i 也就是
k=0 的下界,证毕。
(i)q!yi=∑j=0i(gj′⋅q(2j))(i−j)q!1
解释:移项整理,尝试构造卷积形式。
ai=∑j=0ibj⋅ci−j
解释:换元
at=(t)q!yt,bt=gt′⋅q(2t),ct=(t)q!1。此时后面的求和部分
∑bj⋅ci−j 是一个加法卷积形式,可以构造
B(x)=∑bj⋅xj,C(x)=∑cj⋅xj。注意你现在要求的是
gj′ 一项,也就是要求
B(x),那就需要多项式除法(多项式乘法逆元)求出
B(x),然后
gj′=bj⋅q−(2j) 即可。
接下来我们需要把牛顿基系数
g′ 转换回常规系数
g。
G(x)=∑j=0n−1gj′∏k=0j−1(x−qk)=∑j=0n−1gj′∑k=0j(kj)q(−1)j−kq(2j−k)xk
解释:牛顿基式子,然后
q-二项式定理把后面的求积式化掉。
没想到吧
q-analog 还在发力。
q-二项式定理的内容为:
∏k=0j−1(x−qk)=∑k=0j(kj)q(−1)j−kq(2j−k)xk
首先定义
q-二项式系数
(kn)q=(k)q!(n−k)q!(n)q!。注意这里的
(n)q! 是我们之前定义的变形
q-阶乘
i=1∏n(qi−1)。我们需要先证明一个递推关系
(kn)q=(k−1n−1)q+qk(kn−1)q,它又名
q-帕斯卡恒等式。
(k−1n−1)q+qk(kn−1)q=(k−1)q!(n−k)q!(n−1)q!+qk(k)q!(n−1−k)q!(n−1)q!
(k−1n−1)q+qk(kn−1)q=(k)q!(n−k)q!(n−1)q!((qk−1)+qk(qn−k−1))
解释:通分。
(k−1n−1)q+qk(kn−1)q=(k)q!(n−k)q!(n−1)q!(qn−1)
解释:展开分式右侧的括号内容。
(k−1n−1)q+qk(kn−1)q=(k)q!(n−k)q!(n)q!=(kn)q
解释:根据定义有
(n)q!=(n−1)q!(qn−1),直接把括号内容乘到分子上合并。然后得到的式子根据
q-二项式系数的定义变形,证毕。
接下来我们使用数学归纳法证明
q-二项式定理,先是一些记号:
- 左 Ln(x)=k=0∏n−1(x−qk),特别地 Ln(0) 是空积,也就是说 Ln(0)=1。
- 右 Rn(x)=k=0∑ncn,kxk,这里我们换元 cn,k=(kn)q(−1)n−kq(2n−k) 方便书写。
下面开始证明。当
n=0 时,
Ln(x)=1,
Rn(x)=(00)q(−1)0q0x0=1,结论成立。假设对
n−1 成立,我们知道
Ln(x)=Ln−1(x)(x−qn−1),考虑这个等式左右两边每一项的关系:
∀k,[xk]Ln(x)=[xk−1]Ln−1(x)−qn−1[xk]Ln−1(x)
解释:
[xk]Ln(x) 表示提取多项式
Ln(x) 的
xk 项系数。根据前面提到的
Ln(x) 与
Ln−1(x) 之间的关系,我们知道
Ln(x) 的
xk 项是由
Ln−1 的
xk−1 项乘上
x 加上
Ln−1 的
xk 项乘上
−qn−1 得到。
∀k,[xk]Ln(x)=cn−1,k−1−qn−1cn−1,k
解释:根据归纳假设,
Ln−1(x)=Rn−1(x),而
Rn−1(x) 是一个求和式,它的
xk 项就是
cn−1,k,同理它的
xk−1 项就是
cn−1,k−1。
∀k,[xk]Ln(x)=(k−1n−1)q(−1)n−kq(2n−k)−qn−1(kn−1)q(−1)n−1−kq(2n−1−k)
解释:按照
cn,k 的定义直接展开。
∀k,[xk]Ln(x)=(−1)n−kq(2n−k)((k−1n−1)q−qn−1(kn−1)q(−1)−1q(2n−1−k)−(2n−k))
解释:提取公因式。
∀k,[xk]Ln(x)=(−1)n−kq(2n−k)((k−1n−1)q+qk(kn−1)q)
解释:首先将
(−1)−1 直接乘掉。然后右边
q 的指数是
(2n−1−k)−(2n−k)=2(n−k−1)(n−k−2)−2(n−k)(n−k−1)=2n−k−1(n−k−2−(n−k))=2n−k−1(−2)=−n+k+1,前面还乘了一项
qn−1,那么
q 的总指数就是
−n+k+1+n−1=k。
∀k,[xk]Ln(x)=(−1)n−kq(2n−k)(kn)q=cn,k=[xk]Rn(x)
解释:第一步是
q-帕斯卡恒等式,然后根据
cn,k 的定义直接化简。然后
cn,k 又是
Rn(x) 的
xk 项系数,所以我们证明了对于每个
k,
Ln(x) 的
xk 项系数和
Rn(x) 的
xk 项系数相同,那么就有
Ln(x)=Rn(x),
q-二项式定理证毕。
交换求和顺序,对比系数就有
gj=i=j∑n−1gi′(ji)q(−1)i−jq(2i−j)。
gj=∑i=jn−1gi′(j)q!(i−j)q!(i)q!(−1)i−jq(2i−j)
gj(j)q!=∑i=jn−1(gi′(i)q!)(i−j)q!(−1)i−jq(2i−j)
解释:移项整理,构造卷积形式。
gj=(j)q!1∑i=jn−1ui⋅vi−j
解释:换元
ut=gt′(t)q!,vt=(t)q!(−1)tq(2t)。此时后面的求和部分
∑ui⋅vi−j 是一个加法卷积形式,可以构造
U(x)=∑uj⋅xj,V(x)=∑vj⋅xj。计算
U(x) 和
V(x) 的加法卷积即可得到
∑uj⋅vi−j 部分,最后乘上前面的系数
(j)q!1 就完成了。然后
fj=gj⋅p−j,得到
f。
以上多项式乘法逆元可以牛顿迭代,加法卷积可以快速数论变换,可以做到
O(nlogn) 的时间复杂度。