大数Toom-Cook乘法尝试帖
无心人 2008-03-01 09:41:08 大数
U V分别具有二进位数lu, lv (lu >= lv)
现把U V表示为多项式
设n为32的倍数,且(lu / n) = m, (lv / n) = n
则有多项式
U(x) = U(m-1)x^(m-1) + U(m - 2)x^(m-2) + ... + U(1)x + U(0) U(2^n) = U
V(x) = V(n-1)x^(n-1) + ... + V(1)x + V(0) V(2^n) = V
令W(x) = U(x)V(x)
则UV = W(2^n) 为U和V的乘积
令W(m+n-2) = U(m+n-2)V(m+n-2)
W(m+n-3) = U(m+n-3)V(m+n-3)
W(m+n-4) = U(m+n-4)V(m+n-4)
...
W(1) = U(1)V(1)
W(0) = U(0)V(0)
则 进行下列运算
for (i = 2; i <= m+n-2; i ++)
for (j = i; j <= m+n-2; j ++)
W(j) = (W(j) - W(j-1)) / i;
输出W(m+n-2), W(m+n-1), ... W(1), W(0)
则W(x) = W(m+n-2)x^(m+n-2) + W(m+n-3)x^(M+n-3) + ... W(1)x + W(0)
此时
对最后的乘积
可由诸W(i)通过加法移位来计算
下次讨论如何分块等