1 欧拉公式
eiπ-1=0;
i=(-1)1/2,就是虚数。
写个方程
y=eix;
求导 y’=ieix;
如果把y看做向量,那么y’则垂直于y,也就是垂直于实轴;
通常,导数可以看做y增长的速度;
那么二次导数可以看做加速度;
求二次导 y’’=-1eix;
可以看出加速度垂直于速度,那么这个y点,将做圆周运动;
由于导数的绝对值是1,所以当x=x1时,y点将走过一段长为x1的圆弧,当x=π时,刚好转了半圈,所以才有
eiπ-1=0;
然后所以得出
eix=cos(x)+isin(x),x=[0,2π];
可以把复平面中的乘法理解为旋转;
eia*eib=ei(a+b);
也就是复数相乘,等于模相乘,弧度相加,但在这里,模都是1,所以只有弧度相加。
2 多项式的表示
f(x)=a0+a1x+a2x2+……+anxn;
这是系数表示法
如果这样的两个多项式相乘,就会很麻烦,要算n2次,所以要把多项式转化成一些点,然后将点相乘,就可以简单点,只需算n次;
我们可以用几个点来确定这个多项式,最简单的情况就是告诉你两个点,你可以确定一条直线,f(x)=a0+a1x,这条直线有a0,a1,两个未知数,你可以用两个点确定。
那么对于f(x)=a0+a1x+a2x2+……+anxn;
你可以用n+1个点确定(从0到n)。
点值相乘
举个例子
A(x)=a0+a1x;
由(x1,yA1),(x2,yA2)确定;
B(x)=b0+b1x
;由(x1,yB1),(x2,yB2)确定;
A(x) * B(x)=C(x)=c0+c1x+c2x2;
你把两条直线相乘可以得到一条二次函数线(抛物线),你把A,B两条直线的两个点对应的y值相乘,可以得到位于C曲线上的两个点
(x1,yC1),(x2,yC2),yC1=yA1 *yB2 , yC2=yA2 *yB2;
那么很显然,C有三个未知数(c0,c1,c2),需要三个点才能确定。
所以尽管你可以用两个点确定这条直线,但为了用点值相乘后的点确定这条抛物线,你还是需要在这条直线上选取3个点才行。
所以
A(x)=a0+a1x+…+anxn;
B(x)=b0+b1x+…+bmxm;
A(x)*B(x)=C(x)=c0+c1x+…cn+mxn+m;
C由m+n+1个点确定(从0到m+n);
所以A和B要取各m+n+1个点
(x1,yA1),(x2,yA2)…(xm+n+1,yAm+n+1)
(x1,yB1),(x2,yB2)…(xm+n+1,yBm+n+1)
3傅里叶转换取点
你按正常方法算这些点的y值也是很麻烦的
yA1=a0+a1x1+…+anx1n;
算一个点就需要加n次
况且你需要算n+m+1个点;
所以我们选用傅里叶转换的方法取点,
因为待会可以将其升级为快速傅里叶转换(fft);
在复平面上取点
傅里叶转换取点是在复平面上取点,欧拉公式是在复平面上的一个圆,
eix=cos(x)+isin(x),x=[0,2π];
我们要取m+n+1个点,也就是说需要m+n+1个x;
那我们就把这个圆用m+n+1个点平分,每一个点代表一个x的值;
设一个t=(2π/(m+n+1)),那么每一段弧度为eit,
设w=eit,我们可以将其称为单位弧度;
这次的x我们从0来编号(因为在圆中,2π=0);
x0=w0,
yA0=a0+a1(w0)+a2(w0)2+…+an(w0)n;
yB0=b0+b1(w0)+b2(w0)2+…+bm(w0)m
下面以此类推,将w0换成w1,w2等
x1=w1;
x2=w2
.
.
.
xn+m=wm+n;
为什么要这么取点呢,因为除了可以fft外,还可以由点确定系数值时方便一些,你肯定不希望通过联立方程组来求未知数吧。
傅里叶逆转换
傅里叶逆转换就是由点确定系数
先不进行相乘,先只是傅里叶转换然后逆转换;
那么只取n+1个点就行了
这里t=2π/(n+1),w=eit;
y0=a0+a1(w0)+a2(w0)2+…+an(w0)n=Σi=0n(ai(w0)i);
y1=Σi=0n(ai(w1)i);
y2=Σi=0n(ai(w2)i);
.
.
yn=Σi=0n(ai(wn)i);
然后再设一个多项式
P(x)=y0+y1x+y2x2+…+ynxn;
然后先说一个结论,
P(w-i)=ai/(n+1);
形象理解一下,P(x)一共有n+1项,每一项都含有ai(其余的a会相互抵消),所以要除(n+1),然后它为什么会等于ai呢,
举个例子‘
P(w-2)=a2/(n+1);
P(w-2)=Σi=0n(ai(w0)i)+Σi=0n(ai(w1)i)(w-2)1+Σi=0n(ai(w2)i)(w-2)2+…+Σi=0n(ai(wn)i)*(w-2)n;
会发现,当每一项的i=2时,其对应的a2的系数都会为一,可以说每一项的a2都“恰好被转回来了”,而其他的a的系数会相互抵消,假设n=4,然后以a3的系数被抵消为例,
第1项的a3的系数为1;
第2项的a3的系数为(w1)3 *(w-2)1=w1;
第3项的a3的系数为(w2)3 *(w-2)2=w2;
第4项的a3的系数为(w3)3 *(w-2)3=w3;
第5项的a3的系数为(w4)3 *(w-2)4=w4;
w=ei(2π/5);
这五个数在复平面上的点刚好是正五边形的五个顶点,画个图试试,把这五个数代表的复平面向量加起来,刚好为零。
所以这个傅里叶逆转换可以理解为,所求的系数刚好都被刚好“逆转”到了实数轴,其他的系数散落在负平面上的圆上,其点组成的图形的重心在圆心,所以互相抵消为零。
4快速傅里叶转换
主要快在取点上,从这里开始,多项式一共有n项,且n为2的整数次幂;
举个例子,假设n=8;
A(x)=a0+a1x1+a2x2+…+a7x7;
y0=a0+a2+a4+a6 + a1+a3+a5+a7;
y4的,我就直接把w4(w=ei(2π/8))带进去算出来
y4=a0+a2+a4+a6 - a1-a3-a5-a7;
y2=a0+a4-a2-a6 +w2(a1+a5-a3-a7);
y6=a0+a4-a2-a6 -w2(a1+a5-a3-a7);
把每个y分为两部分,a下标为偶数一部分,奇数一部分。
y=(a0+a2x2+a4x4+a6x6)+x(a1+a3x2+a5x4+a7x6);
而wi=-wi+n/2;
yi=X+Y;
yi+n/2=X-Y;i<=n/2;
所以我们只求出一半的y就可以直接得出另一半,既然可以这样那我们得寸进尺只求出一半的一半就可以了,再少一点…
仔细观察y0与y2
y0=a0+a2+a4+a6 + a1+a3+a5+a7;
y2=a0+a4-a2-a6 +x(a1+a5-a3-a7);
所以,一半的一半
y=(a0+a4x4+x2(a2+a6x4))+x(a1+a5x4+x2(a3+a7x4));
然后一直二分,复杂度只有nlogn;
所以我们先求最小的一部分然后两两合并…
快速逆转换也和这个一样,只是系数变了;
5程序
如果题目给的两个多项式的项数,xn,xm,
最后一共m+n+1项,如果不是2的幂,那么就补上系数为零的项;
然后因为递归还是要慢一些,所以我们先把数组转换成二分完之后的顺序,以8为例
0 1 2 3 4 5 6 7
0 4 2 6 1 5 3 7
用二进制表示就是
000 001 010 011 100 101 111
000 100 010 110 001 101 111
就是把每一个数的二进制倒过来了。
转换之后直接按顺序算,先每2个算,然后合并成4个,4个合并成8个…
下面这个是洛谷模板题,题解中有代码
链接: P3803.
来源:CSDN
作者:Cyber angel
链接:https://blog.csdn.net/zhanglikun19/article/details/104168132