- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
楼主 |
发表于 2008-5-6 17:02:42
|
显示全部楼层
九、数论变换在大数乘法里的应用
考虑两个$b$进制整数$u, v$
$u = u_mb^m + u_{m-1}b^{m-1} + ... + u_1b + u_0$
$v = v_nb^n + v_{m-1}b^{m-1} + ... + v_1b + v_0$
则称$u$为$m+1$位$b$进制数字,称$v$为$n+1$位$b$进制数字。
显然,$u, v$还可以表示成下列形式:
$u = \sum_{i=0}^{m} u_i b^i, \quad v = \sum_{i=0}^{n} v_i b^i$
那么$u, v$的乘积$y = uv$就可以表示成如下形式了:
$y = uv, \quad y = \sum_{k=0}^{m+n} y_k b^k, \quad y_k = \sum_{i=0}^{k} u_i*v_{k-i}$
其中$u_i = 0, (i > m) \quad v_i = 0 (i > n)$
$y_k$可能大于等于$b$,所以最后需要通过一个规格化过程来规范最后的结果。
显然,如果把$u, v, y$各位按照从最低位到最高位的排列看做一个序列的话,$y$就是$u, v$的一个卷积了。
就是说,大数乘法是可以通过卷积运算来进行的。
上面已经证明,不同长度的卷积是可以通过补零化为相同长度的卷积的,所以对于大数乘法,我们也只考虑相同长度(或者位数)的卷积算法。
容易证明,快速傅立叶变换(FFT)是可以用作大数乘法的,这里我们不做讨论。(某些特殊FFT算法甚至比NTT要有效率,但涉及浮点运算,所以整体下FFT不如NTT)
同样道理,我们也可以证明,NTT也具有做大数乘法卷积的能力,且只涉及整数运算,同样条件下,比FFT速度要快。
在NTT条件下,大数乘法卷积算法对$M, N, \alpha$是有一定限制的,在上面帖子里提到了如何选择$M, N, \alpha$,特别是如何保证最终结果正确且唯一,这里我们不再重复。
在大数乘法卷积意义下,因为参与运算的数均为非负数,我们需要修改下限定条件(如果还遵守先前的限定也可以,但可卷积的数字就受到更严格的限制)。
我们有如下大数乘法下卷积算法选择$M, N, \alpha$的一个限定条件
$N * (b-1)^2 < M$
另外,由于NTT是通过循环卷积来计算的,即高半序列均为0, 且通常实用的$N$为偶数
则条件可放宽为
$N // 2 * (b-1)^2 < M$
===============================================
说明下
大数乘法的进制$b$并不必须是当前的进制,就是说,你完全可以用很大的$b$值来划分数字以保证能充分的适合参数$M, N, \alpha$,一旦某些参数选择了大的$b$值,会导致中间过程的普通乘法出现大数运算,很可能导致中间结果的运算也符合NTT要求,即出现迭代的NTT算法,这也是可以的,而且对某些位数比较大的数字,使用两重甚至更多重NTT比单纯一重的NTT即能选择到合适的参数,也能提高运算的效率。 |
|