zoukankan      html  css  js  c++  java
  • FFT 学习笔记

    part0 什么是多项式?

    [f(x) = sumlimits_{i = 0}^{n - 1} a_i * x^i ]

    点值表示

    ((x_0,f(x_0)),(x_1,f(x_1))...(x_{n-1}, f(x_{n-1})))

    part1 离散傅里叶变换

    复数

    首先我们要了解复数 即 $i = sqrt {-1} $

    一个数有实部和虚部 即 (a = x + y * i ~~ (x, y))

    原来的实数运算相当于在一个一维数轴上进行移动,复数则是在二维平面上运动

    复数运算

    一句话来说就是 摸长相乘,幅角相加

    c++中提供了复数模板

    #include <complex>
    complex <double> a;
    

    可以像正常数一样加减乘除

    单位根

    下面默认 (n) 是2的整数次幂, 不够在末尾补0

    对于一个 (n) 次多项式我们把一个单位圆分成 (n)

    [omega_n^0, omega_n^1, omega_n^2,...,omega_n^{n - 1} ]

    [omega_n^k = (cos(frac k n * 2 * pi), sin(frac k n * 2 * pi)) ]

    (omega_n^k) 叫做单位根 , (omega_n^1) 就叫做 (n) 次单位根 , 根据复数运算 (omega_n^k = (omega_n^1)^k)

    单位根性质

    [egin{cases} omega_{2n}^{2k} = omega_n^k \omega_n^{k + frac 2 n} = - omega_n ^ k end{cases} ]

    都比较显然把。。。


    (omega_0, omega_1, omega_2,...,omega_{n - 1}) 带入多项式,得到 (f(omega_0), f(omega_1), f(omega_2),...,f(omega_{n - 1}))({(omega_i, f(omega_i))}) 这种点值表示就是离散傅里叶变换

    离散傅里叶变换的逆变换

    (y_0, y_1, ... , y_{n -1} = f(omega_n^0), f(omega_n^1), ... , f(omega_n^{n - 1}))

    设函数

    [F(x) = sumlimits_{i = n}^{n - 1} y_i * x^i ]

    将单位根的倒数 (omega_n^{-0}, omega_n^{-1},...omega_n^{-(n - 1)}) 带入 (F(x))

    得到

    [z_k= F(omega_n^{-k})= sum_{i = 0} ^ {n - 1} y_i * omega_n^{-k} ]

    [= sum_{i = 0} ^ {n - 1} sum_{j = 0} ^ {n - 1} a^j * (omega_n^i) ^ j * (omega_n^{-k}) ^ i ]

    [=sum_{j = 0} ^ {n - 1} a^j sum_{i = 0} ^ {n - 1} (omega_n^j) ^ i * (omega_n^{-k})^i ]

    [=sum_{j = 0} ^ {n - 1} a^j sum_{i = 0} ^ {n - 1} (omega_n^{j - k})^i ]

    根据等比数列求和公式

    [z_k = a_k * n ]

    [a_k = frac {z_k} n ]

    这样,我们用点值表示推出了系数

    快速傅里叶变换

    已知

    [f(x) = sum a_i * x^i ]

    (f(x)) 分成奇偶两部分

    [f(x) = (a_0x^0 + a_2x^2 + a_4x ^ 4 + ...) + (a_1 x ^ 1 + a_3 x ^3 + a_5 x ^ 5 + ...) ]

    [egin{cases} A(x) = a_0x^0 + a_2 x ^ 1 + a_4 x ^2... \ B(x) = a_1 x ^ 0 + a_3x^1 + a_5x^2...end{cases} ]

    [f(x) = A(x^2) + x * B(x ^ 2) ]

    (omega_n^k (k < frac n 2)) 带入

    [f(omega_n^k) = A(omega_n^{2k}) + omega_n^k B(omega_n^{2k}) ]

    [= A(omega_{frac n 2}^k) + omega_n^k B(omega_{frac n 2} ^ k) ]

    (omega_n^{k + frac n 2} ( k < frac n 2)) 带入

    [f(omega_n^{k + frac n 2}) = A(omega_n^{2k} * omega_n^n) -omega_n^k B(omega_n^{2k} * omega_n^n) ]

    [= A(omega_{frac n 2}^{k}) - omega_n^k B (w_{frac n 2}^k) ]

    n = 1时直接返回就行了

  • 相关阅读:
    ZKW费用流修正
    BZOJ 1060 [ZJOI2007]时态同步
    BZOJ 1059 [ZJOI2007]矩阵游戏
    腾讯WEB前端开发面试经历,一面二面HR面,面面不到!
    亲历腾讯WEB前端开发三轮面试经历及面试题
    2015大型互联网公司校招都开始了,薪资你准备好了嘛?
    10款最好的 Bootstrap 3.0 免费主题和模板
    python3之urllib基础
    python3下应用requests
    python心得二(编码问题)
  • 原文地址:https://www.cnblogs.com/XiaoVsun/p/13054241.html
Copyright © 2011-2022 走看看