2024.2.4 闲话
歌:NeruNeru-Chan travels to the Luminous Stars! - Halv .
分割线
如果你在某些代数系统中需要使用单位根 \(\omega\),然而单位根在对应系统中不存在,该如何处理?
一种 naive 的想法:扩域把 \(\omega\) 加进去,然而复杂度非常高 .
对于代数系统 \(\mathcal A\),考虑扩域 \(\mathcal I_n=\mathcal A[\omega_n]\),则断言:
其中 \(\Phi_n\) 是分圆多项式 .
这也就表明两个带着 \(\omega_n\) 的东西的运算相当于对应的多项式运算最后对分圆多项式 \(\Phi_n(x)\) 取模 .
结论可以由 \(\Phi_n(x)\) 是 \(\omega_n\) 的最小多项式简单证明 .
对于取模的具体计算,由于 \(\Phi_n(x)\mid(x^n-1)\),在过程中可以先对 \(x^n-1\) 取模,最后再修正到 \(\Phi_n(x)\) .
下面的内容可能和上文关系不大 . 但是上面的做法一般不容易有什么应用 .
考察多项式乘法在不存在单位根,但是可以做除法的情况 .
首先分析 DFT 的时间复杂度:
Lemma 1
假设 \(n=s^r\),\(v=s^u\),\(u\ge r\),则对系数在 \(\mathcal I_v\) 中的多项式做长为 \(n\) 的 DFT 的时间复杂度不超过 \(O(snvr)\) .
证明平凡不表 .
Lemma 2
做两个度不超过 \(n\) 的多项式 \(A(x),B(x)\) 的乘法需要 \(O(n\log n)\) 次乘法和 \(O(n\log n\log\log n)\) 次加法 .
令 \(m=s^r\) 满足 \(\varphi(m)>\deg A+\deg B\) . 考虑不计算 \(A(x)B(x)\),而计算 \(A(\omega_m)B(\omega_m)\)(因为这里是要对素多项式 \(\Phi_m(x)\) 取模,由 \(\deg\Phi_m(x)=\varphi(m)>\deg A+\deg B\) 所以这个转化是可以成立的,最后只需要把单位根换成 \(x\) 即可).
换言之,我们现在对 \(\mathcal I_m[x]/\langle x-\omega_m\rangle\) 上的元素做乘法 .
令 \(p=s^u\),\(q=s^v\) 且 \(u+v=r\),\(v+1\le u\le v+2\),考察:
把内层 \(\sum\) 看成系数然后对外层做 DFT 即可 .
因为这里相当于在 \(\mathcal I_p[x]\) 上做 DFT 所以可以用上一个 Lemma 分析复杂度 .
DFT 的复杂度不超过 \(O(spqr)=O(snr)\),所以取充分小的 \(s\) 即可做到 \(O(n\log n)\) 次加法 .
对于乘法可以递归调用上述过程 .
加法:\(T(n)=\sqrt n\cdot T(\sqrt n)+O(n\log n)=O(n\log n\log\log n)\) .
乘法:\(T(n)=\sqrt n\cdot T(n)+O(1)=O(n\log n)\) .
(根据一般 DFT 的经验,这里的复杂度应该是 \(\Theta\) 的)
Reference:如何在任意代数结构上做多项式乘法 - whx1003 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18005634
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ