Bluestein's Algorithm
网上很少有人提到,写的也很简单,事实上就是很简单...
\(Bluestein's\ Algorithm\),用以解决任意长度\(DFT\)。
考虑\(DFT\)的形式:\[\begin{aligned}y_k&=\sum_{i=0}^{n-1}a_i\omega_n^{ki}\\&=\sum_{i=0}^{n-1}a_i\omega_{2n}^{k^2+i^2-(k-i)^2}\\&=\omega_{2n}^{k^2}\sum_{i=0}^{n-1}a_i\omega_{2n}^{i^2}\omega_{2n}^{-(k-i)^2}\end{aligned}\]
注意到\(\sum\)是个卷积,可以用\(FFT/NTT\)计算。所以\(Bluestein\)的复杂度是\(O(n\log n)\)的。
具体:\(k-i\)可能是负的,所以对后一项右移\(n\)位,令\(f_i=a_i\omega_{2n}^{i^2},\ g_i=\omega_{2n}^{-(i-n)^2}\),那么\(y_k=\omega_{2n}^{k^2}\sum_{i}f_ig_{n+k-i}=\omega_{2n}^{k^2}(f\times g)_{n+k}\)。
\(IDFT\)同理,可以直接令\(\omega_{2n}=\omega_{2n}^{-1}\),代到\(DFT\)的式子里,也可以一样的推一下:\[\begin{aligned}c_k&=\frac{1}{n}\sum_{i=0}^{n-1}a_i\omega_n^{-ki}\\&=\frac{1}{n}\sum_{i=0}^{n-1}a_i\omega_{2n}^{k^2+i^2-(k+i)^2}\\&=\frac{1}{n}\omega_{2n}^{k^2}\sum_{i=0}^{n-1}a_i\omega_{2n}^{i^2}\omega_{2n}^{-(k+i)^2}\end{aligned}\]
令\(f_i=a_i\omega_{2n}^{i^2},\ g_i=\omega_{2n}^{-(2n-1-i)^2}\),那么\(c_k=\frac{1}{n}\omega_{2n}^{k^2}\sum_if_ig_{2n-1-k-i}=\omega_{2n}^{k^2}(f\times g)_{2n-1-k}\)。
上面是一般的做法(其实就是个\(trick\)),但是\(dls\)指出有更好一些的做法:
像这样写成平方需要\(\omega_{2n}\)(有些题可能不存在\(2n\)次单位根),就可以用:\(ij=\binom{i+j}{2}-\binom i2-\binom j2\)来替换:\(y_k=\omega_n^{-\binom k2}\sum_{i=0}^{n-1}a_i\omega_n^{-\binom i2}\omega_n^{\binom{i+j}{2}}\)。
例题
事实上我觉得除了循环卷积需要任意长度\(DFT\)外,其它地方就用不到了...(应该是我做题少)
1. 正睿 青岛集训 Day4 A.智慧树
见这里。
2. BZOJ.1919.[CTSC2010]性能优化
也是循环卷积裸题...
3. HDU.4656.Evaluation
类似\(Bluestein\)的\(trick\)应用。题解见这里(我就咕咕咕了)。
Bluestein's Algorithm的更多相关文章
- [codeforces 901E] Cyclic Cipher 循环卷积-Bluestein's Algorithm
题目大意: 传送门 给两个数列${B_i}.{C_i}$,长度均为$n$,且${B_i}$循环移位线性无关,即不存在一组系数${X_i}$使得对于所有的$k$均有$\sum_{i=0}^{n-1} X ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- NTT&FFT(快速?变换)
NTT&FFT 预先知识:无 我觉得我们可以从NTT/FFT讲起? 两个其实本质相同,都是求 多项式乘积 的算法 FFT \((x,y)\)指复数,我们可以不用管它 首先我们构造单位根\(\o ...
- 【Luogu5293】[HNOI2019] 白兔之舞
题目链接 题目描述 略 Sol 考场上暴力 \(O(L)\) 50分真良心. 简单的推一下式子,对于一个 t 来说,答案就是: \[\sum_{i=0}^{L} [k|(i-t)] {L\choose ...
- 【Luogu4191】[CTSC2010] 性能优化
题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...
- XJOI NOI训练2 传送
NTT循环卷积 30分: 可以发现这是一个很明显的分层$DP$,设$dp[i][j]$表示当前走了j步走到i号节点的方案数.如果当前走的步数对节点有限制就直接将这个点的$DP$值赋成$0$ #incl ...
- 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...
- PE Checksum Algorithm的较简实现
这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
随机推荐
- IDEAL 中配置Tomcat的内存值
-server -XX:PermSize=2048M -XX:MaxPermSize=4096m
- UTC时间戳转为时间
/// <summary> /// 将UTC时间转化DateTime时间 /// </summary> /// <returns></returns> ...
- Oier们的镜子(mirror)
题解: 这题真是把我坑的很惨.. 题目看了很久才看懂.. 然后刚开始又没看见每个只能匹配一个这种条件 #include <bits/stdc++.h> using namespace st ...
- Python_序列化和反序列化模块
序列化:将对象转换为可通过网络传输或可存储到本地磁盘的数据格式的转换过程,称为序列化,反之,称为反序列化 json: 用来实现不同语言,不同程序直接的信息交互,json支持所有高级语言之间的序列化交互 ...
- zabbix邮箱报警设置&问题汇总
zabbix邮件报警部署! Zabbix监控服务端.客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常,通过查看Zabbix监控服务器,可以了解服务器的运行状态是否正常,运维人员不会时 ...
- TopCoder SRM500 Div1 1000 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html SRM500 Div1 1000 设 \(v_1,v_2,\cdots ,v_9 ...
- 数学模型:3.非监督学习--聚类分析 和K-means聚类
1. 聚类分析 聚类分析(cluster analysis)是一组将研究对象分为相对同质的群组(clusters)的统计分析技术 ---->> 将观测对象的群体按照相似性和相异性进行不同群 ...
- 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义
一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 /** * @throws Exception * ...
- apache利用http_referer进行防盗链
http://blog.sina.com.cn/s/blog_8729dd9801011rn1.html
- centos7下docker启动失败解决
docker启动失败解决 could not change group /var/run/docker.sock to docker: gr... not found 如果出现:Job for doc ...