初识FFT和NTT

本文介绍了在学习快速傅里叶变换(FFT)和数位倒转变换(NTT)过程中的一些理解和难点。作者通过一道CodeChef的题目接触了这两个概念,虽然目前还未完全掌握,但通过阅读不同的资源,包括博客、题解和文档,逐渐理解了其基本原理。文章提到了反转置换的重要性和Rader算法在实现中的作用,并提供了部分代码示例。同时,也分享了大数运算中NTT的应用实例。
摘要由CSDN通过智能技术生成

看了很久文档,觉得自己只学会了套模板的能力,理解的代码是怎么写,还有一点原理,看完现在来推一下原理估计又不会了!难过

学这个的原因是因为codechef的一道题目,可惜现在还是没有解决难过,谁会了求教  点击打开链接

看了  ACdream   的博客,觉得不够详细,而且看了之后根本看不懂代码里面写的什么鬼,之后找了     一份题解 

然后在百度文库找到了一篇讲得很详细的     文档    ,看玩总算理解了那么一点点!难过

ps:这里我只能写一点代码要做什么,原理不敢亵渎!

1、首先是反转置换,将一个2的n次幂长度的分成两个,奇数是一组,偶数是一组,然后一次递归下去,直到长度为1,这样每个元素的位置会去到他二进制反转之后变成是十进制的位置,做置换可以采用rader算法线性实现!一下引用上面链接博客的一张图:


其实为什么这样想想也很明显,将位置pos编号换成二进制,初始化ans_pos=0,ans依次做位运算右移,低位为0的时候走向二叉树的左儿子,否则是右儿子,而ans_pos依次左移,向二叉树左儿子走的时候末尾补0,否则补1,这样ans_pos的二进制就和刚开始ans的二进制是相反的

rader算法代码如下:

///雷德算法,2^M=len,将第i位的数与“i的二进制反转之后的位”的数交换
void rader(complex *F,int len)
{
    int j=len/2;///模拟二进制反转进位的的位置
    for(int i=1;i<len-1;i++)
    {
        if(i<j)swap(F[i],F[j]);///该出手时就出手
        int k=l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值