• 被论文洗脑2(毛啸<<再探快速傅里叶变换>>)


    上次仅仅读了徐明宽的论文的一部分,就觉得很强.

    于是我又从同学的介绍和毛啸的论文中get到了一点FFT的新技能

    虽然还有一个更高阶的技能不会用.

    FFT的优化论文中提了很多

    减少DFT次数(最后再IDFT,预处理DFT)

    利用循环卷积(不会,待研究)

    分治FFT小范围暴力(效果显著)

    快速幂次数的优化(addition chain,大佬说没什么用,我也没有仔细看)

    然后就到了重点:

    一个新的技巧!!!

    十分强大!!!

    然而我只看懂了前半部分.

    所以只提前半部分.

    论文里讲得十分详细,也给出了证明.

    简洁一点说

    就是把FFT(a) FFT(b)

    这两次FFT

    变成一次FFT

    只需要构造fp=a+bi

    对fp做FFT

    然后计算出他的共轭复数fq的点值表示.

    fq[0]=fp[0]

    fq[i]=fp[u-i] (i>=1) u 为 长度

    然后计算c=a卷b的点值表示

    c[i]=(fp[i]+fq[i])*单位虚数*(fq[i]-fp[i])/4

    就好了

    证明详见论文(主要是因为我不会推)

    代码实现不难.

    只要将

    FFT(a); FFT(b);
    for (int i=0; i<u; ++i) a[i]*=b[i];

    改为

    for (int i=0; i<u; ++i) fp[i]=virt(a[i].real(),b[i].real());
    FFT(fp);
    fq[0]=conj(fp[0]); for (int i=1; i<u; ++i) fq[i]=conj(fp[u-i]);
    for (int i=0; i<u; ++i) a[i]=(fp[i]+fq[i])*(xi*(fq[i]-fp[i])),a[i]/=4;

    即可.

    可以压去1/3常数

    带来的不良之处就是精度会大幅降低,不过对于整系数FFT精度绰绰有余

    论文后面还有更优的的方法,只是我并不理解.

    仅仅理解了不到十分之一的内容,就受益匪浅啊!

    奇怪的是,这篇论文@到了method of four russians,不禁有些奇怪.看来我的理解还不够.

    method of four russians 不是一种算法,而是一种思想啊!

  • 相关阅读:
    Core Java Interview Question Answer
    Anagrams
    Permutations II
    Minimum Window Substring
    工厂模式
    How do you design object oriented projects?
    What is Object Oriented Design? (OOD)
    Amazon Interview Question: Design an OO parking lot
    讨论一道求质数的面试题
    Substring with Concatenation of All Words
  • 原文地址:https://www.cnblogs.com/Yuhuger/p/8575545.html
Copyright © 2020-2023  润新知