https://blog.csdn.net/enjoy_pascal/article/details/81478582

FFT前言
快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

FFT(Fast Fourier Transformation) 是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

——百度百科

FFT(Fast Fourier Transformation),中文名快速傅里叶变换,用来加速多项式乘法
朴素高精度乘法时间O(n2) O(n^2)O(n
2
),但FFT FFTFFT能O(nlog2n) O(n\log_2 n)O(nlog
2

n)的时间解决
FFT FFTFFT名字逼格高,也难懂,其他教程写得让人看不太懂,于是自己随便写一下

建议对复数、三角函数相关知识有所耳闻 (不会也无所谓)

下面难懂的点我会从网上盗

多项式的系数表示法和点值表示法
FFT FFTFFT其实是一个用O(nlog2n) O(n\log_2n)O(nlog
2

n)的时间将一个用系数表示的多项式转换成它的点值表示的算法

多项式的系数表示和点值表示可以互相转换

系数表示法
一个n-1次n项多项式f(x) f(x)f(x)可以表示为f(x)=∑n−1i=0aixi f(x)=\sum^{n-1}_{i=0}a_ix^if(x)=∑
i=0
n−1

a
i

x
i

也可以用每一项的系数来表示f(x) f(x)f(x),即
f(x)={a0,a1,a2,...,an−1} f(x)=\{a_0,a_1,a_2,...,a_{n-1} \}
f(x)={a
0

,a
1

,a
2

,...,a
n−1

}

这就是系数表示法,也就是平时数学课上用的方法

点值表示法
把多项式放到平面直角坐标系里面,看成一个函数

把n nn个不同的x xx代入,会得出n nn个不同的y yy,在坐标系内就是n nn个不同的点

那么这n nn个点唯一确定该多项式,也就是有且仅有一个多项式满足∀k,f(xk)=yk ∀k,f(x_k)=y_k∀k,f(x
k

)=y
k

理由很简单,把n nn条式子联立起来成为一个有n条方程的n元方程组,每一项的系数都可以解出来

那么f(x) f(x)f(x)还可以用f(x)={(x0,f(x0)),(x1,f(x1)),(x2,f(x2)),...,(xn−1,f(xn−1))} f(x)=\{(x_0,f(x_0)),(x_1,f(x_1)),(x_2,f(x_2)),...,(x_{n-1},f(x_{n-1}))\}f(x)={(x
0

,f(x
0

)),(x
1

,f(x
1

)),(x
2

,f(x
2

)),...,(x
n−1

,f(x
n−1

))}来表示
这就是点值表示法

高精度乘法下两种多项式表示法的区别
对于两个用系数表示的多项式,我们把它们相乘
设两个多项式分别为A(x),B(x) A(x),B(x)A(x),B(x)
我们要枚举A AA每一位的系数与B BB每一位的系数相乘
那么系数表示法做多项式乘法时间复杂度O(n2) O(n^2)O(n
2
)

但两个用点值表示的多项式相乘,只需要O(n) O(n)O(n)的时间

什么意思呢?

设两个点值多项式分别为
f(x)={(x0,f(x0)),(x1,f(x1)),(x2,f(x2)),...,(xn−1,f(xn−1))} f(x)=\{(x_0,f(x_0)),(x_1,f(x_1)),(x_2,f(x_2)),...,(x_{n-1},f(x_{n-1}))\}
f(x)={(x
0

,f(x
0

)),(x
1

,f(x
1

)),(x
2

,f(x
2

)),...,(x
n−1

,f(x
n−1

))}
g(x)={(x0,g(x0)),(x1,g(x1)),(x2,g(x2)),...,(xn−1,g(xn−1))} g(x)=\{(x_0,g(x_0)),(x_1,g(x_1)),(x_2,g(x_2)),...,(x_{n-1},g(x_{n-1}))\}
g(x)={(x
0

,g(x
0

)),(x
1

,g(x
1

)),(x
2

,g(x
2

)),...,(x
n−1

,g(x
n−1

))}

设它们的乘积是h(x) h(x)h(x),那么
h(x)={(x0,f(x0)⋅g(x0)),(x1,f(x1)⋅g(x1)),...,(xn−1,f(xn−1)⋅g(xn−1))} h(x)=\{(x_0,f(x_0)·g(x_0)),(x_1,f(x_1)·g(x_1)),...,(x_{n-1},f(x_{n-1})·g(x_{n-1}))\}
h(x)={(x
0

,f(x
0

)⋅g(x
0

)),(x
1

,f(x
1

)⋅g(x
1

)),...,(x
n−1

,f(x
n−1

)⋅g(x
n−1

))}

所以这里的时间复杂度只有一个枚举的O(n) O(n)O(n)

突然感觉高精度乘法能O(n) O(n)O(n)暴艹一堆题?

但是朴素的系数表示法转点值表示法的算法还是O(n2) O(n^2)O(n
2
)的,逆操作类似

朴素系数转点值的算法叫DFT(离散傅里叶变换),点值转系数叫IDFT(离散傅里叶逆变换)

难道高精度乘法只能O(n2) O(n^2)O(n
2
)了吗?

DFT前置知识&技能
复数
毕竟高中有所以不多说

我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位。当虚部等于零时,这个复数可以视为实数;当z的虚部不等于零时,实部等于零时,常称z为纯虚数。复数域是实数域的代数闭包,也即任何复系数多项式在复数域中总有根。 复数是由意大利米兰学者卡当在十六世纪首次引入,经过达朗贝尔、棣莫弗、欧拉、高斯等人的工作,此概念逐渐为数学家所接受。
——百度百科

初中数学老师会告诉你没有−1−−−√ \sqrt{-1}
−1

,但仅限R RR
扩展至复数集C CC,定义i2=−1 i^2=-1i
2
=−1,一个复数z zz可以表示为z=a+bi(a,b∈R) z=a+bi(a,b\in R)z=a+bi(a,b∈R)
其中a aa称为实部,b bb称为虚部,i ii称为虚数单位

在复数集中就可以用i ii表示负数的平方根,如−7−−−√=7–√i \sqrt{-7}=\sqrt{7}i
−7

=
7

i
还可以把复数看成复平面直角坐标系上的一个点,比如下面

x xx轴就是实数集中的坐标轴,y yy轴就是虚数单位i ii轴

这个点(2,3) (2,3)(2,3)表示的复数就是2+3i 2+3i2+3i,或者想象它代表的向量为(2,3) (2,3)(2,3)
其实我们还可以自己想象 (其实没有这种表达方式) 它可以表示为(13−−√,θ) (\sqrt{13},\theta)(
13

,θ)
一个复数z zz的模定义为它到原点的距离,记为∣z∣=a2+b2−−−−−−√ |z|=\sqrt{a^2+b^2}∣z∣=
a
2
+b
2

一个复数z=a+bi z=a+biz=a+bi的共轭复数为a−bi a-bia−bi(虚部取反),记为z¯=a−bi \overline{z}=a-bi
z
=a−bi

复数的运算
复数不像点或向量,它和实数一样可以进行四则运算
设两个复数分别为z1=a+bi,z2=c+di z_1=a+bi,z_2=c+diz
1

=a+bi,z
2

=c+di,那么
z1+z2=(a+c)+(b+d)i z_1+z_2=(a+c)+(b+d)i
z
1

+z
2

=(a+c)+(b+d)i
z1z2=(ac−bd)+(ad+bc)i z_1z_2=(ac−bd)+(ad+bc)i
z
1

z
2

=(ac−bd)+(ad+bc)i

复数相加也满足平行四边形法则

这张是从网上盗的

即AB+AD=AC AB+AD=ACAB+AD=AC

复数相乘还有一个值得注意的小性质
(a1,θ1)∗(a2,θ2)=(a1a2,θ1+θ2) (a_1,\theta_1)*(a_2,\theta_2)=(a_1a_2,\theta_1+\theta_2)
(a
1


1

)∗(a
2


2

)=(a
1

a
2


1


2

)

即模长相乘,极角相加

DFT(离散傅里叶变换)
一定注意从这里开始所有的n nn都默认为2 22的整数次幂
对于任意系数多项式转点值,当然可以随便取任意n nn个x xx值代入计算
但是暴力计算x0k,x1k,...,xn−1k(k∈[0,n)) x_k^0,x_k^1,...,x_k^{n-1}(k\in[0,n))x
k
0

,x
k
1

,...,x
k
n−1

(k∈[0,n))当然是O(n2) O(n^2)O(n
2
)的时间
其实可以代入一组神奇的x xx,代入以后不用做那么多的次方运算
这些x xx当然不是乱取的,而且取这些x xx值应该就是 傅里叶 的主意了

考虑一下,如果我们代入一些x xx,使每个x xx的若干次方等于1 11,我们就不用做全部的次方运算了
±1 ±1±1是可以的,考虑虚数的话±i ±i±i也可以,但只有这四个数远远不够

傅里叶说:这个圆圈上面的点都可以做到

以原点为圆心,画一个半径为1 11的单位圆
那么单位圆上所有的点都可以经过若干次次方得到1 11
傅里叶说还要把它给n nn等分了,比如此时n=8 n=8n=8

橙色点即为n=8 n=8n=8时要取的点,从(1,0) (1,0)(1,0)点开始,逆时针从0 00号开始标号,标到7 77号
记编号为k kk的点代表的复数值为ωkn \omega_n^kω
n
k

,那么由模长相乘,极角相加可知(ω1n)k=ωkn (\omega_n^1)^k=\omega_n^k(ω
n
1

)
k

n
k

其中ω1n \omega_n^1ω
n
1

称为n nn次单位根,而且每一个ω \omegaω都可以求出 (我三角函数不好)
ωkn=coskn2π+isinkn2π \omega_n^k=\cos{k\over n}2π+i\sin{k\over n} 2π
ω
n
k

=cos
n
k

2π+isin
n
k

或者说也可以这样解释这条式子

注意sin2θ+cos2θ=1 sin^2\theta+cos^2\theta=1sin
2
θ+cos
2
θ=1什么的,就容易理解了

那么ω0n,ω1n,...,ωn−1n \omega^0_n,\omega^1_n,...,\omega^{n-1}_nω
n
0


n
1

,...,ω
n
n−1

即为我们要代入的x0,x1,...,xn−1 x_0,x_1,...,x_{n-1}x
0

,x
1

,...,x
n−1

单位根的一些性质
推FFT FFTFFT的过程中需要用到ω \omegaω的一些性质

ωkn=ω2k2n \omega^k_n=\omega^{2k}_{2n}ω
n
k


2n
2k

它们表示的点(或向量)表示的复数是相同的

证明

ωkn=coskn2π+isinkn2π=cos2k2n2π+isin2k2n2π=ω2k2n \omega^k_n=cos{k\over n}2π+isin{k\over n} 2π=cos{2k\over 2n}2π+isin{2k\over 2n} 2π=\omega^{2k}_{2n}ω
n
k

=cos
n
k

2π+isin
n
k

2π=cos
2n
2k

2π+isin
2n
2k

2π=ω
2n
2k

ωk+n2n=−ωkn \omega^{k+{n \over 2}}_n=-\omega_n^kω
n
k+
2
n


=−ω
n
k

它们表示的点关于原点对称,所表示的复数实部相反,所表示的向量等大反向

证明

ωn2n=cosn2n2π+isinn2n2π=cosπ+isinπ=−1 \omega^{n\over 2}_n=cos{{n\over 2}\over n}2\pi+isin{{n\over 2}\over n}2\pi=cos\pi+isin\pi=-1ω
n
2
n


=cos
n
2
n


2π+isin
n
2
n


2π=cosπ+isinπ=−1

(这个东西和eix=cosx+isinx e^{ix}=cosx+isinxe
ix
=cosx+isinx与eiπ+1=0 e^{i\pi}+1=0e

+1=0有点关系,我不会就不讲了)

ω0n=ωnn \omega^0_n=\omega^n_nω
n
0


n
n

都等于1 11,或1+0i 1+0i1+0i
FFT(快速傅里叶变换)
虽然DFT DFTDFT搞出来一堆很牛逼的ω \omegaω作为代入多项式的x xx值
但只是代入这类特殊x xx值法的变换叫做DFT DFTDFT而已,还是要代入单位根暴力计算

DFT还是暴力O(n2) O(n^2)O(n
2
)……
但DFT DFTDFT可以分治来做,于是 FFT(快速傅里叶变换) 就出来了
首先设一个多项式A(x) A(x)A(x)
A(x)=∑n−1i=0aixi=a0+a1x+a2x2+...+an−1xn−1 A(x)=\sum^{n-1}_{i=0}a_ix^i=a_0+a_1x+a_2x^2+...+a_{n-1}x^{n-1}
A(x)=
i=0

n−1

a
i

x
i
=a
0

+a
1

x+a
2

x
2
+...+a
n−1

x
n−1

按A(x) A(x)A(x)下标的奇偶性把A(x) A(x)A(x)分成两半,右边再提一个x xx

A(x)=(a0+a2x2+...+an−2xn−2)+(a1x+a3x3+...+an−1xn−1) A(x)=(a_0+a_2x^2+...+a_{n-2}x^{n-2})+(a_1x+a_3x^3+...+a_{n-1}x^{n-1})
A(x)=(a
0

+a
2

x
2
+...+a
n−2

x
n−2
)+(a
1

x+a
3

x
3
+...+a
n−1

x
n−1
)

=(a0+a2x2+...+an−2xn−2)+x(a1+a3x2+...+an−1xn−2) =(a_0+a_2x^2+...+a_{n-2}x^{n-2})+x(a_1+a_3x^2+...+a_{n-1}x^{n-2})
=(a
0

+a
2

x
2
+...+a
n−2

x
n−2
)+x(a
1

+a
3

x
2
+...+a
n−1

x
n−2
)

两边好像非常相似,于是再设两个多项式A1(x),A2(x) A_1(x),A_2(x)A
1

(x),A
2

(x),令

A1(x)=a0+a2x+a4x2+...+an−2xn2−1 A_1(x)=a_0+a_2x+a_4x^2+...+a_{n-2}x^{{n\over 2}-1}
A
1

(x)=a
0

+a
2

x+a
4

x
2
+...+a
n−2

x
2
n

−1

A2(x)=a1+a3x+a5x2+...+an−1xn2−1 A_2(x)=a_1+a_3x+a_5x^2+...+a_{n-1}x^{{n \over 2}-1}
A
2

(x)=a
1

+a
3

x+a
5

x
2
+...+a
n−1

x
2
n

−1

比较明显得出
A(x)=A1(x2)+xA2(x2) A(x)=A_1(x^2)+xA_2(x^2)
A(x)=A
1

(x
2
)+xA
2

(x
2
)

再设k&lt;n2 k&lt;{n\over 2}k<
2
n

,把ωkn \omega^k_nω
n
k

作为x xx代入A(x) A(x)A(x)(接下来几步变换要多想想单位根的性质)

A(ωkn)=A1((ωkn)2)+ωknA2((ωkn)2) A(\omega^k_n)=A_1((\omega^k_n)^2)+\omega^k_nA_2((\omega^k_n)^2)
A(ω
n
k

)=A
1

((ω
n
k

)
2
)+ω
n
k

A
2

((ω
n
k

)
2
)
=A1(ω2kn)+ωknA2(ω2kn)=A1(ωkn2)+ωknA2(ωkn2) =A_1(\omega^{2k}_n)+\omega^k_nA_2(\omega^{2k}_n)=A_1(\omega^k_{n\over2})+\omega^k_nA_2(\omega^k_{n\over 2})
=A
1


n
2k

)+ω
n
k

A
2


n
2k

)=A
1


2
n

k

)+ω
n
k

A
2


2
n

k

)

那么对于A(ωk+n2n) A(\omega^{k+{n\over2}}_n)A(ω
n
k+
2
n


)的话,代入ωk+n2n \omega^{k+{n \over 2}}_nω
n
k+
2
n

A(ωk+n2n)=A1(ω2k+nn)+ωk+n2nA2(ω2k+nn) A(\omega^{k+{n\over 2}}_n)=A_1(\omega^{2k+n}_n)+\omega^{k+{n\over 2}}_nA_2(\omega^{2k+n}_n)
A(ω
n
k+
2
n


)=A
1


n
2k+n

)+ω
n
k+
2
n


A
2


n
2k+n

)
=A1(ω2knωnn)−ωknA2(ω2knωnn) =A_1(\omega^{2k}_n\omega^n_n)-\omega^k_nA_2(\omega^{2k}_n\omega^n_n)
=A
1


n
2k

ω
n
n

)−ω
n
k

A
2


n
2k

ω
n
n

)
=A1(ω2kn)−ωknA2(ω2kn)=A1(ωkn2)−ωknA2(ωkn2) =A_1(\omega^{2k}_n)-\omega^k_nA_2(\omega^{2k}_n)=A_1(\omega^k_{n\over2})-\omega^k_nA_2(\omega^k_{n\over2})
=A
1


n
2k

)−ω
n
k

A
2


n
2k

)=A
1


2
n

k

)−ω
n
k

A
2


2
n

k

)

发现了什么?
A(ωkn) A(\omega^k_n)A(ω
n
k

)和A(ωk+n2n) A(\omega^{k+{n\over2}}_n)A(ω
n
k+
2
n


)两个多项式后面一坨东西只有符号不同
就是说,如果已知A1(ωkn2) A_1(\omega^k_{n\over 2})A
1


2
n

k

)和A2(ωkn2) A_2(\omega^k_{n\over 2})A
2


2
n

k

)的值,我们就可以同时知道A(ωkn) A(\omega^k_n)A(ω
n
k

)和A(ωk+n2n) A(\omega^{k+{n\over2}}_n)A(ω
n
k+
2
n


)的值
现在我们就可以递归分治来搞FFT FFTFFT了

每一次回溯时只扫当前前面一半的序列,即可得出后面一半序列的答案
n==1 n==1n==1时只有一个常数项,直接return returnreturn
时间复杂度O(nlog2n) O(n\log_2n)O(nlog
2

n)

IFFT(快速傅里叶逆变换)
想一下,我们不仅要会FFT FFTFFT,还要会IFFT(快速傅里叶逆变换)
我们把两个多项式相乘 (也叫求卷积),做完两遍FFT FFTFFT也知道了积的多项式的点值表示
可我们平时用系数表示的多项式,点值表示没有意义

怎么把点值表示的多项式快速转回系数表示法?

IDFT IDFTIDFT暴力O(n2) O(n^2)O(n
2
)做?其实也可以用FFT FFTFFT用O(nlog2n) O(n\log_2n)O(nlog
2

n)的时间搞

你有没有想过为什么傅里叶是把ωkn \omega^k_nω
n
k

作为x xx代入而不是别的什么数?
原因是有的但是有我也看不懂
由于我是沙雕所以只用记住一个结论

一个多项式在分治的过程中乘上单位根的共轭复数,分治完的每一项除以n nn即为原多项式的每一项系数
意思就是说FFT FFTFFT和IFFT IFFTIFFT可以一起搞

朴素版FFT板子
c++ c++c++有自带的复数模板complex complexcomplex库
a.real() a.real()a.real()即表示复数a aa的实部

#include<complex>
#define cp complex<double>

void fft(cp *a,int n,int inv)//inv是取共轭复数的符号
{
if (n==1)return;
int mid=n/2;
static cp b[MAXN];
fo(i,0,mid-1)b[i]=a[i*2],b[i+mid]=a[i*2+1];
fo(i,0,n-1)a[i]=b[i];
fft(a,mid,inv),fft(a+mid,mid,inv);//分治
fo(i,0,mid-1)
{
cp x(cos(2*pi*i/n),inv*sin(2*pi*i/n));//inv取决是否取共轭复数
b[i]=a[i]+x*a[i+mid],b[i+mid]=a[i]-x*a[i+mid];
}
fo(i,0,n-1)a[i]=b[i];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
两个多项式a,b a,ba,b相乘再转系数多项式c cc,通常只用打这么一小段

cp a[MAXN],b[MAXN];
int c[MAXN];
fft(a,n,1),fft(b,n,1);//1系数转点值
fo(i,0,n-1)a[i]*=b[i];
fft(a,n,-1);//-1点值转系数
fo(i,0,n-1)c[i]=(int)(a[i].real()/n+0.5);//注意精度
1
2
3
4
5
6
很明显,FFT只能处理n nn为2 22的整数次幂的多项式
所以在FFT FFTFFT前一定要把n nn调到2 22的次幂

这个板子看着好像很优美,但是

递归常数太大,要考虑优化…

FFTの优化——迭代版FFT
这个图也是盗的

这个很容易发现点什么吧?

每个位置分治后的最终位置为其二进制翻转后得到的位置
这样的话我们可以先把原序列变换好,把每个数放在最终的位置上,再一步一步向上合并
一句话就可以O(n) O(n)O(n)预处理第i ii位最终的位置rev[i] rev[i]rev[i]

fo(i,0,n-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
1
至于蝴蝶变换它死了其实是我不会

真·FFT板子
void fft(cp *a,int inv)
{
int bit=0;
while ((1<<bit)<n)bit++;
fo(i,0,n-1)
{
rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
if (i<rev[i])swap(a[i],a[rev[i]]);//不加这条if会交换两次(就是没交换)
}
for (int mid=1;mid<n;mid*=2)//mid是准备合并序列的长度的二分之一
{
cp temp(cos(pi/mid),inv*sin(pi/mid));//单位根,pi的系数2已经约掉了
for (int i=0;i<n;i+=mid*2)//mid*2是准备合并序列的长度,i是合并到了哪一位
{
cp omega(1,0);
for (int j=0;j<mid;j++,omega*=temp)//只扫左半部分,得到右半部分的答案
{
cp x=a[i+j],y=omega*a[i+j+mid];
a[i+j]=x+y,a[i+j+mid]=x-y;//这个就是蝴蝶变换什么的
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这个板子好像不是那么好背
至少这个板子已经很优美了

FFT后记
本人版权意识薄弱……

本博客部分知识学习于

https://www.cnblogs.com/RabbitHu/p/FFT.html

https://www.cnblogs.com/zwfymqz/p/8244902.html?mType=Group#_label3

https://blog.csdn.net/ggn_2015/article/details/68922404

NTT NTTNTT我来了
---------------------
作者:路人黑的纸巾
来源:CSDN
原文:https://blog.csdn.net/enjoy_pascal/article/details/81478582
版权声明:本文为博主原创文章,转载请附上博文链接!

十分简明易懂的FFT(快速傅里叶变换)的更多相关文章

  1. FFT 快速傅里叶变换 学习笔记

    FFT 快速傅里叶变换 前言 lmc,ikka,attack等众多大佬都没教会的我终于要自己填坑了. 又是机房里最后一个学fft的人 早背过圆周率50位填坑了 用处 多项式乘法 卷积 \(g(x)=a ...

  2. CQOI2018 九连环 打表找规律 fft快速傅里叶变换

    题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...

  3. 「学习笔记」FFT 快速傅里叶变换

    目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...

  4. FFT —— 快速傅里叶变换

    问题: 已知A[], B[], 求C[],使: 定义C是A,B的卷积,例如多项式乘法等. 朴素做法是按照定义枚举i和j,但这样时间复杂度是O(n2). 能不能使时间复杂度降下来呢? 点值表示法: 我们 ...

  5. [C++] 频谱图中 FFT快速傅里叶变换C++实现

    在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...

  6. matlab中fft快速傅里叶变换

    视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...

  7. FFT快速傅里叶变换算法

    1.FFT算法概要: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换 ...

  8. FFT快速傅里叶变换

    FFT太玄幻了,不过我要先膜拜HQM,实在太强了 1.多项式 1)多项式的定义 在数学中,由若干个单项式相加组成的代数式叫做多项式.多项式中的每个单项式叫做多项式的项,这些单项式中的最高项次数,就是这 ...

  9. FFT(快速傅里叶变换)

    学习了FFT用来求多项式的乘法,看了算导上的介绍,上面讲的非常明白,概括一下FFT的原理就是,我们在计算多项式的乘法时,如果暴力模拟的话是n^2 复杂度的,就像小学学的竖式乘法一样,比如一个n位数乘上 ...

随机推荐

  1. 冰蝎动态二进制加密WebShell基于流量侧检测方案

    概述 冰蝎是一款新型动态二进制加密网站工具.目前已经有6个版本.对于webshell的网络流量侧检测,主要有三个思路.一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒.二:we ...

  2. haproxy+keepalive双主高可用实现负载均衡

    转载自https://blog.51cto.com/3381847248/1977073 前面我已经介绍了haproxy结合keepalive做简单的双主高可用,如果不清楚的话,可以去我的上一 篇博客 ...

  3. jquery动态选中radio,获取radio选中值

    //动态选中radio值,1:表示radio的name 2:表示后台传过来的radio值$(":radio[name='1'][value='" + 2 + "']&qu ...

  4. leetcode1143 Longest Common Subsequence

    """ Given two strings text1 and text2, return the length of their longest common subs ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-minus

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. eclipse中使用jstl

    错误提示为"can not find the tag library for http://java.sun.com/jsp/jstl/core" 这是我在练习把axis2和普通j ...

  7. 二十一、JavaScript之访问对象属性

    一.代码如下 二.执行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...

  8. ZOJ 3795 Grouping 强连通分量-tarjan

    一开始我还天真的一遍DFS求出最长链以为就可以了 不过发现存在有向环,即强连通分量SCC,有向环里的每个点都是可比的,都要分别给个集合才行,最后应该把这些强连通分量缩成一个点,最后保证图里是 有向无环 ...

  9. 一、REACT概述

    1.前端/react概述 <从零react> 1.前端工 程概述 Web跨平台.跨浏览 器的应用开发场景 网页浏览器(Web Browser) 通过 CLI 指令去操作的 Headless ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 异常处理

    异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw ...