这个乘法算法似乎是最好的,感兴趣的来研究一下

yaos 2004-08-20 04:37:54
参考 TAOCP v2 习题4.6.4-59

序列 x[0] .. x[n-1]
y[0] .. y[n-1]
定义循环卷积
z[0] .. z[n-1]
其中 z[k] = x[0]*y[k] + x[1]*y[k-1] .. + x[k]*y[0] + x[k+1]*y[n-1] + x[k+2]*y[n-2] .. + x[n-1]*y[k+1]

同样定义负循环卷积
z[0] .. z[n-1]
其中 z[k] = x[0]*y[k] + x[1]*y[k-1] .. + x[k]*y[0] - x[k+1]*y[n-1] + x[k+2]*y[n-2] .. + x[n-1]*y[k+1]

则当n = 2 ^ k有循环卷积的快速算法
1、如果k = 2则直接计算 z[0] = x[0]*y[0] + x[1]*y[1]
z[1] = x[0]*y[1] + x[1]*y[0]

如果是负卷积 z[0] = x[0]*y[0] - x[1]*y[1]
z[1] = x[0]*y[1] + x[1]*y[0]
2、否则对m = 2 ^ (k - 1) i = 0..m-1
x[i] = x[i] + x[m+i]
x[m+i] = x[i] - x[m+i]
y[i] = y[i] + y[m+i]
y[m+i] = y[i] - y[m+i]
3、分别计算x[0]..x[m-1]与y[0]..y[m-1]的循环卷积
x[m]..x[2*m-1]与y[m]..y[2*m-1]的负循环卷积
4、对结果z[0]..z[n-1]计算
m = n / 2 i = 0..m - 1
z[i] = (z[i] + z[m + i) / 2
z[m + i] = (z[i] - z[m + i) / 2

则z是x, y的循环卷积

如果保证 x, y中 i = m-1以上的值,x[i] = y[i] = 0
则经过简单的规格化,z就是x, y在一定进制下的结果

现在有一个大问题
上边的算法只是循环卷积的算法,不是负循环卷积的算法,步骤2, 3, 4在负循环卷积的情况下很可能不一样,能不能推导出负循环卷积的情况

如果能,则这个算法要比FFT/FNT/NTT都简单,虽然算法不是最优化的,但是思路是最好的

我曾经用2, 1, 0, 0和4, 3, 0, 0做演算,结果是8, 10, 3, 0,确实能计算12 * 34

但是当长度扩展到8时结果完全不对了 :),所以负循环卷积存在问题
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
无心人 2004-08-21
  • 打赏
  • 举报
回复


寻求帮助,赶快实现负循环卷积,应该就是改变几个+-号的问题
programfanny 2004-08-21
  • 打赏
  • 举报
回复
不懂,帮你顶吧。
无心人 2004-08-20
  • 打赏
  • 举报
回复
这个算法的原始参考文献在IEEE Trans. ASSP-28 (1980) 205-215,能找到原文献的最好

它是omega = 1, -1的FFT/FNT

knuth的书上还有一个比较复杂的算法,采用的流程就是FFT算法的流程

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧