FFT,(大数乘法)

这篇博客介绍了快速傅里叶变换(FFT)如何用于优化多项式乘法的时间复杂度。在系数表示法下,乘法的时间复杂度是O(n^2),而通过点值表示法可以降至O(n)。FFT包括求值(DFT)和插值(IDFT)两步,分别将系数表示法转换为点值表示法和反之。文章提供了一个计算大数乘法的模板和实例,解释了如何利用FFT高效地计算两个大数的乘积。
摘要由CSDN通过智能技术生成

多项式系数表示法:
在这里插入图片描述
多项式点值表示法
在这里插入图片描述
系数表示法算多项式乘法的时间复杂度是O(n^2),而通过点值表示法我们可以发现两个多项式P,Q,同时取点x时,得到的是y1和y2,即取到的点分别为(x,y1),(x,y2)而PQ会取到的点为(x,y1y2),那么计算P*Q的点表达式的时间复杂度就是O(n)的。

FFT就是将系数表示法转化成点值表示法相乘,再由点值表示法转化为系数表示法的过程,第一个过程叫做求值(DFT),第二个过程叫做插值(IDFT)

模板:

		//R[]这是一个数组,用于储存二进制反转的结果
		//#define il inline
		const double Pi = acos(-1.0) ; //圆周率pai
		struct node{
                               //定义一个虚数结构体: 
		    double x, y ;
		    node (double xx = 0, double yy = 0){
   
		        x = xx, y = yy ;
		    }
		}A[MAXN], B[MAXN] ;
		node operator * (node J, node Q){
     // 重载运算符:
		    return node(J.x * Q.x - J.y * Q.y , J.x * Q.y + J.y * Q.x);
		}
		node operator + (node J, node Q){
   
		    return node(J.x + Q.x , J.y + Q.y);
		}
		node operator - (node J, node Q){
   
		    return node(J.x - Q.x , J.y - Q.y );
		}
		il void FFT(node *J, double flag){
          //将flag传入1,表示将系数表示法转换为点表示法,传入-1时表示由点表示法转换为系数表示法:
		    for(i = 0; i < Lim; i ++)
		        if(i < R[i]) swap(J[i], J[R[i]]) ;
		    for(j = 1; j < Lim; j <<= 1){
   
		        node T(cos(Pi / j), flag * sin(Pi / j)) ;
		        for(k = 0; k 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值