最好的占位多项式
来复习一下占位多项式,参考 Elegia. Hello, multivariate multiplication. 一文,我们可以给出占位多项式的定义,也就是在混合基表示下
然后
注意这里的
我们最好说的其实是对于缓存而言应该是最友好的。
占位多项式实际上是决定了“贡献”的位置,也就是说,如果我们将整个多项式进行“分类”,然后让那些
这时候考虑块和块之间的间隔(更大块和更大块之间的间隔等等),通过调整这些应该可以拿到所有可能的占位多项式,但是就缓存友好而言,不难发现还是 Elegia 给出的是最优的。
在二维卷积(次数在片段中)中,有下面两种合法的
dim = 2
[2, 3]
All valid chi function(s):
[0, 0, 1, 1, 0, 0]
[0, 1, 1, 0, 0, 1] // 块长度为 2,也就是 [0, 1] [1, 0] [0, 1]
Elegia's chi function:
[0, 0, 1, 1, 0, 0]
我们可以用两个数组分别描述“间隔”,第一个是 [0, 1],第二个是 [1, 1]。
下面是三维卷积(次数在片段中)中所有合法的
dim = 3
[4, 2, 3]
All valid chi function(s):
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]
[0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2]
[0, 1, 2, 0, 0, 1, 2, 0, 2, 0, 1, 2, 2, 0, 1, 2, 1, 2, 0, 1, 1, 2, 0, 1]
[0, 1, 2, 0, 2, 0, 1, 2, 2, 0, 1, 2, 1, 2, 0, 1, 1, 2, 0, 1, 0, 1, 2, 0]
[0, 2, 1, 0, 0, 2, 1, 0, 1, 0, 2, 1, 1, 0, 2, 1, 2, 1, 0, 2, 2, 1, 0, 2]
[0, 2, 1, 0, 1, 0, 2, 1, 1, 0, 2, 1, 2, 1, 0, 2, 2, 1, 0, 2, 0, 2, 1, 0]
Elegia's chi function:
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]
我们可以用数组描述“间隔”,分别是
[0, 1, 0]
[0, 2, 0]
[1, 0, 2]
[1, 2, 2]
[2, 0, 1]
[2, 1, 1]
以最后一行为例,详细说明一下 [2, 1, 1] 是什么意思,在第一维是四个,我们将整个数组划分为
[0, 2, 1, 0] 0 (+2) -> 2 (+2) -> 1 (+2) -> 0
[1, 0, 2, 1] ...
[1, 0, 2, 1] ...
[2, 1, 0, 2] ...
[2, 1, 0, 2] ...
[0, 2, 1, 0] ...
每一块中间隔都是 2,所以第一个数字是 2,考虑第二个 1 的意思是
[0, 2, 1, 0] 每个 +1 -> [1, 0, 2, 1]
[1, 0, 2, 1] 每个 +1 -> [2, 1, 0, 2]
[2, 1, 0, 2] 每个 +1 -> [0, 2, 1, 0]
剩下一个 1 的意思是
[0, 2, 1, 0, 1, 0, 2, 1] 每个 +1 -> [1, 0, 2, 1, 2, 1, 0, 2] ...
在同一个合法的
如此我们便可以快速计算占位函数
根据一些简单的测试 https://www.luogu.com.cn/paste/2pksgh4c,发现很难避免二倍长度的 FFT,除非将