gxqcn 发表于 2008-4-17 21:30:18

原帖由 无心人 于 2008-4-17 21:18 发表 http://images.5d6d.net/dz60/common/back.gif
你说的例子叫三项式变换

确实是诱人
不过其$\alpha, N$都是多少?

M = p = 2^96 - 2^32 + 1

N = 2^32

\alpha = \text{PrimitiveRoot}[ M ] = 11

无心人 发表于 2008-4-17 21:39:38

因为$\alpha=11$所以不如NTT+CRT

无心人 发表于 2008-4-17 21:42:08

这里有个简单的

    $M=2^42+2^41+1, N=2^39,\alpha=8$

可惜$M$有点小哦

无心人 发表于 2008-4-17 21:43:28

另外,你的和我给出的都有缺点就是$N$太大了
太大的就不好利用

gxqcn 发表于 2008-4-18 07:46:28

原帖由 无心人 于 2008-4-17 21:43 发表 http://images.5d6d.net/dz60/common/back.gif
另外,你的和我给出的都有缺点就是$N$太大了
太大的就不好利用

N 的大小将决定一次变换可作的最大长度,当然是多多益善了!

\alpha = 8 也并不能带来多大的收益,
因为在计算 \alpha^r % M 时,也仅有极少的较小的 r 可以快速计算,
且这个一般是用类似查表的方式解决,所以不要太在意 \alpha 是否好算。

无心人 发表于 2008-4-18 07:58:40

:)

$N=2^32$你怎么利用啊
这个$N$,序列的长度必须严格是这么长啊

或者说,如果有序列长度短于它,则要补零到这个长度
则如果太短的序列,其效果就不如其他参数合适的NTT

================================================
另外$\alpha$是$2$的幂时的变换是移位操作
所以不用额外表

gxqcn 发表于 2008-4-18 08:06:05

你说反了,序列的长度是不能大于 $N$ 才对(经特殊处理,可达到 3N)。

“$\alpha$是$2$的幂时的变换是移位操作”,也仅能作有限次,
超出 M 的大小后一样需要其它操作才能求出剩余。

无心人 发表于 2008-4-18 08:41:38

:)

用小于N的序列你如何做变换?

$\alpha$是$2$幂时,如果$M$二进制表示简单,就有简化方法

liangbch 发表于 2008-4-18 10:22:18

原帖由 gxqcn 于 2008-4-17 21:03 发表 http://images.5d6d.net/dz60/common/back.gif
我认为 joey5491 上面那句是占不住脚的。

因为我曾实现过以 p = 2^96 - 2^32 + 1 = 79 228 162 514 264 337 589 248 983 041 为模的 NTT,
此时因为 p 足够大,就完全避免了用 CRT(中国剩余定理)凑结果了,只需 ...
 我明白了,去年这个时候,你那个 千分求汇编优化:UInt96x96To192(...) 就是为这个用的。

 另外,虽然使用太大的模不能提高速度,但是当变换长度较小时,使用较大的质数模减少变换次数还是可能的。
 假如,我们可以找到2个质数模,p1,p2, 使得p1xxp2~~10^19 
    那么,如果采用10^7进制,当被乘数和乘数长度小于10^5,则他们的线性卷积(被乘数和乘数的乘积)中的任一个数 均不超过p1*p2.因此我们仅仅可以使用2次变换,在应用CRT时,也只需要根据2个序列求最终结果了,虽然使用10^7进制,使得序列长度增加了,但由于减少了NTT变换次数,最终运行速度反而提高了。
但不知,能否找到这样的质数模?

gxqcn 发表于 2008-4-18 10:26:22

楼上说对了。:lol

虽说失败了,但仍有很大收获:SIMD汇编入门了。:)
页: 1 2 [3] 4
查看完整版本: 关于FNT乘法, 我想可能有点误会,想讨论的进来