用fft求大数乘法

设要求c=a·b,其中a的第i位为a_i,b、c类似。

从系数序列的角度看,将a表示为系数序列a=[a_0, a_1, ..., a_n-1],A=fft(a),b、c类似,则根据乘法计算法则,c=a*b(a与b的卷积)。卷积可以通过fft来计算,即C = fft(a*b)=A·B,c=ifft(C)。由于fft的时间复杂度为o(nlog n),故两个n位数乘法的时间复杂度为o(nlog n)。

求fft(a)实际上是在求多项式f_a(x)=a_0+a_1*x+a_2*x^2+...+a_{n-1}*x^{n-1}在x=1,W,W^2,...,W^{n-1}处的值,其中W=e^{-i\frac{2\pi}{n}},故也可以从多项式的角度看。

从多项式的角度看,a用多项式表示为f_a(x)=a_0+a_1*x+a_2*x^2+...+a_{n-1}*x^{n-1}。如果能高效地求出f_a(x)在某n个点处的取值,就能将这几个点分别对应相乘,求出f_c(x)在n个点处的取值,再用某种插值算法求出c多项式的系数,即可求出c。通过从系数序列角度启发,我们知道确实有这样的n个点,即x=1,W,W^2,...,W^{n-1},能够高效地求出这些点的取值(fft)。求出c对应的多项式在这n个点处的取值后,我们又发现当已知 x=1,W,W^2,...,W^{n-1} 处点的取值时,确实存在高效的插值算法(ifft),能求出c多项式的系数。

由多项式求n个特定点取值的算法和由n个特定点取值求多项式系数的算法,利用了复数的性质,本质上跟fft和ifft差不多,所以上面是从两个角度理解了快速计算大数乘法的原理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值