43. Multiply Strings [Leetcode] [FFT] [python]

这是一篇关于使用快速傅里叶变换(FFT)解决LeetCode上的大数相乘问题的文章。博客详细介绍了如何将多项式从系数表示转换为点值表示,如何将两个多项式的点值表示相乘,以及如何将相乘后的点值表示转换回系数表示。通过离散傅里叶变换(DFT)和逆离散傅里叶变换(IDFT)进行操作,并讲解了FFT的优化和应用。
摘要由CSDN通过智能技术生成

查看题目
一道大数相乘的题,大数也可以看成是多项式,再运用FFT来处理。

粗略步骤:
1. 将多项式从系数表示转为点值表示
2. 把两个多项式的点值表示相乘
3. 将相乘后的点值表示转为系数表示


1. 将多项式从系数表示转为点值表示

系数表示: A(x)=a0+a1x+a2x2++an1xn1 A ( x ) = a 0 + a 1 x + a 2 x 2 + · · · + a n − 1 x n − 1
点值表示: (x0,A(x0))(x1,A(x1)) ( x 0 , A ( x 0 ) ) 、 ( x 1 , A ( x 1 ) 、 · · · ) 数个这样的点值对

这里我们巧妙地选择点值表示中的x值:
选择1的n次单位根

1的n次单位根: ωn=1 ω n = 1 ,共有n个不同的根
ωkn=cos(2πk/n)+isin(2πk/n) ω n k = c o s ( 2 π k / n ) + i ∗ s i n ( 2 π k / n )
其中 i2=1 i 2 = − 1

那么 A(ω)=a0+a1ω+a2ω2++an1ωn1 A ( ω ) = a 0 + a 1 ω + a 2 ω 2 + · · · + a n − 1 ω n − 1

系数向量 a⃗ =(a0,a1,,an1) a → = ( a 0 , a 1 , · · · , a n − 1 )
值向量 A⃗ =(A(ω0n),A(ω1n),,A(ωn1n)) A → = ( A ( ω n 0 ) , A ( ω n 1 ) , · · · , A ( ω n n − 1 ) )

A⃗ =DFT(a⃗ ) A → = D F T ( a → )
这里我们称为离散傅里叶变换

A1 = dft(a1)
A2 = dft(a2)

2. 把两个多项式的点值表示相乘

for i in range(n):
    A[i] = A1[i]*A2[i]

3. 将相乘后的点值表示转为系数表示

离散傅里叶变换可写为矩阵形式 Wa⃗ =A⃗  W ∗ a → = A →

1111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值